Branch data Line data Source code
1 : : /*! \file ssl/ssl_lib.c
2 : : * \brief Version independent SSL functions.
3 : : */
4 : : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5 : : * All rights reserved.
6 : : *
7 : : * This package is an SSL implementation written
8 : : * by Eric Young (eay@cryptsoft.com).
9 : : * The implementation was written so as to conform with Netscapes SSL.
10 : : *
11 : : * This library is free for commercial and non-commercial use as long as
12 : : * the following conditions are aheared to. The following conditions
13 : : * apply to all code found in this distribution, be it the RC4, RSA,
14 : : * lhash, DES, etc., code; not just the SSL code. The SSL documentation
15 : : * included with this distribution is covered by the same copyright terms
16 : : * except that the holder is Tim Hudson (tjh@cryptsoft.com).
17 : : *
18 : : * Copyright remains Eric Young's, and as such any Copyright notices in
19 : : * the code are not to be removed.
20 : : * If this package is used in a product, Eric Young should be given attribution
21 : : * as the author of the parts of the library used.
22 : : * This can be in the form of a textual message at program startup or
23 : : * in documentation (online or textual) provided with the package.
24 : : *
25 : : * Redistribution and use in source and binary forms, with or without
26 : : * modification, are permitted provided that the following conditions
27 : : * are met:
28 : : * 1. Redistributions of source code must retain the copyright
29 : : * notice, this list of conditions and the following disclaimer.
30 : : * 2. Redistributions in binary form must reproduce the above copyright
31 : : * notice, this list of conditions and the following disclaimer in the
32 : : * documentation and/or other materials provided with the distribution.
33 : : * 3. All advertising materials mentioning features or use of this software
34 : : * must display the following acknowledgement:
35 : : * "This product includes cryptographic software written by
36 : : * Eric Young (eay@cryptsoft.com)"
37 : : * The word 'cryptographic' can be left out if the rouines from the library
38 : : * being used are not cryptographic related :-).
39 : : * 4. If you include any Windows specific code (or a derivative thereof) from
40 : : * the apps directory (application code) you must include an acknowledgement:
41 : : * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
42 : : *
43 : : * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
44 : : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46 : : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
47 : : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48 : : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49 : : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 : : * SUCH DAMAGE.
54 : : *
55 : : * The licence and distribution terms for any publically available version or
56 : : * derivative of this code cannot be changed. i.e. this code cannot simply be
57 : : * copied and put under another distribution licence
58 : : * [including the GNU Public Licence.]
59 : : */
60 : : /* ====================================================================
61 : : * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
62 : : *
63 : : * Redistribution and use in source and binary forms, with or without
64 : : * modification, are permitted provided that the following conditions
65 : : * are met:
66 : : *
67 : : * 1. Redistributions of source code must retain the above copyright
68 : : * notice, this list of conditions and the following disclaimer.
69 : : *
70 : : * 2. Redistributions in binary form must reproduce the above copyright
71 : : * notice, this list of conditions and the following disclaimer in
72 : : * the documentation and/or other materials provided with the
73 : : * distribution.
74 : : *
75 : : * 3. All advertising materials mentioning features or use of this
76 : : * software must display the following acknowledgment:
77 : : * "This product includes software developed by the OpenSSL Project
78 : : * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
79 : : *
80 : : * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
81 : : * endorse or promote products derived from this software without
82 : : * prior written permission. For written permission, please contact
83 : : * openssl-core@openssl.org.
84 : : *
85 : : * 5. Products derived from this software may not be called "OpenSSL"
86 : : * nor may "OpenSSL" appear in their names without prior written
87 : : * permission of the OpenSSL Project.
88 : : *
89 : : * 6. Redistributions of any form whatsoever must retain the following
90 : : * acknowledgment:
91 : : * "This product includes software developed by the OpenSSL Project
92 : : * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
93 : : *
94 : : * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
95 : : * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
96 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
97 : : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
98 : : * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
99 : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
100 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
101 : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
102 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
103 : : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
104 : : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
105 : : * OF THE POSSIBILITY OF SUCH DAMAGE.
106 : : * ====================================================================
107 : : *
108 : : * This product includes cryptographic software written by Eric Young
109 : : * (eay@cryptsoft.com). This product includes software written by Tim
110 : : * Hudson (tjh@cryptsoft.com).
111 : : *
112 : : */
113 : : /* ====================================================================
114 : : * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
115 : : * ECC cipher suite support in OpenSSL originally developed by
116 : : * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
117 : : */
118 : : /* ====================================================================
119 : : * Copyright 2005 Nokia. All rights reserved.
120 : : *
121 : : * The portions of the attached software ("Contribution") is developed by
122 : : * Nokia Corporation and is licensed pursuant to the OpenSSL open source
123 : : * license.
124 : : *
125 : : * The Contribution, originally written by Mika Kousa and Pasi Eronen of
126 : : * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
127 : : * support (see RFC 4279) to OpenSSL.
128 : : *
129 : : * No patent licenses or other rights except those expressly stated in
130 : : * the OpenSSL open source license shall be deemed granted or received
131 : : * expressly, by implication, estoppel, or otherwise.
132 : : *
133 : : * No assurances are provided by Nokia that the Contribution does not
134 : : * infringe the patent or other intellectual property rights of any third
135 : : * party or that the license provides you with all the necessary rights
136 : : * to make use of the Contribution.
137 : : *
138 : : * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
139 : : * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
140 : : * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
141 : : * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
142 : : * OTHERWISE.
143 : : */
144 : :
145 : : #ifdef REF_CHECK
146 : : # include <assert.h>
147 : : #endif
148 : : #include <stdio.h>
149 : : #include "ssl_locl.h"
150 : : #include "kssl_lcl.h"
151 : : #include <openssl/objects.h>
152 : : #include <openssl/lhash.h>
153 : : #include <openssl/x509v3.h>
154 : : #include <openssl/rand.h>
155 : : #include <openssl/ocsp.h>
156 : : #ifndef OPENSSL_NO_DH
157 : : #include <openssl/dh.h>
158 : : #endif
159 : : #ifndef OPENSSL_NO_ENGINE
160 : : #include <openssl/engine.h>
161 : : #endif
162 : :
163 : : const char *SSL_version_str=OPENSSL_VERSION_TEXT;
164 : :
165 : : SSL3_ENC_METHOD ssl3_undef_enc_method={
166 : : /* evil casts, but these functions are only called if there's a library bug */
167 : : (int (*)(SSL *,int))ssl_undefined_function,
168 : : (int (*)(SSL *, unsigned char *, int))ssl_undefined_function,
169 : : ssl_undefined_function,
170 : : (int (*)(SSL *, unsigned char *, unsigned char *, int))ssl_undefined_function,
171 : : (int (*)(SSL*, int))ssl_undefined_function,
172 : : (int (*)(SSL *, const char*, int, unsigned char *))ssl_undefined_function,
173 : : 0, /* finish_mac_length */
174 : : (int (*)(SSL *, int, unsigned char *))ssl_undefined_function,
175 : : NULL, /* client_finished_label */
176 : : 0, /* client_finished_label_len */
177 : : NULL, /* server_finished_label */
178 : : 0, /* server_finished_label_len */
179 : : (int (*)(int))ssl_undefined_function,
180 : : (int (*)(SSL *, unsigned char *, size_t, const char *,
181 : : size_t, const unsigned char *, size_t,
182 : : int use_context)) ssl_undefined_function,
183 : : };
184 : :
185 : 4232 : int SSL_clear(SSL *s)
186 : : {
187 : :
188 [ - + ]: 4232 : if (s->method == NULL)
189 : : {
190 : 0 : SSLerr(SSL_F_SSL_CLEAR,SSL_R_NO_METHOD_SPECIFIED);
191 : 0 : return(0);
192 : : }
193 : :
194 [ - + ]: 4232 : if (ssl_clear_bad_session(s))
195 : : {
196 : 0 : SSL_SESSION_free(s->session);
197 : 0 : s->session=NULL;
198 : : }
199 : :
200 : 4232 : s->error=0;
201 : 4232 : s->hit=0;
202 : 4232 : s->shutdown=0;
203 : :
204 : : #if 0 /* Disabled since version 1.10 of this file (early return not
205 : : * needed because SSL_clear is not called when doing renegotiation) */
206 : : /* This is set if we are doing dynamic renegotiation so keep
207 : : * the old cipher. It is sort of a SSL_clear_lite :-) */
208 : : if (s->renegotiate) return(1);
209 : : #else
210 [ - + ]: 4232 : if (s->renegotiate)
211 : : {
212 : 0 : SSLerr(SSL_F_SSL_CLEAR,ERR_R_INTERNAL_ERROR);
213 : 0 : return 0;
214 : : }
215 : : #endif
216 : :
217 : 4232 : s->type=0;
218 : :
219 [ + + ]: 4232 : s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT);
220 : :
221 : 4232 : s->version=s->method->version;
222 : 4232 : s->client_version=s->version;
223 : 4232 : s->rwstate=SSL_NOTHING;
224 : 4232 : s->rstate=SSL_ST_READ_HEADER;
225 : : #if 0
226 : : s->read_ahead=s->ctx->read_ahead;
227 : : #endif
228 : :
229 [ - + ]: 4232 : if (s->init_buf != NULL)
230 : : {
231 : 0 : BUF_MEM_free(s->init_buf);
232 : 0 : s->init_buf=NULL;
233 : : }
234 : :
235 : 4232 : ssl_clear_cipher_ctx(s);
236 : 4232 : ssl_clear_hash_ctx(&s->read_hash);
237 : 4232 : ssl_clear_hash_ctx(&s->write_hash);
238 : :
239 : 4232 : s->first_packet=0;
240 : :
241 : : #if 1
242 : : /* Check to see if we were changed into a different method, if
243 : : * so, revert back if we are not doing session-id reuse. */
244 [ + + ][ + - ]: 4232 : if (!s->in_handshake && (s->session == NULL) && (s->method != s->ctx->method))
[ - + ]
245 : : {
246 : 0 : s->method->ssl_free(s);
247 : 0 : s->method=s->ctx->method;
248 [ # # ]: 0 : if (!s->method->ssl_new(s))
249 : : return(0);
250 : : }
251 : : else
252 : : #endif
253 : 4232 : s->method->ssl_clear(s);
254 : : return(1);
255 : : }
256 : :
257 : : /** Used to change an SSL_CTXs default SSL method type */
258 : 0 : int SSL_CTX_set_ssl_version(SSL_CTX *ctx,const SSL_METHOD *meth)
259 : : {
260 : : STACK_OF(SSL_CIPHER) *sk;
261 : :
262 : 0 : ctx->method=meth;
263 : :
264 [ # # ]: 0 : sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list),
265 : : &(ctx->cipher_list_by_id),
266 : 0 : meth->version == SSL2_VERSION ? "SSLv2" : SSL_DEFAULT_CIPHER_LIST, ctx->cert);
267 [ # # ][ # # ]: 0 : if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0))
268 : : {
269 : 0 : SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
270 : 0 : return(0);
271 : : }
272 : : return(1);
273 : : }
274 : :
275 : 1808 : SSL *SSL_new(SSL_CTX *ctx)
276 : : {
277 : : SSL *s;
278 : :
279 [ - + ]: 1808 : if (ctx == NULL)
280 : : {
281 : 0 : SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX);
282 : 0 : return(NULL);
283 : : }
284 [ - + ]: 1808 : if (ctx->method == NULL)
285 : : {
286 : 0 : SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION);
287 : 0 : return(NULL);
288 : : }
289 : :
290 : 1808 : s=(SSL *)OPENSSL_malloc(sizeof(SSL));
291 [ + - ]: 1808 : if (s == NULL) goto err;
292 : : memset(s,0,sizeof(SSL));
293 : :
294 : : #ifndef OPENSSL_NO_KRB5
295 : : s->kssl_ctx = kssl_ctx_new();
296 : : #endif /* OPENSSL_NO_KRB5 */
297 : :
298 : 1808 : s->options=ctx->options;
299 : 1808 : s->mode=ctx->mode;
300 : 1808 : s->max_cert_list=ctx->max_cert_list;
301 : :
302 [ + - ]: 1808 : if (ctx->cert != NULL)
303 : : {
304 : : /* Earlier library versions used to copy the pointer to
305 : : * the CERT, not its contents; only when setting new
306 : : * parameters for the per-SSL copy, ssl_cert_new would be
307 : : * called (and the direct reference to the per-SSL_CTX
308 : : * settings would be lost, but those still were indirectly
309 : : * accessed for various purposes, and for that reason they
310 : : * used to be known as s->ctx->default_cert).
311 : : * Now we don't look at the SSL_CTX's CERT after having
312 : : * duplicated it once. */
313 : :
314 : 1808 : s->cert = ssl_cert_dup(ctx->cert);
315 [ + - ]: 1808 : if (s->cert == NULL)
316 : : goto err;
317 : : }
318 : : else
319 : 0 : s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
320 : :
321 : 1808 : s->read_ahead=ctx->read_ahead;
322 : 1808 : s->msg_callback=ctx->msg_callback;
323 : 1808 : s->msg_callback_arg=ctx->msg_callback_arg;
324 : 1808 : s->verify_mode=ctx->verify_mode;
325 : 1808 : s->not_resumable_session_cb=ctx->not_resumable_session_cb;
326 : : #if 0
327 : : s->verify_depth=ctx->verify_depth;
328 : : #endif
329 : 1808 : s->sid_ctx_length=ctx->sid_ctx_length;
330 [ - + ]: 1808 : OPENSSL_assert(s->sid_ctx_length <= sizeof s->sid_ctx);
331 : 1808 : memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
332 : 1808 : s->verify_callback=ctx->default_verify_callback;
333 : 1808 : s->generate_session_id=ctx->generate_session_id;
334 : :
335 : 1808 : s->param = X509_VERIFY_PARAM_new();
336 [ + - ]: 1808 : if (!s->param)
337 : : goto err;
338 : 1808 : X509_VERIFY_PARAM_inherit(s->param, ctx->param);
339 : : #if 0
340 : : s->purpose = ctx->purpose;
341 : : s->trust = ctx->trust;
342 : : #endif
343 : 1808 : s->quiet_shutdown=ctx->quiet_shutdown;
344 : 1808 : s->max_send_fragment = ctx->max_send_fragment;
345 : :
346 : 1808 : CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
347 : 1808 : s->ctx=ctx;
348 : : #ifndef OPENSSL_NO_TLSEXT
349 : 1808 : s->tlsext_debug_cb = 0;
350 : 1808 : s->tlsext_debug_arg = NULL;
351 : 1808 : s->tlsext_ticket_expected = 0;
352 : 1808 : s->tlsext_status_type = -1;
353 : 1808 : s->tlsext_status_expected = 0;
354 : 1808 : s->tlsext_ocsp_ids = NULL;
355 : 1808 : s->tlsext_ocsp_exts = NULL;
356 : 1808 : s->tlsext_ocsp_resp = NULL;
357 : 1808 : s->tlsext_ocsp_resplen = -1;
358 : 1808 : CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
359 : 1808 : s->initial_ctx=ctx;
360 : : #ifndef OPENSSL_NO_EC
361 [ - + ]: 1808 : if (ctx->tlsext_ecpointformatlist)
362 : : {
363 : 0 : s->tlsext_ecpointformatlist =
364 : 0 : BUF_memdup(ctx->tlsext_ecpointformatlist,
365 : : ctx->tlsext_ecpointformatlist_length);
366 [ # # ]: 0 : if (!s->tlsext_ecpointformatlist)
367 : : goto err;
368 : 0 : s->tlsext_ecpointformatlist_length =
369 : 0 : ctx->tlsext_ecpointformatlist_length;
370 : : }
371 [ - + ]: 1808 : if (ctx->tlsext_ellipticcurvelist)
372 : : {
373 : 0 : s->tlsext_ellipticcurvelist =
374 : 0 : BUF_memdup(ctx->tlsext_ellipticcurvelist,
375 : : ctx->tlsext_ellipticcurvelist_length);
376 [ # # ]: 0 : if (!s->tlsext_ellipticcurvelist)
377 : : goto err;
378 : 0 : s->tlsext_ellipticcurvelist_length =
379 : 0 : ctx->tlsext_ellipticcurvelist_length;
380 : : }
381 : : #endif
382 : : # ifndef OPENSSL_NO_NEXTPROTONEG
383 : 1808 : s->next_proto_negotiated = NULL;
384 : : # endif
385 : :
386 [ + + ]: 1808 : if (s->ctx->alpn_client_proto_list)
387 : : {
388 : 88 : s->alpn_client_proto_list =
389 : 88 : OPENSSL_malloc(s->ctx->alpn_client_proto_list_len);
390 [ + - ]: 88 : if (s->alpn_client_proto_list == NULL)
391 : : goto err;
392 : 88 : memcpy(s->alpn_client_proto_list, s->ctx->alpn_client_proto_list,
393 : 88 : s->ctx->alpn_client_proto_list_len);
394 : 88 : s->alpn_client_proto_list_len = s->ctx->alpn_client_proto_list_len;
395 : : }
396 : : #endif
397 : :
398 : 1808 : s->verify_result=X509_V_OK;
399 : :
400 : 1808 : s->method=ctx->method;
401 : :
402 [ + - ]: 1808 : if (!s->method->ssl_new(s))
403 : : goto err;
404 : :
405 : 1808 : s->references=1;
406 : 1808 : s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
407 : :
408 : 1808 : SSL_clear(s);
409 : :
410 : 1808 : CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
411 : :
412 : : #ifndef OPENSSL_NO_PSK
413 : 1808 : s->psk_client_callback=ctx->psk_client_callback;
414 : 1808 : s->psk_server_callback=ctx->psk_server_callback;
415 : : #endif
416 : :
417 : 1808 : return(s);
418 : : err:
419 [ # # ]: 0 : if (s != NULL)
420 : : {
421 [ # # ]: 0 : if (s->cert != NULL)
422 : 0 : ssl_cert_free(s->cert);
423 [ # # ]: 0 : if (s->ctx != NULL)
424 : 0 : SSL_CTX_free(s->ctx); /* decrement reference count */
425 : 0 : OPENSSL_free(s);
426 : : }
427 : 0 : SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
428 : 0 : return(NULL);
429 : : }
430 : :
431 : 893 : int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
432 : : unsigned int sid_ctx_len)
433 : : {
434 [ - + ]: 893 : if(sid_ctx_len > sizeof ctx->sid_ctx)
435 : : {
436 : 0 : SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
437 : 0 : return 0;
438 : : }
439 : 893 : ctx->sid_ctx_length=sid_ctx_len;
440 : 893 : memcpy(ctx->sid_ctx,sid_ctx,sid_ctx_len);
441 : :
442 : 893 : return 1;
443 : : }
444 : :
445 : 0 : int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
446 : : unsigned int sid_ctx_len)
447 : : {
448 [ # # ]: 0 : if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
449 : : {
450 : 0 : SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
451 : 0 : return 0;
452 : : }
453 : 0 : ssl->sid_ctx_length=sid_ctx_len;
454 : 0 : memcpy(ssl->sid_ctx,sid_ctx,sid_ctx_len);
455 : :
456 : 0 : return 1;
457 : : }
458 : :
459 : 0 : int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb)
460 : : {
461 : 0 : CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
462 : 0 : ctx->generate_session_id = cb;
463 : 0 : CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
464 : 0 : return 1;
465 : : }
466 : :
467 : 0 : int SSL_set_generate_session_id(SSL *ssl, GEN_SESSION_CB cb)
468 : : {
469 : 0 : CRYPTO_w_lock(CRYPTO_LOCK_SSL);
470 : 0 : ssl->generate_session_id = cb;
471 : 0 : CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
472 : 0 : return 1;
473 : : }
474 : :
475 : 770 : int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
476 : : unsigned int id_len)
477 : : {
478 : : /* A quick examination of SSL_SESSION_hash and SSL_SESSION_cmp shows how
479 : : * we can "construct" a session to give us the desired check - ie. to
480 : : * find if there's a session in the hash table that would conflict with
481 : : * any new session built out of this id/id_len and the ssl_version in
482 : : * use by this SSL. */
483 : : SSL_SESSION r, *p;
484 : :
485 [ + - ]: 770 : if(id_len > sizeof r.session_id)
486 : : return 0;
487 : :
488 : 770 : r.ssl_version = ssl->version;
489 : 770 : r.session_id_length = id_len;
490 : 770 : memcpy(r.session_id, id, id_len);
491 : : /* NB: SSLv2 always uses a fixed 16-byte session ID, so even if a
492 : : * callback is calling us to check the uniqueness of a shorter ID, it
493 : : * must be compared as a padded-out ID because that is what it will be
494 : : * converted to when the callback has finished choosing it. */
495 [ + + ][ - + ]: 770 : if((r.ssl_version == SSL2_VERSION) &&
496 : : (id_len < SSL2_SSL_SESSION_ID_LENGTH))
497 : : {
498 : 0 : memset(r.session_id + id_len, 0,
499 : 0 : SSL2_SSL_SESSION_ID_LENGTH - id_len);
500 : 0 : r.session_id_length = SSL2_SSL_SESSION_ID_LENGTH;
501 : : }
502 : :
503 : 770 : CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
504 : 770 : p = lh_SSL_SESSION_retrieve(ssl->ctx->sessions, &r);
505 : 770 : CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
506 : 770 : return (p != NULL);
507 : : }
508 : :
509 : 0 : int SSL_CTX_set_purpose(SSL_CTX *s, int purpose)
510 : : {
511 : 0 : return X509_VERIFY_PARAM_set_purpose(s->param, purpose);
512 : : }
513 : :
514 : 0 : int SSL_set_purpose(SSL *s, int purpose)
515 : : {
516 : 0 : return X509_VERIFY_PARAM_set_purpose(s->param, purpose);
517 : : }
518 : :
519 : 0 : int SSL_CTX_set_trust(SSL_CTX *s, int trust)
520 : : {
521 : 0 : return X509_VERIFY_PARAM_set_trust(s->param, trust);
522 : : }
523 : :
524 : 0 : int SSL_set_trust(SSL *s, int trust)
525 : : {
526 : 0 : return X509_VERIFY_PARAM_set_trust(s->param, trust);
527 : : }
528 : :
529 : 0 : int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm)
530 : : {
531 : 0 : return X509_VERIFY_PARAM_set1(ctx->param, vpm);
532 : : }
533 : :
534 : 0 : int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm)
535 : : {
536 : 0 : return X509_VERIFY_PARAM_set1(ssl->param, vpm);
537 : : }
538 : :
539 : 0 : X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx)
540 : : {
541 : 0 : return ctx->param;
542 : : }
543 : :
544 : 0 : X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl)
545 : : {
546 : 0 : return ssl->param;
547 : : }
548 : :
549 : 0 : void SSL_certs_clear(SSL *s)
550 : : {
551 : 0 : ssl_cert_clear_certs(s->cert);
552 : 0 : }
553 : :
554 : 1808 : void SSL_free(SSL *s)
555 : : {
556 : : int i;
557 : :
558 [ + - ]: 1808 : if(s == NULL)
559 : : return;
560 : :
561 : 1808 : i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL);
562 : : #ifdef REF_PRINT
563 : : REF_PRINT("SSL",s);
564 : : #endif
565 [ + - ]: 1808 : if (i > 0) return;
566 : : #ifdef REF_CHECK
567 : : if (i < 0)
568 : : {
569 : : fprintf(stderr,"SSL_free, bad reference count\n");
570 : : abort(); /* ok */
571 : : }
572 : : #endif
573 : :
574 [ + - ]: 1808 : if (s->param)
575 : 1808 : X509_VERIFY_PARAM_free(s->param);
576 : :
577 : 1808 : CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
578 : :
579 [ - + ]: 1808 : if (s->bbio != NULL)
580 : : {
581 : : /* If the buffering BIO is in place, pop it off */
582 [ # # ]: 0 : if (s->bbio == s->wbio)
583 : : {
584 : 0 : s->wbio=BIO_pop(s->wbio);
585 : : }
586 : 0 : BIO_free(s->bbio);
587 : 0 : s->bbio=NULL;
588 : : }
589 [ + + ]: 1808 : if (s->rbio != NULL)
590 : 880 : BIO_free_all(s->rbio);
591 [ + + ][ - + ]: 1808 : if ((s->wbio != NULL) && (s->wbio != s->rbio))
592 : 0 : BIO_free_all(s->wbio);
593 : :
594 [ + + ]: 1808 : if (s->init_buf != NULL) BUF_MEM_free(s->init_buf);
595 : :
596 : : /* add extra stuff */
597 [ - + ]: 1808 : if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list);
598 [ - + ]: 1808 : if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id);
599 : :
600 : : /* Make the next call work :-) */
601 [ + + ]: 1808 : if (s->session != NULL)
602 : : {
603 : 1786 : ssl_clear_bad_session(s);
604 : 1786 : SSL_SESSION_free(s->session);
605 : : }
606 : :
607 : 1808 : ssl_clear_cipher_ctx(s);
608 : 1808 : ssl_clear_hash_ctx(&s->read_hash);
609 : 1808 : ssl_clear_hash_ctx(&s->write_hash);
610 : :
611 [ + - ]: 1808 : if (s->cert != NULL) ssl_cert_free(s->cert);
612 : : /* Free up if allocated */
613 : :
614 : : #ifndef OPENSSL_NO_TLSEXT
615 [ - + ]: 1808 : if (s->tlsext_hostname)
616 : 0 : OPENSSL_free(s->tlsext_hostname);
617 [ + - ]: 1808 : if (s->initial_ctx) SSL_CTX_free(s->initial_ctx);
618 : : #ifndef OPENSSL_NO_EC
619 [ - + ]: 1808 : if (s->tlsext_ecpointformatlist) OPENSSL_free(s->tlsext_ecpointformatlist);
620 [ - + ]: 1808 : if (s->tlsext_ellipticcurvelist) OPENSSL_free(s->tlsext_ellipticcurvelist);
621 : : #endif /* OPENSSL_NO_EC */
622 [ - + ]: 1808 : if (s->tlsext_opaque_prf_input) OPENSSL_free(s->tlsext_opaque_prf_input);
623 [ - + ]: 1808 : if (s->tlsext_ocsp_exts)
624 : 0 : sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
625 : : X509_EXTENSION_free);
626 [ - + ]: 1808 : if (s->tlsext_ocsp_ids)
627 : 0 : sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free);
628 [ - + ]: 1808 : if (s->tlsext_ocsp_resp)
629 : 0 : OPENSSL_free(s->tlsext_ocsp_resp);
630 [ + + ]: 1808 : if (s->alpn_client_proto_list)
631 : 88 : OPENSSL_free(s->alpn_client_proto_list);
632 : : #endif
633 : :
634 [ - + ]: 1808 : if (s->client_CA != NULL)
635 : 0 : sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free);
636 : :
637 [ + - ]: 1808 : if (s->method != NULL) s->method->ssl_free(s);
638 : :
639 [ + - ]: 1808 : if (s->ctx) SSL_CTX_free(s->ctx);
640 : :
641 : : #ifndef OPENSSL_NO_KRB5
642 : : if (s->kssl_ctx != NULL)
643 : : kssl_ctx_free(s->kssl_ctx);
644 : : #endif /* OPENSSL_NO_KRB5 */
645 : :
646 : : #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
647 [ + + ]: 1808 : if (s->next_proto_negotiated)
648 : 66 : OPENSSL_free(s->next_proto_negotiated);
649 : : #endif
650 : :
651 [ - + ]: 1808 : if (s->srtp_profiles)
652 : 0 : sk_SRTP_PROTECTION_PROFILE_free(s->srtp_profiles);
653 : :
654 : 1808 : OPENSSL_free(s);
655 : : }
656 : :
657 : 2424 : void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
658 : : {
659 : : /* If the output buffering BIO is still in place, remove it
660 : : */
661 [ - + ]: 2424 : if (s->bbio != NULL)
662 : : {
663 [ # # ]: 0 : if (s->wbio == s->bbio)
664 : : {
665 : 0 : s->wbio=s->wbio->next_bio;
666 : 0 : s->bbio->next_bio=NULL;
667 : : }
668 : : }
669 [ + + ][ + - ]: 2424 : if ((s->rbio != NULL) && (s->rbio != rbio))
670 : 638 : BIO_free_all(s->rbio);
671 [ + + ][ + - ]: 2424 : if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
[ - + ]
672 : 0 : BIO_free_all(s->wbio);
673 : 2424 : s->rbio=rbio;
674 : 2424 : s->wbio=wbio;
675 : 2424 : }
676 : :
677 : 70813 : BIO *SSL_get_rbio(const SSL *s)
678 : 70813 : { return(s->rbio); }
679 : :
680 : 18472 : BIO *SSL_get_wbio(const SSL *s)
681 : 18472 : { return(s->wbio); }
682 : :
683 : 0 : int SSL_get_fd(const SSL *s)
684 : : {
685 : 0 : return(SSL_get_rfd(s));
686 : : }
687 : :
688 : 0 : int SSL_get_rfd(const SSL *s)
689 : : {
690 : 0 : int ret= -1;
691 : : BIO *b,*r;
692 : :
693 : 0 : b=SSL_get_rbio(s);
694 : 0 : r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
695 [ # # ]: 0 : if (r != NULL)
696 : 0 : BIO_get_fd(r,&ret);
697 : 0 : return(ret);
698 : : }
699 : :
700 : 0 : int SSL_get_wfd(const SSL *s)
701 : : {
702 : 0 : int ret= -1;
703 : : BIO *b,*r;
704 : :
705 : 0 : b=SSL_get_wbio(s);
706 : 0 : r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
707 [ # # ]: 0 : if (r != NULL)
708 : 0 : BIO_get_fd(r,&ret);
709 : 0 : return(ret);
710 : : }
711 : :
712 : : #ifndef OPENSSL_NO_SOCK
713 : 0 : int SSL_set_fd(SSL *s,int fd)
714 : : {
715 : 0 : int ret=0;
716 : 0 : BIO *bio=NULL;
717 : :
718 : 0 : bio=BIO_new(BIO_s_socket());
719 : :
720 [ # # ]: 0 : if (bio == NULL)
721 : : {
722 : 0 : SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
723 : 0 : goto err;
724 : : }
725 : 0 : BIO_set_fd(bio,fd,BIO_NOCLOSE);
726 : 0 : SSL_set_bio(s,bio,bio);
727 : 0 : ret=1;
728 : : err:
729 : 0 : return(ret);
730 : : }
731 : :
732 : 0 : int SSL_set_wfd(SSL *s,int fd)
733 : : {
734 : 0 : int ret=0;
735 : 0 : BIO *bio=NULL;
736 : :
737 [ # # ][ # # ]: 0 : if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET)
738 [ # # ]: 0 : || ((int)BIO_get_fd(s->rbio,NULL) != fd))
739 : : {
740 : 0 : bio=BIO_new(BIO_s_socket());
741 : :
742 [ # # ]: 0 : if (bio == NULL)
743 : 0 : { SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; }
744 : 0 : BIO_set_fd(bio,fd,BIO_NOCLOSE);
745 : 0 : SSL_set_bio(s,SSL_get_rbio(s),bio);
746 : : }
747 : : else
748 : 0 : SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s));
749 : : ret=1;
750 : : err:
751 : 0 : return(ret);
752 : : }
753 : :
754 : 0 : int SSL_set_rfd(SSL *s,int fd)
755 : : {
756 : 0 : int ret=0;
757 : 0 : BIO *bio=NULL;
758 : :
759 [ # # ][ # # ]: 0 : if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET)
760 [ # # ]: 0 : || ((int)BIO_get_fd(s->wbio,NULL) != fd))
761 : : {
762 : 0 : bio=BIO_new(BIO_s_socket());
763 : :
764 [ # # ]: 0 : if (bio == NULL)
765 : : {
766 : 0 : SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB);
767 : 0 : goto err;
768 : : }
769 : 0 : BIO_set_fd(bio,fd,BIO_NOCLOSE);
770 : 0 : SSL_set_bio(s,bio,SSL_get_wbio(s));
771 : : }
772 : : else
773 : 0 : SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s));
774 : : ret=1;
775 : : err:
776 : 0 : return(ret);
777 : : }
778 : : #endif
779 : :
780 : :
781 : : /* return length of latest Finished message we sent, copy to 'buf' */
782 : 0 : size_t SSL_get_finished(const SSL *s, void *buf, size_t count)
783 : : {
784 : 0 : size_t ret = 0;
785 : :
786 [ # # ]: 0 : if (s->s3 != NULL)
787 : : {
788 : 0 : ret = s->s3->tmp.finish_md_len;
789 [ # # ]: 0 : if (count > ret)
790 : 0 : count = ret;
791 : 0 : memcpy(buf, s->s3->tmp.finish_md, count);
792 : : }
793 : 0 : return ret;
794 : : }
795 : :
796 : : /* return length of latest Finished message we expected, copy to 'buf' */
797 : 0 : size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count)
798 : : {
799 : 0 : size_t ret = 0;
800 : :
801 [ # # ]: 0 : if (s->s3 != NULL)
802 : : {
803 : 0 : ret = s->s3->tmp.peer_finish_md_len;
804 [ # # ]: 0 : if (count > ret)
805 : 0 : count = ret;
806 : 0 : memcpy(buf, s->s3->tmp.peer_finish_md, count);
807 : : }
808 : 0 : return ret;
809 : : }
810 : :
811 : :
812 : 0 : int SSL_get_verify_mode(const SSL *s)
813 : : {
814 : 0 : return(s->verify_mode);
815 : : }
816 : :
817 : 0 : int SSL_get_verify_depth(const SSL *s)
818 : : {
819 : 0 : return X509_VERIFY_PARAM_get_depth(s->param);
820 : : }
821 : :
822 : 0 : int (*SSL_get_verify_callback(const SSL *s))(int,X509_STORE_CTX *)
823 : : {
824 : 0 : return(s->verify_callback);
825 : : }
826 : :
827 : 0 : int SSL_CTX_get_verify_mode(const SSL_CTX *ctx)
828 : : {
829 : 0 : return(ctx->verify_mode);
830 : : }
831 : :
832 : 0 : int SSL_CTX_get_verify_depth(const SSL_CTX *ctx)
833 : : {
834 : 0 : return X509_VERIFY_PARAM_get_depth(ctx->param);
835 : : }
836 : :
837 : 0 : int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int,X509_STORE_CTX *)
838 : : {
839 : 0 : return(ctx->default_verify_callback);
840 : : }
841 : :
842 : 0 : void SSL_set_verify(SSL *s,int mode,
843 : : int (*callback)(int ok,X509_STORE_CTX *ctx))
844 : : {
845 : 0 : s->verify_mode=mode;
846 [ # # ]: 0 : if (callback != NULL)
847 : 0 : s->verify_callback=callback;
848 : 0 : }
849 : :
850 : 0 : void SSL_set_verify_depth(SSL *s,int depth)
851 : : {
852 : 0 : X509_VERIFY_PARAM_set_depth(s->param, depth);
853 : 0 : }
854 : :
855 : 0 : void SSL_set_read_ahead(SSL *s,int yes)
856 : : {
857 : 0 : s->read_ahead=yes;
858 : 0 : }
859 : :
860 : 0 : int SSL_get_read_ahead(const SSL *s)
861 : : {
862 : 0 : return(s->read_ahead);
863 : : }
864 : :
865 : 24692 : int SSL_pending(const SSL *s)
866 : : {
867 : : /* SSL_pending cannot work properly if read-ahead is enabled
868 : : * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)),
869 : : * and it is impossible to fix since SSL_pending cannot report
870 : : * errors that may be observed while scanning the new data.
871 : : * (Note that SSL_pending() is often used as a boolean value,
872 : : * so we'd better not return -1.)
873 : : */
874 : 24692 : return(s->method->ssl_pending(s));
875 : : }
876 : :
877 : 1190 : X509 *SSL_get_peer_certificate(const SSL *s)
878 : : {
879 : : X509 *r;
880 : :
881 [ + - ][ + - ]: 1190 : if ((s == NULL) || (s->session == NULL))
882 : : r=NULL;
883 : : else
884 : 1190 : r=s->session->peer;
885 : :
886 [ + + ]: 1190 : if (r == NULL) return(r);
887 : :
888 : 1036 : CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509);
889 : :
890 : 1036 : return(r);
891 : : }
892 : :
893 : 0 : STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s)
894 : : {
895 : : STACK_OF(X509) *r;
896 : :
897 [ # # ][ # # ]: 0 : if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))
[ # # ]
898 : : r=NULL;
899 : : else
900 : 0 : r=s->session->sess_cert->cert_chain;
901 : :
902 : : /* If we are a client, cert_chain includes the peer's own
903 : : * certificate; if we are a server, it does not. */
904 : :
905 : 0 : return(r);
906 : : }
907 : :
908 : : /* Now in theory, since the calling process own 't' it should be safe to
909 : : * modify. We need to be able to read f without being hassled */
910 : 0 : void SSL_copy_session_id(SSL *t,const SSL *f)
911 : : {
912 : : CERT *tmp;
913 : :
914 : : /* Do we need to to SSL locking? */
915 : 0 : SSL_set_session(t,SSL_get_session(f));
916 : :
917 : : /* what if we are setup as SSLv2 but want to talk SSLv3 or
918 : : * vice-versa */
919 [ # # ]: 0 : if (t->method != f->method)
920 : : {
921 : 0 : t->method->ssl_free(t); /* cleanup current */
922 : 0 : t->method=f->method; /* change method */
923 : 0 : t->method->ssl_new(t); /* setup new */
924 : : }
925 : :
926 : 0 : tmp=t->cert;
927 [ # # ]: 0 : if (f->cert != NULL)
928 : : {
929 : 0 : CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT);
930 : 0 : t->cert=f->cert;
931 : : }
932 : : else
933 : 0 : t->cert=NULL;
934 [ # # ]: 0 : if (tmp != NULL) ssl_cert_free(tmp);
935 : 0 : SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);
936 : 0 : }
937 : :
938 : : /* Fix this so it checks all the valid key/cert options */
939 : 0 : int SSL_CTX_check_private_key(const SSL_CTX *ctx)
940 : : {
941 [ # # ][ # # ]: 0 : if ( (ctx == NULL) ||
942 [ # # ]: 0 : (ctx->cert == NULL) ||
943 : 0 : (ctx->cert->key->x509 == NULL))
944 : : {
945 : 0 : SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
946 : 0 : return(0);
947 : : }
948 [ # # ]: 0 : if (ctx->cert->key->privatekey == NULL)
949 : : {
950 : 0 : SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
951 : 0 : return(0);
952 : : }
953 : 0 : return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
954 : : }
955 : :
956 : : /* Fix this function so that it takes an optional type parameter */
957 : 0 : int SSL_check_private_key(const SSL *ssl)
958 : : {
959 [ # # ]: 0 : if (ssl == NULL)
960 : : {
961 : 0 : SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER);
962 : 0 : return(0);
963 : : }
964 [ # # ]: 0 : if (ssl->cert == NULL)
965 : : {
966 : 0 : SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
967 : 0 : return 0;
968 : : }
969 [ # # ]: 0 : if (ssl->cert->key->x509 == NULL)
970 : : {
971 : 0 : SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
972 : 0 : return(0);
973 : : }
974 [ # # ]: 0 : if (ssl->cert->key->privatekey == NULL)
975 : : {
976 : 0 : SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
977 : 0 : return(0);
978 : : }
979 : 0 : return(X509_check_private_key(ssl->cert->key->x509,
980 : : ssl->cert->key->privatekey));
981 : : }
982 : :
983 : 200 : int SSL_accept(SSL *s)
984 : : {
985 [ - + ]: 200 : if (s->handshake_func == 0)
986 : : /* Not properly initialized yet */
987 : 0 : SSL_set_accept_state(s);
988 : :
989 : 200 : return(s->method->ssl_accept(s));
990 : : }
991 : :
992 : 200 : int SSL_connect(SSL *s)
993 : : {
994 [ - + ]: 200 : if (s->handshake_func == 0)
995 : : /* Not properly initialized yet */
996 : 0 : SSL_set_connect_state(s);
997 : :
998 : 200 : return(s->method->ssl_connect(s));
999 : : }
1000 : :
1001 : 0 : long SSL_get_default_timeout(const SSL *s)
1002 : : {
1003 : 0 : return(s->method->get_timeout());
1004 : : }
1005 : :
1006 : 55738 : int SSL_read(SSL *s,void *buf,int num)
1007 : : {
1008 [ - + ]: 55738 : if (s->handshake_func == 0)
1009 : : {
1010 : 0 : SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
1011 : 0 : return -1;
1012 : : }
1013 : :
1014 [ - + ]: 55738 : if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
1015 : : {
1016 : 0 : s->rwstate=SSL_NOTHING;
1017 : 0 : return(0);
1018 : : }
1019 : 55738 : return(s->method->ssl_read(s,buf,num));
1020 : : }
1021 : :
1022 : 0 : int SSL_peek(SSL *s,void *buf,int num)
1023 : : {
1024 [ # # ]: 0 : if (s->handshake_func == 0)
1025 : : {
1026 : 0 : SSLerr(SSL_F_SSL_PEEK, SSL_R_UNINITIALIZED);
1027 : 0 : return -1;
1028 : : }
1029 : :
1030 [ # # ]: 0 : if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
1031 : : {
1032 : : return(0);
1033 : : }
1034 : 0 : return(s->method->ssl_peek(s,buf,num));
1035 : : }
1036 : :
1037 : 45509 : int SSL_write(SSL *s,const void *buf,int num)
1038 : : {
1039 [ - + ]: 45509 : if (s->handshake_func == 0)
1040 : : {
1041 : 0 : SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
1042 : 0 : return -1;
1043 : : }
1044 : :
1045 [ - + ]: 45509 : if (s->shutdown & SSL_SENT_SHUTDOWN)
1046 : : {
1047 : 0 : s->rwstate=SSL_NOTHING;
1048 : 0 : SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
1049 : 0 : return(-1);
1050 : : }
1051 : 45509 : return(s->method->ssl_write(s,buf,num));
1052 : : }
1053 : :
1054 : 2424 : int SSL_shutdown(SSL *s)
1055 : : {
1056 : : /* Note that this function behaves differently from what one might
1057 : : * expect. Return values are 0 for no success (yet),
1058 : : * 1 for success; but calling it once is usually not enough,
1059 : : * even if blocking I/O is used (see ssl3_shutdown).
1060 : : */
1061 : :
1062 [ - + ]: 2424 : if (s->handshake_func == 0)
1063 : : {
1064 : 0 : SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
1065 : 0 : return -1;
1066 : : }
1067 : :
1068 [ + - ][ + + ]: 2424 : if ((s != NULL) && !SSL_in_init(s))
1069 : 2380 : return(s->method->ssl_shutdown(s));
1070 : : else
1071 : : return(1);
1072 : : }
1073 : :
1074 : 0 : int SSL_renegotiate(SSL *s)
1075 : : {
1076 [ # # ]: 0 : if (s->renegotiate == 0)
1077 : 0 : s->renegotiate=1;
1078 : :
1079 : 0 : s->new_session=1;
1080 : :
1081 : 0 : return(s->method->ssl_renegotiate(s));
1082 : : }
1083 : :
1084 : 0 : int SSL_renegotiate_abbreviated(SSL *s)
1085 : : {
1086 [ # # ]: 0 : if (s->renegotiate == 0)
1087 : 0 : s->renegotiate=1;
1088 : :
1089 : 0 : s->new_session=0;
1090 : :
1091 : 0 : return(s->method->ssl_renegotiate(s));
1092 : : }
1093 : :
1094 : 0 : int SSL_renegotiate_pending(SSL *s)
1095 : : {
1096 : : /* becomes true when negotiation is requested;
1097 : : * false again once a handshake has finished */
1098 : 0 : return (s->renegotiate != 0);
1099 : : }
1100 : :
1101 : 3664 : long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)
1102 : : {
1103 : : long l;
1104 : :
1105 [ - - - + : 3664 : switch (cmd)
- - - - -
- + - - -
- - ]
1106 : : {
1107 : : case SSL_CTRL_GET_READ_AHEAD:
1108 : 0 : return(s->read_ahead);
1109 : : case SSL_CTRL_SET_READ_AHEAD:
1110 : 0 : l=s->read_ahead;
1111 : 0 : s->read_ahead=larg;
1112 : 0 : return(l);
1113 : :
1114 : : case SSL_CTRL_SET_MSG_CALLBACK_ARG:
1115 : 0 : s->msg_callback_arg = parg;
1116 : 0 : return 1;
1117 : :
1118 : : case SSL_CTRL_OPTIONS:
1119 : 1080 : return(s->options|=larg);
1120 : : case SSL_CTRL_CLEAR_OPTIONS:
1121 : 0 : return(s->options&=~larg);
1122 : : case SSL_CTRL_MODE:
1123 : 0 : return(s->mode|=larg);
1124 : : case SSL_CTRL_CLEAR_MODE:
1125 : 0 : return(s->mode &=~larg);
1126 : : case SSL_CTRL_GET_MAX_CERT_LIST:
1127 : 0 : return(s->max_cert_list);
1128 : : case SSL_CTRL_SET_MAX_CERT_LIST:
1129 : 0 : l=s->max_cert_list;
1130 : 0 : s->max_cert_list=larg;
1131 : 0 : return(l);
1132 : : case SSL_CTRL_SET_MTU:
1133 : : #ifndef OPENSSL_NO_DTLS1
1134 [ # # ]: 0 : if (larg < (long)dtls1_min_mtu())
1135 : : return 0;
1136 : : #endif
1137 : :
1138 [ # # ]: 0 : if (SSL_IS_DTLS(s))
1139 : : {
1140 : 0 : s->d1->mtu = larg;
1141 : 0 : return larg;
1142 : : }
1143 : : return 0;
1144 : : case SSL_CTRL_SET_MAX_SEND_FRAGMENT:
1145 [ + - ]: 2584 : if (larg < 512 || larg > SSL3_RT_MAX_PLAIN_LENGTH)
1146 : : return 0;
1147 : 2584 : s->max_send_fragment = larg;
1148 : 2584 : return 1;
1149 : : case SSL_CTRL_GET_RI_SUPPORT:
1150 [ # # ]: 0 : if (s->s3)
1151 : 0 : return s->s3->send_connection_binding;
1152 : : else return 0;
1153 : : case SSL_CTRL_CERT_FLAGS:
1154 : 0 : return(s->cert->cert_flags|=larg);
1155 : : case SSL_CTRL_CLEAR_CERT_FLAGS:
1156 : 0 : return(s->cert->cert_flags &=~larg);
1157 : :
1158 : : case SSL_CTRL_GET_RAW_CIPHERLIST:
1159 [ # # ]: 0 : if (parg)
1160 : : {
1161 [ # # ]: 0 : if (s->cert->ciphers_raw == NULL)
1162 : : return 0;
1163 : 0 : *(unsigned char **)parg = s->cert->ciphers_raw;
1164 : 0 : return (int)s->cert->ciphers_rawlen;
1165 : : }
1166 : : else
1167 : 0 : return ssl_put_cipher_by_char(s,NULL,NULL);
1168 : : default:
1169 : 0 : return(s->method->ssl_ctrl(s,cmd,larg,parg));
1170 : : }
1171 : : }
1172 : :
1173 : 0 : long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
1174 : : {
1175 [ # # ]: 0 : switch(cmd)
1176 : : {
1177 : : case SSL_CTRL_SET_MSG_CALLBACK:
1178 : 0 : s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
1179 : 0 : return 1;
1180 : :
1181 : : default:
1182 : 0 : return(s->method->ssl_callback_ctrl(s,cmd,fp));
1183 : : }
1184 : : }
1185 : :
1186 : 0 : LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx)
1187 : : {
1188 : 0 : return ctx->sessions;
1189 : : }
1190 : :
1191 : 3735 : long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,void *parg)
1192 : : {
1193 : : long l;
1194 : : /* For some cases with ctx == NULL perform syntax checks */
1195 [ - + ]: 3735 : if (ctx == NULL)
1196 : : {
1197 [ # # # ]: 0 : switch (cmd)
1198 : : {
1199 : : #ifndef OPENSSL_NO_EC
1200 : : case SSL_CTRL_SET_CURVES_LIST:
1201 : 0 : return tls1_set_curves_list(NULL, NULL, parg);
1202 : : #endif
1203 : : case SSL_CTRL_SET_SIGALGS_LIST:
1204 : : case SSL_CTRL_SET_CLIENT_SIGALGS_LIST:
1205 : 0 : return tls1_set_sigalgs_list(NULL, parg, 0);
1206 : : default:
1207 : : return 0;
1208 : : }
1209 : : }
1210 : :
1211 [ - - - - : 3735 : switch (cmd)
- - + - -
+ - - - -
- - - - -
- - + - -
- - - -
+ ]
1212 : : {
1213 : : case SSL_CTRL_GET_READ_AHEAD:
1214 : 0 : return(ctx->read_ahead);
1215 : : case SSL_CTRL_SET_READ_AHEAD:
1216 : 0 : l=ctx->read_ahead;
1217 : 0 : ctx->read_ahead=larg;
1218 : 0 : return(l);
1219 : :
1220 : : case SSL_CTRL_SET_MSG_CALLBACK_ARG:
1221 : 0 : ctx->msg_callback_arg = parg;
1222 : 0 : return 1;
1223 : :
1224 : : case SSL_CTRL_GET_MAX_CERT_LIST:
1225 : 0 : return(ctx->max_cert_list);
1226 : : case SSL_CTRL_SET_MAX_CERT_LIST:
1227 : 0 : l=ctx->max_cert_list;
1228 : 0 : ctx->max_cert_list=larg;
1229 : 0 : return(l);
1230 : :
1231 : : case SSL_CTRL_SET_SESS_CACHE_SIZE:
1232 : 0 : l=ctx->session_cache_size;
1233 : 0 : ctx->session_cache_size=larg;
1234 : 0 : return(l);
1235 : : case SSL_CTRL_GET_SESS_CACHE_SIZE:
1236 : 726 : return(ctx->session_cache_size);
1237 : : case SSL_CTRL_SET_SESS_CACHE_MODE:
1238 : 0 : l=ctx->session_cache_mode;
1239 : 0 : ctx->session_cache_mode=larg;
1240 : 0 : return(l);
1241 : : case SSL_CTRL_GET_SESS_CACHE_MODE:
1242 : 0 : return(ctx->session_cache_mode);
1243 : :
1244 : : case SSL_CTRL_SESS_NUMBER:
1245 : 363 : return(lh_SSL_SESSION_num_items(ctx->sessions));
1246 : : case SSL_CTRL_SESS_CONNECT:
1247 : 0 : return(ctx->stats.sess_connect);
1248 : : case SSL_CTRL_SESS_CONNECT_GOOD:
1249 : 0 : return(ctx->stats.sess_connect_good);
1250 : : case SSL_CTRL_SESS_CONNECT_RENEGOTIATE:
1251 : 0 : return(ctx->stats.sess_connect_renegotiate);
1252 : : case SSL_CTRL_SESS_ACCEPT:
1253 : 0 : return(ctx->stats.sess_accept);
1254 : : case SSL_CTRL_SESS_ACCEPT_GOOD:
1255 : 0 : return(ctx->stats.sess_accept_good);
1256 : : case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE:
1257 : 0 : return(ctx->stats.sess_accept_renegotiate);
1258 : : case SSL_CTRL_SESS_HIT:
1259 : 0 : return(ctx->stats.sess_hit);
1260 : : case SSL_CTRL_SESS_CB_HIT:
1261 : 0 : return(ctx->stats.sess_cb_hit);
1262 : : case SSL_CTRL_SESS_MISSES:
1263 : 0 : return(ctx->stats.sess_miss);
1264 : : case SSL_CTRL_SESS_TIMEOUTS:
1265 : 0 : return(ctx->stats.sess_timeout);
1266 : : case SSL_CTRL_SESS_CACHE_FULL:
1267 : 0 : return(ctx->stats.sess_cache_full);
1268 : : case SSL_CTRL_OPTIONS:
1269 : 904 : return(ctx->options|=larg);
1270 : : case SSL_CTRL_CLEAR_OPTIONS:
1271 : 0 : return(ctx->options&=~larg);
1272 : : case SSL_CTRL_MODE:
1273 : 0 : return(ctx->mode|=larg);
1274 : : case SSL_CTRL_CLEAR_MODE:
1275 : 0 : return(ctx->mode&=~larg);
1276 : : case SSL_CTRL_SET_MAX_SEND_FRAGMENT:
1277 [ # # ]: 0 : if (larg < 512 || larg > SSL3_RT_MAX_PLAIN_LENGTH)
1278 : : return 0;
1279 : 0 : ctx->max_send_fragment = larg;
1280 : 0 : return 1;
1281 : : case SSL_CTRL_CERT_FLAGS:
1282 : 0 : return(ctx->cert->cert_flags|=larg);
1283 : : case SSL_CTRL_CLEAR_CERT_FLAGS:
1284 : 0 : return(ctx->cert->cert_flags &=~larg);
1285 : : default:
1286 : 1742 : return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg));
1287 : : }
1288 : : }
1289 : :
1290 : 893 : long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
1291 : : {
1292 [ - + ]: 893 : switch(cmd)
1293 : : {
1294 : : case SSL_CTRL_SET_MSG_CALLBACK:
1295 : 0 : ctx->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
1296 : 0 : return 1;
1297 : :
1298 : : default:
1299 : 893 : return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp));
1300 : : }
1301 : : }
1302 : :
1303 : 358175 : int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b)
1304 : : {
1305 : : long l;
1306 : :
1307 : 358175 : l=a->id-b->id;
1308 [ + + ]: 358175 : if (l == 0L)
1309 : : return(0);
1310 : : else
1311 [ + + ]: 300344 : return((l > 0)?1:-1);
1312 : : }
1313 : :
1314 : 1006713 : int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,
1315 : : const SSL_CIPHER * const *bp)
1316 : : {
1317 : : long l;
1318 : :
1319 : 1006713 : l=(*ap)->id-(*bp)->id;
1320 [ + + ]: 1006713 : if (l == 0L)
1321 : : return(0);
1322 : : else
1323 [ + + ]: 1005523 : return((l > 0)?1:-1);
1324 : : }
1325 : :
1326 : : /** return a STACK of the ciphers available for the SSL and in order of
1327 : : * preference */
1328 : 3968 : STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s)
1329 : : {
1330 [ + - ]: 3968 : if (s != NULL)
1331 : : {
1332 [ + - ]: 3968 : if (s->cipher_list != NULL)
1333 : : {
1334 : : return(s->cipher_list);
1335 : : }
1336 [ + - ][ + - ]: 3968 : else if ((s->ctx != NULL) &&
1337 : 3968 : (s->ctx->cipher_list != NULL))
1338 : : {
1339 : 3968 : return(s->ctx->cipher_list);
1340 : : }
1341 : : }
1342 : : return(NULL);
1343 : : }
1344 : :
1345 : 0 : STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s)
1346 : : {
1347 : 0 : STACK_OF(SSL_CIPHER) *sk = NULL, *ciphers;
1348 : : int i;
1349 : 0 : ciphers = SSL_get_ciphers(s);
1350 [ # # ]: 0 : if (!ciphers)
1351 : : return NULL;
1352 : 0 : ssl_set_client_disabled(s);
1353 [ # # ]: 0 : for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++)
1354 : : {
1355 : 0 : const SSL_CIPHER *c = sk_SSL_CIPHER_value(ciphers, i);
1356 [ # # ]: 0 : if (!ssl_cipher_disabled(s, c, SSL_SECOP_CIPHER_SUPPORTED))
1357 : : {
1358 [ # # ]: 0 : if (!sk)
1359 : 0 : sk = sk_SSL_CIPHER_new_null();
1360 [ # # ]: 0 : if (!sk)
1361 : : return NULL;
1362 [ # # ]: 0 : if (!sk_SSL_CIPHER_push(sk, c))
1363 : : {
1364 : 0 : sk_SSL_CIPHER_free(sk);
1365 : 0 : return NULL;
1366 : : }
1367 : : }
1368 : : }
1369 : : return sk;
1370 : : }
1371 : :
1372 : : /** return a STACK of the ciphers available for the SSL and in order of
1373 : : * algorithm id */
1374 : 1080 : STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)
1375 : : {
1376 [ + - ]: 1080 : if (s != NULL)
1377 : : {
1378 [ + - ]: 1080 : if (s->cipher_list_by_id != NULL)
1379 : : {
1380 : : return(s->cipher_list_by_id);
1381 : : }
1382 [ + - ][ + - ]: 1080 : else if ((s->ctx != NULL) &&
1383 : 1080 : (s->ctx->cipher_list_by_id != NULL))
1384 : : {
1385 : 1080 : return(s->ctx->cipher_list_by_id);
1386 : : }
1387 : : }
1388 : : return(NULL);
1389 : : }
1390 : :
1391 : : /** The old interface to get the same thing as SSL_get_ciphers() */
1392 : 0 : const char *SSL_get_cipher_list(const SSL *s,int n)
1393 : : {
1394 : : SSL_CIPHER *c;
1395 : : STACK_OF(SSL_CIPHER) *sk;
1396 : :
1397 [ # # ]: 0 : if (s == NULL) return(NULL);
1398 : 0 : sk=SSL_get_ciphers(s);
1399 [ # # ][ # # ]: 0 : if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))
1400 : : return(NULL);
1401 : 0 : c=sk_SSL_CIPHER_value(sk,n);
1402 [ # # ]: 0 : if (c == NULL) return(NULL);
1403 : 0 : return(c->name);
1404 : : }
1405 : :
1406 : : /** specify the ciphers to be used by default by the SSL_CTX */
1407 : 620 : int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)
1408 : : {
1409 : : STACK_OF(SSL_CIPHER) *sk;
1410 : :
1411 : 620 : sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,
1412 : 620 : &ctx->cipher_list_by_id,str, ctx->cert);
1413 : : /* ssl_create_cipher_list may return an empty stack if it
1414 : : * was unable to find a cipher matching the given rule string
1415 : : * (for example if the rule string specifies a cipher which
1416 : : * has been disabled). This is not an error as far as
1417 : : * ssl_create_cipher_list is concerned, and hence
1418 : : * ctx->cipher_list and ctx->cipher_list_by_id has been
1419 : : * updated. */
1420 [ + - ]: 620 : if (sk == NULL)
1421 : : return 0;
1422 [ - + ]: 620 : else if (sk_SSL_CIPHER_num(sk) == 0)
1423 : : {
1424 : 0 : SSLerr(SSL_F_SSL_CTX_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH);
1425 : 0 : return 0;
1426 : : }
1427 : : return 1;
1428 : : }
1429 : :
1430 : : /** specify the ciphers to be used by the SSL */
1431 : 0 : int SSL_set_cipher_list(SSL *s,const char *str)
1432 : : {
1433 : : STACK_OF(SSL_CIPHER) *sk;
1434 : :
1435 : 0 : sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,
1436 : 0 : &s->cipher_list_by_id,str, s->cert);
1437 : : /* see comment in SSL_CTX_set_cipher_list */
1438 [ # # ]: 0 : if (sk == NULL)
1439 : : return 0;
1440 [ # # ]: 0 : else if (sk_SSL_CIPHER_num(sk) == 0)
1441 : : {
1442 : 0 : SSLerr(SSL_F_SSL_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH);
1443 : 0 : return 0;
1444 : : }
1445 : : return 1;
1446 : : }
1447 : :
1448 : : /* works well for SSLv2, not so good for SSLv3 */
1449 : 0 : char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
1450 : : {
1451 : : char *p;
1452 : : STACK_OF(SSL_CIPHER) *sk;
1453 : : SSL_CIPHER *c;
1454 : : int i;
1455 : :
1456 [ # # ][ # # ]: 0 : if ((s->session == NULL) || (s->session->ciphers == NULL) ||
[ # # ]
1457 : : (len < 2))
1458 : : return(NULL);
1459 : :
1460 : 0 : p=buf;
1461 : 0 : sk=s->session->ciphers;
1462 : :
1463 [ # # ]: 0 : if (sk_SSL_CIPHER_num(sk) == 0)
1464 : : return NULL;
1465 : :
1466 [ # # ]: 0 : for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1467 : : {
1468 : : int n;
1469 : :
1470 : 0 : c=sk_SSL_CIPHER_value(sk,i);
1471 : 0 : n=strlen(c->name);
1472 [ # # ]: 0 : if (n+1 > len)
1473 : : {
1474 [ # # ]: 0 : if (p != buf)
1475 : 0 : --p;
1476 : 0 : *p='\0';
1477 : 0 : return buf;
1478 : : }
1479 : 0 : strcpy(p,c->name);
1480 : 0 : p+=n;
1481 : 0 : *(p++)=':';
1482 : 0 : len-=n+1;
1483 : : }
1484 : 0 : p[-1]='\0';
1485 : 0 : return(buf);
1486 : : }
1487 : :
1488 : 1344 : int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p,
1489 : : int (*put_cb)(const SSL_CIPHER *, unsigned char *))
1490 : : {
1491 : 1344 : int i,j=0;
1492 : : SSL_CIPHER *c;
1493 : : unsigned char *q;
1494 : 1344 : int no_scsv = s->renegotiate;
1495 : : /* Set disabled masks for this session */
1496 : 1344 : ssl_set_client_disabled(s);
1497 : :
1498 [ + - ]: 1344 : if (sk == NULL) return(0);
1499 : : q=p;
1500 : :
1501 [ + + ]: 87322 : for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1502 : : {
1503 : 85978 : c=sk_SSL_CIPHER_value(sk,i);
1504 : : /* Skip disabled ciphers */
1505 [ + + ]: 85978 : if (ssl_cipher_disabled(s, c, SSL_SECOP_CIPHER_SUPPORTED))
1506 : 29194 : continue;
1507 : : #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
1508 : : if (c->id == SSL3_CK_SCSV)
1509 : : {
1510 : : if (no_scsv)
1511 : : continue;
1512 : : else
1513 : : no_scsv = 1;
1514 : : }
1515 : : #endif
1516 [ + + ]: 56784 : j = put_cb ? put_cb(c,p) : ssl_put_cipher_by_char(s,c,p);
1517 : 56784 : p+=j;
1518 : : }
1519 : : /* If p == q, no ciphers and caller indicates an error. Otherwise
1520 : : * add SCSV if not renegotiating.
1521 : : */
1522 [ + - ]: 1344 : if (p != q && !no_scsv)
1523 : : {
1524 : : static SSL_CIPHER scsv =
1525 : : {
1526 : : 0, NULL, SSL3_CK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0
1527 : : };
1528 [ + + ]: 1344 : j = put_cb ? put_cb(&scsv,p) : ssl_put_cipher_by_char(s,&scsv,p);
1529 : 1344 : p+=j;
1530 : : #ifdef OPENSSL_RI_DEBUG
1531 : : fprintf(stderr, "SCSV sent by client\n");
1532 : : #endif
1533 : : }
1534 : :
1535 : 1344 : return(p-q);
1536 : : }
1537 : :
1538 : 1322 : STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
1539 : : STACK_OF(SSL_CIPHER) **skp)
1540 : : {
1541 : : const SSL_CIPHER *c;
1542 : : STACK_OF(SSL_CIPHER) *sk;
1543 : : int i,n;
1544 [ + + ]: 1322 : if (s->s3)
1545 : 1080 : s->s3->send_connection_binding = 0;
1546 : :
1547 : 1322 : n=ssl_put_cipher_by_char(s,NULL,NULL);
1548 [ - + ]: 1322 : if ((num%n) != 0)
1549 : : {
1550 : 0 : SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST);
1551 : 0 : return(NULL);
1552 : : }
1553 [ + - ][ + - ]: 1322 : if ((skp == NULL) || (*skp == NULL))
1554 : 1322 : sk=sk_SSL_CIPHER_new_null(); /* change perhaps later */
1555 : : else
1556 : : {
1557 : 0 : sk= *skp;
1558 : 0 : sk_SSL_CIPHER_zero(sk);
1559 : : }
1560 : :
1561 [ + + ]: 1322 : if (s->cert->ciphers_raw)
1562 : 319 : OPENSSL_free(s->cert->ciphers_raw);
1563 : 1322 : s->cert->ciphers_raw = BUF_memdup(p, num);
1564 [ - + ]: 1322 : if (s->cert->ciphers_raw == NULL)
1565 : : {
1566 : 0 : SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1567 : 0 : goto err;
1568 : : }
1569 : 1322 : s->cert->ciphers_rawlen = (size_t)num;
1570 : :
1571 [ + + ]: 59032 : for (i=0; i<num; i+=n)
1572 : : {
1573 : : /* Check for SCSV */
1574 [ + + ][ - + ]: 57710 : if (s->s3 && (n != 3 || !p[0]) &&
[ # # ][ + + ]
1575 [ + + ]: 36832 : (p[n-2] == ((SSL3_CK_SCSV >> 8) & 0xff)) &&
1576 : 36832 : (p[n-1] == (SSL3_CK_SCSV & 0xff)))
1577 : : {
1578 : : /* SCSV fatal if renegotiating */
1579 [ - + ]: 1080 : if (s->renegotiate)
1580 : : {
1581 : 0 : SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING);
1582 : 0 : ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1583 : 0 : goto err;
1584 : : }
1585 : 1080 : s->s3->send_connection_binding = 1;
1586 : 1080 : p += n;
1587 : : #ifdef OPENSSL_RI_DEBUG
1588 : : fprintf(stderr, "SCSV received by server\n");
1589 : : #endif
1590 : 1080 : continue;
1591 : : }
1592 : :
1593 : 56630 : c=ssl_get_cipher_by_char(s,p);
1594 : 56630 : p+=n;
1595 [ + - ]: 56630 : if (c != NULL)
1596 : : {
1597 [ - + ]: 56630 : if (!sk_SSL_CIPHER_push(sk,c))
1598 : : {
1599 : 0 : SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1600 : 0 : goto err;
1601 : : }
1602 : : }
1603 : : }
1604 : :
1605 [ + - ]: 1322 : if (skp != NULL)
1606 : 1322 : *skp=sk;
1607 : 1322 : return(sk);
1608 : : err:
1609 [ # # ][ # # ]: 0 : if ((skp == NULL) || (*skp == NULL))
1610 : 0 : sk_SSL_CIPHER_free(sk);
1611 : : return(NULL);
1612 : : }
1613 : :
1614 : :
1615 : : #ifndef OPENSSL_NO_TLSEXT
1616 : : /** return a servername extension value if provided in Client Hello, or NULL.
1617 : : * So far, only host_name types are defined (RFC 3546).
1618 : : */
1619 : :
1620 : 0 : const char *SSL_get_servername(const SSL *s, const int type)
1621 : : {
1622 [ # # ]: 0 : if (type != TLSEXT_NAMETYPE_host_name)
1623 : : return NULL;
1624 : :
1625 [ # # ]: 0 : return s->session && !s->tlsext_hostname ?
1626 [ # # ]: 0 : s->session->tlsext_hostname :
1627 : : s->tlsext_hostname;
1628 : : }
1629 : :
1630 : 0 : int SSL_get_servername_type(const SSL *s)
1631 : : {
1632 [ # # ][ # # ]: 0 : if (s->session && (!s->tlsext_hostname ? s->session->tlsext_hostname : s->tlsext_hostname))
[ # # ]
1633 : : return TLSEXT_NAMETYPE_host_name;
1634 : 0 : return -1;
1635 : : }
1636 : :
1637 : : /* SSL_select_next_proto implements the standard protocol selection. It is
1638 : : * expected that this function is called from the callback set by
1639 : : * SSL_CTX_set_next_proto_select_cb.
1640 : : *
1641 : : * The protocol data is assumed to be a vector of 8-bit, length prefixed byte
1642 : : * strings. The length byte itself is not included in the length. A byte
1643 : : * string of length 0 is invalid. No byte string may be truncated.
1644 : : *
1645 : : * The current, but experimental algorithm for selecting the protocol is:
1646 : : *
1647 : : * 1) If the server doesn't support NPN then this is indicated to the
1648 : : * callback. In this case, the client application has to abort the connection
1649 : : * or have a default application level protocol.
1650 : : *
1651 : : * 2) If the server supports NPN, but advertises an empty list then the
1652 : : * client selects the first protcol in its list, but indicates via the
1653 : : * API that this fallback case was enacted.
1654 : : *
1655 : : * 3) Otherwise, the client finds the first protocol in the server's list
1656 : : * that it supports and selects this protocol. This is because it's
1657 : : * assumed that the server has better information about which protocol
1658 : : * a client should use.
1659 : : *
1660 : : * 4) If the client doesn't support any of the server's advertised
1661 : : * protocols, then this is treated the same as case 2.
1662 : : *
1663 : : * It returns either
1664 : : * OPENSSL_NPN_NEGOTIATED if a common protocol was found, or
1665 : : * OPENSSL_NPN_NO_OVERLAP if the fallback case was reached.
1666 : : */
1667 : 88 : int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, const unsigned char *server, unsigned int server_len, const unsigned char *client, unsigned int client_len)
1668 : : {
1669 : : unsigned int i, j;
1670 : : const unsigned char *result;
1671 : 88 : int status = OPENSSL_NPN_UNSUPPORTED;
1672 : :
1673 : : /* For each protocol in server preference order, see if we support it. */
1674 [ + + ]: 121 : for (i = 0; i < server_len; )
1675 : : {
1676 [ + + ]: 165 : for (j = 0; j < client_len; )
1677 : : {
1678 [ + - ][ + + ]: 132 : if (server[i] == client[j] &&
1679 : 132 : memcmp(&server[i+1], &client[j+1], server[i]) == 0)
1680 : : {
1681 : : /* We found a match */
1682 : : result = &server[i];
1683 : : status = OPENSSL_NPN_NEGOTIATED;
1684 : : goto found;
1685 : : }
1686 : 66 : j += client[j];
1687 : 66 : j++;
1688 : : }
1689 : 33 : i += server[i];
1690 : 33 : i++;
1691 : : }
1692 : :
1693 : : /* There's no overlap between our protocols and the server's list. */
1694 : : result = client;
1695 : : status = OPENSSL_NPN_NO_OVERLAP;
1696 : :
1697 : : found:
1698 : 88 : *out = (unsigned char *) result + 1;
1699 : 88 : *outlen = result[0];
1700 : 88 : return status;
1701 : : }
1702 : :
1703 : : # ifndef OPENSSL_NO_NEXTPROTONEG
1704 : : /* SSL_get0_next_proto_negotiated sets *data and *len to point to the client's
1705 : : * requested protocol for this connection and returns 0. If the client didn't
1706 : : * request any protocol, then *data is set to NULL.
1707 : : *
1708 : : * Note that the client can request any protocol it chooses. The value returned
1709 : : * from this function need not be a member of the list of supported protocols
1710 : : * provided by the callback.
1711 : : */
1712 : 2380 : void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, unsigned *len)
1713 : : {
1714 : 2380 : *data = s->next_proto_negotiated;
1715 [ + + ]: 2380 : if (!*data) {
1716 : 2270 : *len = 0;
1717 : : } else {
1718 : 110 : *len = s->next_proto_negotiated_len;
1719 : : }
1720 : 2380 : }
1721 : :
1722 : : /* SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a
1723 : : * TLS server needs a list of supported protocols for Next Protocol
1724 : : * Negotiation. The returned list must be in wire format. The list is returned
1725 : : * by setting |out| to point to it and |outlen| to its length. This memory will
1726 : : * not be modified, but one should assume that the SSL* keeps a reference to
1727 : : * it.
1728 : : *
1729 : : * The callback should return SSL_TLSEXT_ERR_OK if it wishes to advertise. Otherwise, no
1730 : : * such extension will be included in the ServerHello. */
1731 : 66 : void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, const unsigned char **out, unsigned int *outlen, void *arg), void *arg)
1732 : : {
1733 : 66 : ctx->next_protos_advertised_cb = cb;
1734 : 66 : ctx->next_protos_advertised_cb_arg = arg;
1735 : 66 : }
1736 : :
1737 : : /* SSL_CTX_set_next_proto_select_cb sets a callback that is called when a
1738 : : * client needs to select a protocol from the server's provided list. |out|
1739 : : * must be set to point to the selected protocol (which may be within |in|).
1740 : : * The length of the protocol name must be written into |outlen|. The server's
1741 : : * advertised protocols are provided in |in| and |inlen|. The callback can
1742 : : * assume that |in| is syntactically valid.
1743 : : *
1744 : : * The client must select a protocol. It is fatal to the connection if this
1745 : : * callback returns a value other than SSL_TLSEXT_ERR_OK.
1746 : : */
1747 : 55 : void SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg), void *arg)
1748 : : {
1749 : 55 : ctx->next_proto_select_cb = cb;
1750 : 55 : ctx->next_proto_select_cb_arg = arg;
1751 : 55 : }
1752 : : # endif
1753 : :
1754 : 154 : int SSL_CTX_set_custom_cli_ext(SSL_CTX *ctx, unsigned short ext_type,
1755 : : custom_cli_ext_first_cb_fn fn1,
1756 : : custom_cli_ext_second_cb_fn fn2, void* arg)
1757 : : {
1758 : : size_t i;
1759 : : custom_cli_ext_record* record;
1760 : :
1761 : : /* Check for duplicates */
1762 [ + + ]: 396 : for (i=0; i < ctx->custom_cli_ext_records_count; i++)
1763 [ + - ]: 242 : if (ext_type == ctx->custom_cli_ext_records[i].ext_type)
1764 : : return 0;
1765 : :
1766 : 154 : ctx->custom_cli_ext_records = OPENSSL_realloc(ctx->custom_cli_ext_records,
1767 : : (ctx->custom_cli_ext_records_count + 1) *
1768 : : sizeof(custom_cli_ext_record));
1769 [ - + ]: 154 : if (!ctx->custom_cli_ext_records) {
1770 : 0 : ctx->custom_cli_ext_records_count = 0;
1771 : 0 : return 0;
1772 : : }
1773 : 154 : ctx->custom_cli_ext_records_count++;
1774 : 154 : record = &ctx->custom_cli_ext_records[ctx->custom_cli_ext_records_count - 1];
1775 : 154 : record->ext_type = ext_type;
1776 : 154 : record->fn1 = fn1;
1777 : 154 : record->fn2 = fn2;
1778 : 154 : record->arg = arg;
1779 : 154 : return 1;
1780 : : }
1781 : :
1782 : 198 : int SSL_CTX_set_custom_srv_ext(SSL_CTX *ctx, unsigned short ext_type,
1783 : : custom_srv_ext_first_cb_fn fn1,
1784 : : custom_srv_ext_second_cb_fn fn2, void* arg)
1785 : : {
1786 : : size_t i;
1787 : : custom_srv_ext_record* record;
1788 : :
1789 : : /* Check for duplicates */
1790 [ + + ]: 473 : for (i=0; i < ctx->custom_srv_ext_records_count; i++)
1791 [ + - ]: 275 : if (ext_type == ctx->custom_srv_ext_records[i].ext_type)
1792 : : return 0;
1793 : :
1794 : 198 : ctx->custom_srv_ext_records = OPENSSL_realloc(ctx->custom_srv_ext_records,
1795 : : (ctx->custom_srv_ext_records_count + 1) *
1796 : : sizeof(custom_srv_ext_record));
1797 [ - + ]: 198 : if (!ctx->custom_srv_ext_records) {
1798 : 0 : ctx->custom_srv_ext_records_count = 0;
1799 : 0 : return 0;
1800 : : }
1801 : 198 : ctx->custom_srv_ext_records_count++;
1802 : 198 : record = &ctx->custom_srv_ext_records[ctx->custom_srv_ext_records_count - 1];
1803 : 198 : record->ext_type = ext_type;
1804 : 198 : record->fn1 = fn1;
1805 : 198 : record->fn2 = fn2;
1806 : 198 : record->arg = arg;
1807 : 198 : return 1;
1808 : : }
1809 : :
1810 : : /* SSL_CTX_set_alpn_protos sets the ALPN protocol list on |ctx| to |protos|.
1811 : : * |protos| must be in wire-format (i.e. a series of non-empty, 8-bit
1812 : : * length-prefixed strings).
1813 : : *
1814 : : * Returns 0 on success. */
1815 : 88 : int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char* protos,
1816 : : unsigned protos_len)
1817 : : {
1818 [ - + ]: 88 : if (ctx->alpn_client_proto_list)
1819 : 0 : OPENSSL_free(ctx->alpn_client_proto_list);
1820 : :
1821 : 88 : ctx->alpn_client_proto_list = OPENSSL_malloc(protos_len);
1822 [ + - ]: 88 : if (!ctx->alpn_client_proto_list)
1823 : : return 1;
1824 : 88 : memcpy(ctx->alpn_client_proto_list, protos, protos_len);
1825 : 88 : ctx->alpn_client_proto_list_len = protos_len;
1826 : :
1827 : 88 : return 0;
1828 : : }
1829 : :
1830 : : /* SSL_set_alpn_protos sets the ALPN protocol list on |ssl| to |protos|.
1831 : : * |protos| must be in wire-format (i.e. a series of non-empty, 8-bit
1832 : : * length-prefixed strings).
1833 : : *
1834 : : * Returns 0 on success. */
1835 : 0 : int SSL_set_alpn_protos(SSL *ssl, const unsigned char* protos,
1836 : : unsigned protos_len)
1837 : : {
1838 [ # # ]: 0 : if (ssl->alpn_client_proto_list)
1839 : 0 : OPENSSL_free(ssl->alpn_client_proto_list);
1840 : :
1841 : 0 : ssl->alpn_client_proto_list = OPENSSL_malloc(protos_len);
1842 [ # # ]: 0 : if (!ssl->alpn_client_proto_list)
1843 : : return 1;
1844 : 0 : memcpy(ssl->alpn_client_proto_list, protos, protos_len);
1845 : 0 : ssl->alpn_client_proto_list_len = protos_len;
1846 : :
1847 : 0 : return 0;
1848 : : }
1849 : :
1850 : : /* SSL_CTX_set_alpn_select_cb sets a callback function on |ctx| that is called
1851 : : * during ClientHello processing in order to select an ALPN protocol from the
1852 : : * client's list of offered protocols. */
1853 : 88 : void SSL_CTX_set_alpn_select_cb(SSL_CTX* ctx,
1854 : : int (*cb) (SSL *ssl,
1855 : : const unsigned char **out,
1856 : : unsigned char *outlen,
1857 : : const unsigned char *in,
1858 : : unsigned int inlen,
1859 : : void *arg),
1860 : : void *arg)
1861 : : {
1862 : 88 : ctx->alpn_select_cb = cb;
1863 : 88 : ctx->alpn_select_cb_arg = arg;
1864 : 88 : }
1865 : :
1866 : : /* SSL_get0_alpn_selected gets the selected ALPN protocol (if any) from |ssl|.
1867 : : * On return it sets |*data| to point to |*len| bytes of protocol name (not
1868 : : * including the leading length-prefix byte). If the server didn't respond with
1869 : : * a negotiated protocol then |*len| will be zero. */
1870 : 1518 : void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data,
1871 : : unsigned *len)
1872 : : {
1873 : 1518 : *data = NULL;
1874 [ + + ]: 1518 : if (ssl->s3)
1875 : 1430 : *data = ssl->s3->alpn_selected;
1876 [ + + ]: 1518 : if (*data == NULL)
1877 : 1386 : *len = 0;
1878 : : else
1879 : 132 : *len = ssl->s3->alpn_selected_len;
1880 : 1518 : }
1881 : :
1882 : : #endif /* !OPENSSL_NO_TLSEXT */
1883 : :
1884 : 0 : int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen,
1885 : : const char *label, size_t llen, const unsigned char *p, size_t plen,
1886 : : int use_context)
1887 : : {
1888 [ # # ]: 0 : if (s->version < TLS1_VERSION)
1889 : : return -1;
1890 : :
1891 : 0 : return s->method->ssl3_enc->export_keying_material(s, out, olen, label,
1892 : : llen, p, plen,
1893 : : use_context);
1894 : : }
1895 : :
1896 : 2992 : static unsigned long ssl_session_hash(const SSL_SESSION *a)
1897 : : {
1898 : : unsigned long l;
1899 : :
1900 : 2992 : l=(unsigned long)
1901 : 2992 : ((unsigned int) a->session_id[0] )|
1902 : 2992 : ((unsigned int) a->session_id[1]<< 8L)|
1903 : 1496 : ((unsigned long)a->session_id[2]<<16L)|
1904 : 1496 : ((unsigned long)a->session_id[3]<<24L);
1905 : 1496 : return(l);
1906 : : }
1907 : :
1908 : : /* NB: If this function (or indeed the hash function which uses a sort of
1909 : : * coarser function than this one) is changed, ensure
1910 : : * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being
1911 : : * able to construct an SSL_SESSION that will collide with any existing session
1912 : : * with a matching session ID. */
1913 : 363 : static int ssl_session_cmp(const SSL_SESSION *a,const SSL_SESSION *b)
1914 : : {
1915 [ + - ]: 363 : if (a->ssl_version != b->ssl_version)
1916 : : return(1);
1917 [ + - ]: 363 : if (a->session_id_length != b->session_id_length)
1918 : : return(1);
1919 : 363 : return(memcmp(a->session_id,b->session_id,a->session_id_length));
1920 : : }
1921 : :
1922 : : /* These wrapper functions should remain rather than redeclaring
1923 : : * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each
1924 : : * variable. The reason is that the functions aren't static, they're exposed via
1925 : : * ssl.h. */
1926 : 2992 : static IMPLEMENT_LHASH_HASH_FN(ssl_session, SSL_SESSION)
1927 : 726 : static IMPLEMENT_LHASH_COMP_FN(ssl_session, SSL_SESSION)
1928 : :
1929 : 1808 : SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth)
1930 : : {
1931 : 1808 : SSL_CTX *ret=NULL;
1932 : :
1933 [ - + ]: 1808 : if (meth == NULL)
1934 : : {
1935 : 0 : SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
1936 : 0 : return(NULL);
1937 : : }
1938 : :
1939 : : #ifdef OPENSSL_FIPS
1940 : : if (FIPS_mode() && (meth->version < TLS1_VERSION))
1941 : : {
1942 : : SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE);
1943 : : return NULL;
1944 : : }
1945 : : #endif
1946 : :
1947 [ - + ]: 1808 : if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
1948 : : {
1949 : 0 : SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
1950 : 0 : goto err;
1951 : : }
1952 : 1808 : ret=(SSL_CTX *)OPENSSL_malloc(sizeof(SSL_CTX));
1953 [ + - ]: 1808 : if (ret == NULL)
1954 : : goto err;
1955 : :
1956 : : memset(ret,0,sizeof(SSL_CTX));
1957 : :
1958 : 1808 : ret->method=meth;
1959 : :
1960 : 1808 : ret->cert_store=NULL;
1961 : 1808 : ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
1962 : 1808 : ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
1963 : 1808 : ret->session_cache_head=NULL;
1964 : 1808 : ret->session_cache_tail=NULL;
1965 : :
1966 : : /* We take the system default */
1967 : 1808 : ret->session_timeout=meth->get_timeout();
1968 : :
1969 : 1808 : ret->new_session_cb=0;
1970 : 1808 : ret->remove_session_cb=0;
1971 : 1808 : ret->get_session_cb=0;
1972 : 1808 : ret->generate_session_id=0;
1973 : :
1974 : 1808 : memset((char *)&ret->stats,0,sizeof(ret->stats));
1975 : :
1976 : 1808 : ret->references=1;
1977 : 1808 : ret->quiet_shutdown=0;
1978 : :
1979 : : /* ret->cipher=NULL;*/
1980 : : /* ret->s2->challenge=NULL;
1981 : : ret->master_key=NULL;
1982 : : ret->key_arg=NULL;
1983 : : ret->s2->conn_id=NULL; */
1984 : :
1985 : 1808 : ret->info_callback=NULL;
1986 : :
1987 : 1808 : ret->app_verify_callback=0;
1988 : 1808 : ret->app_verify_arg=NULL;
1989 : :
1990 : 1808 : ret->max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;
1991 : 1808 : ret->read_ahead=0;
1992 : 1808 : ret->msg_callback=0;
1993 : 1808 : ret->msg_callback_arg=NULL;
1994 : 1808 : ret->verify_mode=SSL_VERIFY_NONE;
1995 : : #if 0
1996 : : ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */
1997 : : #endif
1998 : 1808 : ret->sid_ctx_length=0;
1999 : 1808 : ret->default_verify_callback=NULL;
2000 [ + - ]: 1808 : if ((ret->cert=ssl_cert_new()) == NULL)
2001 : : goto err;
2002 : :
2003 : 1808 : ret->default_passwd_callback=0;
2004 : 1808 : ret->default_passwd_callback_userdata=NULL;
2005 : 1808 : ret->client_cert_cb=0;
2006 : 1808 : ret->app_gen_cookie_cb=0;
2007 : 1808 : ret->app_verify_cookie_cb=0;
2008 : :
2009 : 1808 : ret->sessions=lh_SSL_SESSION_new();
2010 [ + - ]: 1808 : if (ret->sessions == NULL) goto err;
2011 : 1808 : ret->cert_store=X509_STORE_new();
2012 [ + - ]: 1808 : if (ret->cert_store == NULL) goto err;
2013 : :
2014 [ + + ]: 1808 : ssl_create_cipher_list(ret->method,
2015 : : &ret->cipher_list,&ret->cipher_list_by_id,
2016 : 1808 : meth->version == SSL2_VERSION ? "SSLv2" : SSL_DEFAULT_CIPHER_LIST, ret->cert);
2017 [ + - ]: 1808 : if (ret->cipher_list == NULL
2018 [ - + ]: 1808 : || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
2019 : : {
2020 : 0 : SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
2021 : 0 : goto err2;
2022 : : }
2023 : :
2024 : 1808 : ret->param = X509_VERIFY_PARAM_new();
2025 [ + - ]: 1808 : if (!ret->param)
2026 : : goto err;
2027 : :
2028 [ - + ]: 1808 : if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL)
2029 : : {
2030 : 0 : SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);
2031 : 0 : goto err2;
2032 : : }
2033 [ - + ]: 1808 : if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL)
2034 : : {
2035 : 0 : SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);
2036 : 0 : goto err2;
2037 : : }
2038 [ - + ]: 1808 : if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL)
2039 : : {
2040 : 0 : SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);
2041 : 0 : goto err2;
2042 : : }
2043 : :
2044 [ + - ]: 1808 : if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
2045 : : goto err;
2046 : :
2047 : 1808 : CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->ex_data);
2048 : :
2049 : 1808 : ret->extra_certs=NULL;
2050 : : /* No compression for DTLS */
2051 [ + - ]: 1808 : if (!(meth->ssl3_enc->enc_flags & SSL_ENC_FLAG_DTLS))
2052 : 1808 : ret->comp_methods=SSL_COMP_get_compression_methods();
2053 : :
2054 : 1808 : ret->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH;
2055 : :
2056 : : #ifndef OPENSSL_NO_TLSEXT
2057 : 1808 : ret->tlsext_servername_callback = 0;
2058 : 1808 : ret->tlsext_servername_arg = NULL;
2059 : : /* Setup RFC4507 ticket keys */
2060 [ + - ]: 1808 : if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0)
2061 [ + - ]: 1808 : || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0)
2062 [ - + ]: 1808 : || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0))
2063 : 0 : ret->options |= SSL_OP_NO_TICKET;
2064 : :
2065 : 1808 : ret->tlsext_status_cb = 0;
2066 : 1808 : ret->tlsext_status_arg = NULL;
2067 : :
2068 : : # ifndef OPENSSL_NO_NEXTPROTONEG
2069 : 1808 : ret->next_protos_advertised_cb = 0;
2070 : 1808 : ret->next_proto_select_cb = 0;
2071 : : # endif
2072 : : #endif
2073 : : #ifndef OPENSSL_NO_PSK
2074 : 1808 : ret->psk_identity_hint=NULL;
2075 : 1808 : ret->psk_client_callback=NULL;
2076 : 1808 : ret->psk_server_callback=NULL;
2077 : : #endif
2078 : : #ifndef OPENSSL_NO_SRP
2079 : 1808 : SSL_CTX_SRP_CTX_init(ret);
2080 : : #endif
2081 : 1808 : ret->custom_cli_ext_records = NULL;
2082 : 1808 : ret->custom_cli_ext_records_count = 0;
2083 : 1808 : ret->custom_srv_ext_records = NULL;
2084 : 1808 : ret->custom_srv_ext_records_count = 0;
2085 : : #ifndef OPENSSL_NO_BUF_FREELISTS
2086 : 1808 : ret->freelist_max_len = SSL_MAX_BUF_FREELIST_LEN_DEFAULT;
2087 : 1808 : ret->rbuf_freelist = OPENSSL_malloc(sizeof(SSL3_BUF_FREELIST));
2088 [ + - ]: 1808 : if (!ret->rbuf_freelist)
2089 : : goto err;
2090 : 1808 : ret->rbuf_freelist->chunklen = 0;
2091 : 1808 : ret->rbuf_freelist->len = 0;
2092 : 1808 : ret->rbuf_freelist->head = NULL;
2093 : 1808 : ret->wbuf_freelist = OPENSSL_malloc(sizeof(SSL3_BUF_FREELIST));
2094 [ - + ]: 1808 : if (!ret->wbuf_freelist)
2095 : : {
2096 : 0 : OPENSSL_free(ret->rbuf_freelist);
2097 : 0 : goto err;
2098 : : }
2099 : 1808 : ret->wbuf_freelist->chunklen = 0;
2100 : 1808 : ret->wbuf_freelist->len = 0;
2101 : 1808 : ret->wbuf_freelist->head = NULL;
2102 : : #endif
2103 : : #ifndef OPENSSL_NO_ENGINE
2104 : 1808 : ret->client_cert_engine = NULL;
2105 : : #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO
2106 : : #define eng_strx(x) #x
2107 : : #define eng_str(x) eng_strx(x)
2108 : : /* Use specific client engine automatically... ignore errors */
2109 : : {
2110 : : ENGINE *eng;
2111 : : eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO));
2112 : : if (!eng)
2113 : : {
2114 : : ERR_clear_error();
2115 : : ENGINE_load_builtin_engines();
2116 : : eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO));
2117 : : }
2118 : : if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng))
2119 : : ERR_clear_error();
2120 : : }
2121 : : #endif
2122 : : #endif
2123 : : /* Default is to connect to non-RI servers. When RI is more widely
2124 : : * deployed might change this.
2125 : : */
2126 : 1808 : ret->options |= SSL_OP_LEGACY_SERVER_CONNECT;
2127 : :
2128 : 1808 : return(ret);
2129 : : err:
2130 : 0 : SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
2131 : : err2:
2132 [ # # ]: 0 : if (ret != NULL) SSL_CTX_free(ret);
2133 : : return(NULL);
2134 : : }
2135 : :
2136 : : #if 0
2137 : : static void SSL_COMP_free(SSL_COMP *comp)
2138 : : { OPENSSL_free(comp); }
2139 : : #endif
2140 : :
2141 : : #ifndef OPENSSL_NO_BUF_FREELISTS
2142 : : static void
2143 : 3616 : ssl_buf_freelist_free(SSL3_BUF_FREELIST *list)
2144 : : {
2145 : : SSL3_BUF_FREELIST_ENTRY *ent, *next;
2146 [ + + ]: 6660 : for (ent = list->head; ent; ent = next)
2147 : : {
2148 : 3044 : next = ent->next;
2149 : 3044 : OPENSSL_free(ent);
2150 : : }
2151 : 3616 : OPENSSL_free(list);
2152 : 3616 : }
2153 : : #endif
2154 : :
2155 : 5424 : void SSL_CTX_free(SSL_CTX *a)
2156 : : {
2157 : : int i;
2158 : :
2159 [ + - ]: 5424 : if (a == NULL) return;
2160 : :
2161 : 5424 : i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX);
2162 : : #ifdef REF_PRINT
2163 : : REF_PRINT("SSL_CTX",a);
2164 : : #endif
2165 [ + + ]: 5424 : if (i > 0) return;
2166 : : #ifdef REF_CHECK
2167 : : if (i < 0)
2168 : : {
2169 : : fprintf(stderr,"SSL_CTX_free, bad reference count\n");
2170 : : abort(); /* ok */
2171 : : }
2172 : : #endif
2173 : :
2174 [ + - ]: 1808 : if (a->param)
2175 : 1808 : X509_VERIFY_PARAM_free(a->param);
2176 : :
2177 : : /*
2178 : : * Free internal session cache. However: the remove_cb() may reference
2179 : : * the ex_data of SSL_CTX, thus the ex_data store can only be removed
2180 : : * after the sessions were flushed.
2181 : : * As the ex_data handling routines might also touch the session cache,
2182 : : * the most secure solution seems to be: empty (flush) the cache, then
2183 : : * free ex_data, then finally free the cache.
2184 : : * (See ticket [openssl.org #212].)
2185 : : */
2186 [ + - ]: 1808 : if (a->sessions != NULL)
2187 : 1808 : SSL_CTX_flush_sessions(a,0);
2188 : :
2189 : 1808 : CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, a, &a->ex_data);
2190 : :
2191 [ + - ]: 1808 : if (a->sessions != NULL)
2192 : 1808 : lh_SSL_SESSION_free(a->sessions);
2193 : :
2194 [ + - ]: 1808 : if (a->cert_store != NULL)
2195 : 1808 : X509_STORE_free(a->cert_store);
2196 [ + - ]: 1808 : if (a->cipher_list != NULL)
2197 : 1808 : sk_SSL_CIPHER_free(a->cipher_list);
2198 [ + - ]: 1808 : if (a->cipher_list_by_id != NULL)
2199 : 1808 : sk_SSL_CIPHER_free(a->cipher_list_by_id);
2200 [ + - ]: 1808 : if (a->cert != NULL)
2201 : 1808 : ssl_cert_free(a->cert);
2202 [ + - ]: 1808 : if (a->client_CA != NULL)
2203 : 1808 : sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
2204 [ - + ]: 1808 : if (a->extra_certs != NULL)
2205 : 0 : sk_X509_pop_free(a->extra_certs,X509_free);
2206 : : #if 0 /* This should never be done, since it removes a global database */
2207 : : if (a->comp_methods != NULL)
2208 : : sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
2209 : : #else
2210 : 1808 : a->comp_methods = NULL;
2211 : : #endif
2212 : :
2213 [ - + ]: 1808 : if (a->srtp_profiles)
2214 : 0 : sk_SRTP_PROTECTION_PROFILE_free(a->srtp_profiles);
2215 : :
2216 : : #ifndef OPENSSL_NO_PSK
2217 [ + + ]: 1808 : if (a->psk_identity_hint)
2218 : 44 : OPENSSL_free(a->psk_identity_hint);
2219 : : #endif
2220 : : #ifndef OPENSSL_NO_SRP
2221 : 1808 : SSL_CTX_SRP_CTX_free(a);
2222 : : #endif
2223 : : #ifndef OPENSSL_NO_TLSEXT
2224 : 1808 : OPENSSL_free(a->custom_cli_ext_records);
2225 : 1808 : OPENSSL_free(a->custom_srv_ext_records);
2226 : : #endif
2227 : : #ifndef OPENSSL_NO_ENGINE
2228 [ - + ]: 1808 : if (a->client_cert_engine)
2229 : 0 : ENGINE_finish(a->client_cert_engine);
2230 : : #endif
2231 : :
2232 : : #ifndef OPENSSL_NO_BUF_FREELISTS
2233 [ + - ]: 1808 : if (a->wbuf_freelist)
2234 : 1808 : ssl_buf_freelist_free(a->wbuf_freelist);
2235 [ + - ]: 1808 : if (a->rbuf_freelist)
2236 : 1808 : ssl_buf_freelist_free(a->rbuf_freelist);
2237 : : #endif
2238 : : #ifndef OPENSSL_NO_TLSEXT
2239 : : # ifndef OPENSSL_NO_EC
2240 [ - + ]: 1808 : if (a->tlsext_ecpointformatlist)
2241 : 0 : OPENSSL_free(a->tlsext_ecpointformatlist);
2242 [ - + ]: 1808 : if (a->tlsext_ellipticcurvelist)
2243 : 0 : OPENSSL_free(a->tlsext_ellipticcurvelist);
2244 : : # endif /* OPENSSL_NO_EC */
2245 [ + + ]: 1808 : if (a->alpn_client_proto_list != NULL)
2246 : 88 : OPENSSL_free(a->alpn_client_proto_list);
2247 : : #endif
2248 : :
2249 : 1808 : OPENSSL_free(a);
2250 : : }
2251 : :
2252 : 0 : void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
2253 : : {
2254 : 0 : ctx->default_passwd_callback=cb;
2255 : 0 : }
2256 : :
2257 : 0 : void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
2258 : : {
2259 : 0 : ctx->default_passwd_callback_userdata=u;
2260 : 0 : }
2261 : :
2262 : 308 : void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg)
2263 : : {
2264 : 308 : ctx->app_verify_callback=cb;
2265 : 308 : ctx->app_verify_arg=arg;
2266 : 308 : }
2267 : :
2268 : 330 : void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
2269 : : {
2270 : 330 : ctx->verify_mode=mode;
2271 : 330 : ctx->default_verify_callback=cb;
2272 : 330 : }
2273 : :
2274 : 0 : void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
2275 : : {
2276 : 0 : X509_VERIFY_PARAM_set_depth(ctx->param, depth);
2277 : 0 : }
2278 : :
2279 : 0 : void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb)(SSL *ssl, void *arg), void *arg)
2280 : : {
2281 : 0 : ssl_cert_set_cert_cb(c->cert, cb, arg);
2282 : 0 : }
2283 : :
2284 : 0 : void SSL_set_cert_cb(SSL *s, int (*cb)(SSL *ssl, void *arg), void *arg)
2285 : : {
2286 : 0 : ssl_cert_set_cert_cb(s->cert, cb, arg);
2287 : 0 : }
2288 : :
2289 : 4503 : void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher)
2290 : : {
2291 : : CERT_PKEY *cpk;
2292 : : int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
2293 : : int rsa_enc_export,dh_rsa_export,dh_dsa_export;
2294 : : int rsa_tmp_export,dh_tmp_export,kl;
2295 : : unsigned long mask_k,mask_a,emask_k,emask_a;
2296 : : #ifndef OPENSSL_NO_ECDSA
2297 : : int have_ecc_cert, ecdsa_ok, ecc_pkey_size;
2298 : : #endif
2299 : : #ifndef OPENSSL_NO_ECDH
2300 : : int have_ecdh_tmp, ecdh_ok;
2301 : : #endif
2302 : : #ifndef OPENSSL_NO_EC
2303 : 4503 : X509 *x = NULL;
2304 : 4503 : EVP_PKEY *ecc_pkey = NULL;
2305 : 4503 : int signature_nid = 0, pk_nid = 0, md_nid = 0;
2306 : : #endif
2307 [ + - ]: 4503 : if (c == NULL) return;
2308 : :
2309 [ + + ]: 4503 : kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
2310 : :
2311 : : #ifndef OPENSSL_NO_RSA
2312 [ + - ][ - + ]: 4503 : rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
2313 [ - + ][ # # ]: 4503 : rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
2314 [ # # ]: 0 : (rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
2315 : : #else
2316 : : rsa_tmp=rsa_tmp_export=0;
2317 : : #endif
2318 : : #ifndef OPENSSL_NO_DH
2319 [ + + ][ + - ]: 4503 : dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL || c->dh_tmp_auto);
[ + - ]
2320 [ + - ][ + - ]: 4503 : dh_tmp_export= !c->dh_tmp_auto && (c->dh_tmp_cb != NULL ||
[ + + ]
2321 [ + - ]: 2226 : (dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
2322 : : #else
2323 : : dh_tmp=dh_tmp_export=0;
2324 : : #endif
2325 : :
2326 : : #ifndef OPENSSL_NO_ECDH
2327 [ + + ][ + - ]: 4503 : have_ecdh_tmp=(c->ecdh_tmp || c->ecdh_tmp_cb || c->ecdh_tmp_auto);
[ + - ]
2328 : : #endif
2329 : 4503 : cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
2330 : 4503 : rsa_enc= cpk->valid_flags & CERT_PKEY_VALID;
2331 [ + - ][ + + ]: 4503 : rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
2332 : 4503 : cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
2333 : 4503 : rsa_sign= cpk->valid_flags & CERT_PKEY_SIGN;
2334 : 4503 : cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
2335 : 4503 : dsa_sign= cpk->valid_flags & CERT_PKEY_SIGN;
2336 : 4503 : cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
2337 : 4503 : dh_rsa= cpk->valid_flags & CERT_PKEY_VALID;
2338 [ - + ][ # # ]: 4503 : dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
2339 : 4503 : cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
2340 : : /* FIX THIS EAY EAY EAY */
2341 : 4503 : dh_dsa= cpk->valid_flags & CERT_PKEY_VALID;
2342 [ - + ][ # # ]: 4503 : dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
2343 : 4503 : cpk= &(c->pkeys[SSL_PKEY_ECC]);
2344 : : #ifndef OPENSSL_NO_EC
2345 : 4503 : have_ecc_cert= cpk->valid_flags & CERT_PKEY_VALID;
2346 : : #endif
2347 : 4503 : mask_k=0;
2348 : 4503 : mask_a=0;
2349 : 4503 : emask_k=0;
2350 : 4503 : emask_a=0;
2351 : :
2352 : :
2353 : :
2354 : : #ifdef CIPHER_DEBUG
2355 : : printf("rt=%d rte=%d dht=%d ecdht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
2356 : : rsa_tmp,rsa_tmp_export,dh_tmp,have_ecdh_tmp,
2357 : : rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
2358 : : #endif
2359 : :
2360 : 4503 : cpk = &(c->pkeys[SSL_PKEY_GOST01]);
2361 [ - + ][ # # ]: 4503 : if (cpk->x509 != NULL && cpk->privatekey !=NULL) {
2362 : 0 : mask_k |= SSL_kGOST;
2363 : 0 : mask_a |= SSL_aGOST01;
2364 : : }
2365 : 4503 : cpk = &(c->pkeys[SSL_PKEY_GOST94]);
2366 [ - + ][ # # ]: 4503 : if (cpk->x509 != NULL && cpk->privatekey !=NULL) {
2367 : 0 : mask_k |= SSL_kGOST;
2368 : 0 : mask_a |= SSL_aGOST94;
2369 : : }
2370 : :
2371 [ - + ][ # # ]: 4503 : if (rsa_enc || (rsa_tmp && rsa_sign))
2372 : 4503 : mask_k|=SSL_kRSA;
2373 [ + + ][ + - ]: 4503 : if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
[ + - ]
2374 : 4503 : emask_k|=SSL_kRSA;
2375 : :
2376 : : #if 0
2377 : : /* The match needs to be both kDHE and aRSA or aDSA, so don't worry */
2378 : : if ( (dh_tmp || dh_rsa || dh_dsa) &&
2379 : : (rsa_enc || rsa_sign || dsa_sign))
2380 : : mask_k|=SSL_kDHE;
2381 : : if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) &&
2382 : : (rsa_enc || rsa_sign || dsa_sign))
2383 : : emask_k|=SSL_kDHE;
2384 : : #endif
2385 : :
2386 [ + + ]: 4503 : if (dh_tmp_export)
2387 : 2226 : emask_k|=SSL_kDHE;
2388 : :
2389 [ + + ]: 4503 : if (dh_tmp)
2390 : 2226 : mask_k|=SSL_kDHE;
2391 : :
2392 [ - + ]: 4503 : if (dh_rsa) mask_k|=SSL_kDHr;
2393 [ - + ]: 4503 : if (dh_rsa_export) emask_k|=SSL_kDHr;
2394 : :
2395 [ - + ]: 4503 : if (dh_dsa) mask_k|=SSL_kDHd;
2396 [ - + ]: 4503 : if (dh_dsa_export) emask_k|=SSL_kDHd;
2397 : :
2398 [ - + ]: 4503 : if (emask_k & (SSL_kDHr|SSL_kDHd))
2399 : 0 : mask_a |= SSL_aDH;
2400 : :
2401 [ + - ]: 4503 : if (rsa_enc || rsa_sign)
2402 : : {
2403 : 4503 : mask_a|=SSL_aRSA;
2404 : 4503 : emask_a|=SSL_aRSA;
2405 : : }
2406 : :
2407 [ - + ]: 4503 : if (dsa_sign)
2408 : : {
2409 : 0 : mask_a|=SSL_aDSS;
2410 : 0 : emask_a|=SSL_aDSS;
2411 : : }
2412 : :
2413 : 4503 : mask_a|=SSL_aNULL;
2414 : 4503 : emask_a|=SSL_aNULL;
2415 : :
2416 : : #ifndef OPENSSL_NO_KRB5
2417 : : mask_k|=SSL_kKRB5;
2418 : : mask_a|=SSL_aKRB5;
2419 : : emask_k|=SSL_kKRB5;
2420 : : emask_a|=SSL_aKRB5;
2421 : : #endif
2422 : :
2423 : : /* An ECC certificate may be usable for ECDH and/or
2424 : : * ECDSA cipher suites depending on the key usage extension.
2425 : : */
2426 : : #ifndef OPENSSL_NO_EC
2427 [ - + ]: 4503 : if (have_ecc_cert)
2428 : : {
2429 : 0 : cpk = &c->pkeys[SSL_PKEY_ECC];
2430 : 0 : x = cpk->x509;
2431 : : /* This call populates extension flags (ex_flags) */
2432 : 0 : X509_check_purpose(x, -1, 0);
2433 [ # # ]: 0 : ecdh_ok = (x->ex_flags & EXFLAG_KUSAGE) ?
2434 : 0 : (x->ex_kusage & X509v3_KU_KEY_AGREEMENT) : 1;
2435 [ # # ]: 0 : ecdsa_ok = (x->ex_flags & EXFLAG_KUSAGE) ?
2436 : 0 : (x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE) : 1;
2437 [ # # ]: 0 : if (!(cpk->valid_flags & CERT_PKEY_SIGN))
2438 : 0 : ecdsa_ok = 0;
2439 : 0 : ecc_pkey = X509_get_pubkey(x);
2440 : 0 : ecc_pkey_size = (ecc_pkey != NULL) ?
2441 [ # # ]: 0 : EVP_PKEY_bits(ecc_pkey) : 0;
2442 : 0 : EVP_PKEY_free(ecc_pkey);
2443 [ # # ][ # # ]: 0 : if ((x->sig_alg) && (x->sig_alg->algorithm))
2444 : : {
2445 : 0 : signature_nid = OBJ_obj2nid(x->sig_alg->algorithm);
2446 : 0 : OBJ_find_sigid_algs(signature_nid, &md_nid, &pk_nid);
2447 : : }
2448 : : #ifndef OPENSSL_NO_ECDH
2449 [ # # ]: 0 : if (ecdh_ok)
2450 : : {
2451 : :
2452 [ # # ]: 0 : if (pk_nid == NID_rsaEncryption || pk_nid == NID_rsa)
2453 : : {
2454 : 0 : mask_k|=SSL_kECDHr;
2455 : 0 : mask_a|=SSL_aECDH;
2456 [ # # ]: 0 : if (ecc_pkey_size <= 163)
2457 : : {
2458 : 0 : emask_k|=SSL_kECDHr;
2459 : 0 : emask_a|=SSL_aECDH;
2460 : : }
2461 : : }
2462 : :
2463 [ # # ]: 0 : if (pk_nid == NID_X9_62_id_ecPublicKey)
2464 : : {
2465 : 0 : mask_k|=SSL_kECDHe;
2466 : 0 : mask_a|=SSL_aECDH;
2467 [ # # ]: 0 : if (ecc_pkey_size <= 163)
2468 : : {
2469 : 0 : emask_k|=SSL_kECDHe;
2470 : 0 : emask_a|=SSL_aECDH;
2471 : : }
2472 : : }
2473 : : }
2474 : : #endif
2475 : : #ifndef OPENSSL_NO_ECDSA
2476 [ # # ]: 0 : if (ecdsa_ok)
2477 : : {
2478 : 0 : mask_a|=SSL_aECDSA;
2479 : 0 : emask_a|=SSL_aECDSA;
2480 : : }
2481 : : #endif
2482 : : }
2483 : : #endif
2484 : :
2485 : : #ifndef OPENSSL_NO_ECDH
2486 [ + + ]: 4503 : if (have_ecdh_tmp)
2487 : : {
2488 : 2226 : mask_k|=SSL_kECDHE;
2489 : 2226 : emask_k|=SSL_kECDHE;
2490 : : }
2491 : : #endif
2492 : :
2493 : : #ifndef OPENSSL_NO_PSK
2494 : 4503 : mask_k |= SSL_kPSK;
2495 : 4503 : mask_a |= SSL_aPSK;
2496 : 4503 : emask_k |= SSL_kPSK;
2497 : 4503 : emask_a |= SSL_aPSK;
2498 : : #endif
2499 : :
2500 : 4503 : c->mask_k=mask_k;
2501 : 4503 : c->mask_a=mask_a;
2502 : 4503 : c->export_mask_k=emask_k;
2503 : 4503 : c->export_mask_a=emask_a;
2504 : 4503 : c->valid=1;
2505 : : }
2506 : :
2507 : : /* This handy macro borrowed from crypto/x509v3/v3_purp.c */
2508 : : #define ku_reject(x, usage) \
2509 : : (((x)->ex_flags & EXFLAG_KUSAGE) && !((x)->ex_kusage & (usage)))
2510 : :
2511 : : #ifndef OPENSSL_NO_EC
2512 : :
2513 : 0 : int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s)
2514 : : {
2515 : : unsigned long alg_k, alg_a;
2516 : 0 : EVP_PKEY *pkey = NULL;
2517 : 0 : int keysize = 0;
2518 : 0 : int signature_nid = 0, md_nid = 0, pk_nid = 0;
2519 : 0 : const SSL_CIPHER *cs = s->s3->tmp.new_cipher;
2520 : :
2521 : 0 : alg_k = cs->algorithm_mkey;
2522 : 0 : alg_a = cs->algorithm_auth;
2523 : :
2524 [ # # ]: 0 : if (SSL_C_IS_EXPORT(cs))
2525 : : {
2526 : : /* ECDH key length in export ciphers must be <= 163 bits */
2527 : 0 : pkey = X509_get_pubkey(x);
2528 [ # # ]: 0 : if (pkey == NULL) return 0;
2529 : 0 : keysize = EVP_PKEY_bits(pkey);
2530 : 0 : EVP_PKEY_free(pkey);
2531 [ # # ]: 0 : if (keysize > 163) return 0;
2532 : : }
2533 : :
2534 : : /* This call populates the ex_flags field correctly */
2535 : 0 : X509_check_purpose(x, -1, 0);
2536 [ # # ][ # # ]: 0 : if ((x->sig_alg) && (x->sig_alg->algorithm))
2537 : : {
2538 : 0 : signature_nid = OBJ_obj2nid(x->sig_alg->algorithm);
2539 : 0 : OBJ_find_sigid_algs(signature_nid, &md_nid, &pk_nid);
2540 : : }
2541 [ # # ]: 0 : if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr)
2542 : : {
2543 : : /* key usage, if present, must allow key agreement */
2544 [ # # ][ # # ]: 0 : if (ku_reject(x, X509v3_KU_KEY_AGREEMENT))
2545 : : {
2546 : 0 : SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT);
2547 : 0 : return 0;
2548 : : }
2549 [ # # ][ # # ]: 0 : if ((alg_k & SSL_kECDHe) && TLS1_get_version(s) < TLS1_2_VERSION)
[ # # ]
2550 : : {
2551 : : /* signature alg must be ECDSA */
2552 [ # # ]: 0 : if (pk_nid != NID_X9_62_id_ecPublicKey)
2553 : : {
2554 : 0 : SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE);
2555 : 0 : return 0;
2556 : : }
2557 : : }
2558 [ # # ][ # # ]: 0 : if ((alg_k & SSL_kECDHr) && TLS1_get_version(s) < TLS1_2_VERSION)
[ # # ]
2559 : : {
2560 : : /* signature alg must be RSA */
2561 : :
2562 [ # # ]: 0 : if (pk_nid != NID_rsaEncryption && pk_nid != NID_rsa)
2563 : : {
2564 : 0 : SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE);
2565 : 0 : return 0;
2566 : : }
2567 : : }
2568 : : }
2569 [ # # ]: 0 : if (alg_a & SSL_aECDSA)
2570 : : {
2571 : : /* key usage, if present, must allow signing */
2572 [ # # ][ # # ]: 0 : if (ku_reject(x, X509v3_KU_DIGITAL_SIGNATURE))
2573 : : {
2574 : 0 : SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_NOT_FOR_SIGNING);
2575 : 0 : return 0;
2576 : : }
2577 : : }
2578 : :
2579 : : return 1; /* all checks are ok */
2580 : : }
2581 : :
2582 : : #endif
2583 : :
2584 : 2006 : static int ssl_get_server_cert_index(const SSL *s)
2585 : : {
2586 : : int idx;
2587 : 1003 : idx = ssl_cipher_get_cert_index(s->s3->tmp.new_cipher);
2588 [ + - ][ - + ]: 1003 : if (idx == SSL_PKEY_RSA_ENC && !s->cert->pkeys[SSL_PKEY_RSA_ENC].x509)
2589 : 0 : idx = SSL_PKEY_RSA_SIGN;
2590 [ - + ]: 1003 : if (idx == -1)
2591 : 0 : SSLerr(SSL_F_SSL_GET_SERVER_CERT_INDEX,ERR_R_INTERNAL_ERROR);
2592 : 1003 : return idx;
2593 : : }
2594 : :
2595 : 937 : CERT_PKEY *ssl_get_server_send_pkey(const SSL *s)
2596 : : {
2597 : : CERT *c;
2598 : : int i;
2599 : :
2600 : 937 : c = s->cert;
2601 [ + - ][ + - ]: 937 : if (!s->s3 || !s->s3->tmp.new_cipher)
2602 : : return NULL;
2603 : 937 : ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
2604 : :
2605 : : #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
2606 : : /* Broken protocol test: return last used certificate: which may
2607 : : * mismatch the one expected.
2608 : : */
2609 : : if (c->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
2610 : : return c->key;
2611 : : #endif
2612 : :
2613 : 937 : i = ssl_get_server_cert_index(s);
2614 : :
2615 : : /* This may or may not be an error. */
2616 [ + - ]: 937 : if (i < 0)
2617 : : return NULL;
2618 : :
2619 : : /* May be NULL. */
2620 : 937 : return &c->pkeys[i];
2621 : : }
2622 : :
2623 : 605 : EVP_PKEY *ssl_get_sign_pkey(SSL *s,const SSL_CIPHER *cipher, const EVP_MD **pmd)
2624 : : {
2625 : : unsigned long alg_a;
2626 : : CERT *c;
2627 : 605 : int idx = -1;
2628 : :
2629 : 605 : alg_a = cipher->algorithm_auth;
2630 : 605 : c=s->cert;
2631 : :
2632 : : #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
2633 : : /* Broken protocol test: use last key: which may
2634 : : * mismatch the one expected.
2635 : : */
2636 : : if (c->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
2637 : : idx = c->key - c->pkeys;
2638 : : else
2639 : : #endif
2640 : :
2641 [ - + ][ # # ]: 605 : if ((alg_a & SSL_aDSS) &&
2642 : 0 : (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
2643 : : idx = SSL_PKEY_DSA_SIGN;
2644 [ + - ]: 605 : else if (alg_a & SSL_aRSA)
2645 : : {
2646 [ + - ]: 605 : if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
2647 : : idx = SSL_PKEY_RSA_SIGN;
2648 [ + - ]: 605 : else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
2649 : 605 : idx = SSL_PKEY_RSA_ENC;
2650 : : }
2651 [ # # ][ # # ]: 0 : else if ((alg_a & SSL_aECDSA) &&
2652 : 0 : (c->pkeys[SSL_PKEY_ECC].privatekey != NULL))
2653 : 0 : idx = SSL_PKEY_ECC;
2654 [ - + ]: 605 : if (idx == -1)
2655 : : {
2656 : 0 : SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
2657 : 0 : return(NULL);
2658 : : }
2659 [ + - ]: 605 : if (pmd)
2660 : 605 : *pmd = c->pkeys[idx].digest;
2661 : 605 : return c->pkeys[idx].privatekey;
2662 : : }
2663 : :
2664 : : #ifndef OPENSSL_NO_TLSEXT
2665 : 66 : int ssl_get_server_cert_serverinfo(SSL *s, const unsigned char **serverinfo,
2666 : : size_t *serverinfo_length)
2667 : : {
2668 : 66 : CERT *c = NULL;
2669 : 66 : int i = 0;
2670 : 66 : *serverinfo_length = 0;
2671 : :
2672 : 66 : c = s->cert;
2673 : 66 : i = ssl_get_server_cert_index(s);
2674 : :
2675 [ + - ]: 66 : if (i == -1)
2676 : : return 0;
2677 [ + - ]: 66 : if (c->pkeys[i].serverinfo == NULL)
2678 : : return 0;
2679 : :
2680 : 66 : *serverinfo = c->pkeys[i].serverinfo;
2681 : 66 : *serverinfo_length = c->pkeys[i].serverinfo_length;
2682 : 66 : return 1;
2683 : : }
2684 : : #endif
2685 : :
2686 : 2380 : void ssl_update_cache(SSL *s,int mode)
2687 : : {
2688 : : int i;
2689 : :
2690 : : /* If the session_id_length is 0, we are not supposed to cache it,
2691 : : * and it would be rather hard to do anyway :-) */
2692 [ + + ]: 2380 : if (s->session->session_id_length == 0) return;
2693 : :
2694 : 1564 : i=s->session_ctx->session_cache_mode;
2695 [ + + ][ + + ]: 1564 : if ((i & mode) && (!s->hit)
2696 [ + - ]: 363 : && ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE)
2697 [ + - ]: 363 : || SSL_CTX_add_session(s->session_ctx,s->session))
2698 [ - + ]: 363 : && (s->session_ctx->new_session_cb != NULL))
2699 : : {
2700 : 0 : CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
2701 [ # # ]: 0 : if (!s->session_ctx->new_session_cb(s,s->session))
2702 : 0 : SSL_SESSION_free(s->session);
2703 : : }
2704 : :
2705 : : /* auto flush every 255 connections */
2706 [ + - ][ + + ]: 1564 : if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
2707 : : ((i & mode) == mode))
2708 : : {
2709 [ - + ]: 374 : if ( (((mode & SSL_SESS_CACHE_CLIENT)
2710 : 0 : ?s->session_ctx->stats.sess_connect_good
2711 [ - + ]: 374 : :s->session_ctx->stats.sess_accept_good) & 0xff) == 0xff)
2712 : : {
2713 : 0 : SSL_CTX_flush_sessions(s->session_ctx,(unsigned long)time(NULL));
2714 : : }
2715 : : }
2716 : : }
2717 : :
2718 : 0 : const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx)
2719 : : {
2720 : 0 : return ctx->method;
2721 : : }
2722 : :
2723 : 0 : const SSL_METHOD *SSL_get_ssl_method(SSL *s)
2724 : : {
2725 : 0 : return(s->method);
2726 : : }
2727 : :
2728 : 0 : int SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth)
2729 : : {
2730 : 0 : int conn= -1;
2731 : 0 : int ret=1;
2732 : :
2733 [ # # ]: 0 : if (s->method != meth)
2734 : : {
2735 [ # # ]: 0 : if (s->handshake_func != NULL)
2736 : 0 : conn=(s->handshake_func == s->method->ssl_connect);
2737 : :
2738 [ # # ]: 0 : if (s->method->version == meth->version)
2739 : 0 : s->method=meth;
2740 : : else
2741 : : {
2742 : 0 : s->method->ssl_free(s);
2743 : 0 : s->method=meth;
2744 : 0 : ret=s->method->ssl_new(s);
2745 : : }
2746 : :
2747 [ # # ]: 0 : if (conn == 1)
2748 : 0 : s->handshake_func=meth->ssl_connect;
2749 [ # # ]: 0 : else if (conn == 0)
2750 : 0 : s->handshake_func=meth->ssl_accept;
2751 : : }
2752 : 0 : return(ret);
2753 : : }
2754 : :
2755 : 101247 : int SSL_get_error(const SSL *s,int i)
2756 : : {
2757 : : int reason;
2758 : : unsigned long l;
2759 : : BIO *bio;
2760 : :
2761 [ + + ]: 101247 : if (i > 0) return(SSL_ERROR_NONE);
2762 : :
2763 : : /* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
2764 : : * etc, where we do encode the error */
2765 [ + + ]: 86883 : if ((l=ERR_peek_error()) != 0)
2766 : : {
2767 [ + - ]: 22 : if (ERR_GET_LIB(l) == ERR_LIB_SYS)
2768 : : return(SSL_ERROR_SYSCALL);
2769 : : else
2770 : 22 : return(SSL_ERROR_SSL);
2771 : : }
2772 : :
2773 [ + - ][ + + ]: 86861 : if ((i < 0) && SSL_want_read(s))
2774 : : {
2775 : 68389 : bio=SSL_get_rbio(s);
2776 [ - + ]: 68389 : if (BIO_should_read(bio))
2777 : : return(SSL_ERROR_WANT_READ);
2778 [ # # ]: 0 : else if (BIO_should_write(bio))
2779 : : /* This one doesn't make too much sense ... We never try
2780 : : * to write to the rbio, and an application program where
2781 : : * rbio and wbio are separate couldn't even know what it
2782 : : * should wait for.
2783 : : * However if we ever set s->rwstate incorrectly
2784 : : * (so that we have SSL_want_read(s) instead of
2785 : : * SSL_want_write(s)) and rbio and wbio *are* the same,
2786 : : * this test works around that bug; so it might be safer
2787 : : * to keep it. */
2788 : : return(SSL_ERROR_WANT_WRITE);
2789 [ # # ]: 0 : else if (BIO_should_io_special(bio))
2790 : : {
2791 : 0 : reason=BIO_get_retry_reason(bio);
2792 [ # # ]: 0 : if (reason == BIO_RR_CONNECT)
2793 : : return(SSL_ERROR_WANT_CONNECT);
2794 [ # # ]: 0 : else if (reason == BIO_RR_ACCEPT)
2795 : : return(SSL_ERROR_WANT_ACCEPT);
2796 : : else
2797 : 0 : return(SSL_ERROR_SYSCALL); /* unknown */
2798 : : }
2799 : : }
2800 : :
2801 [ + - ][ + - ]: 18472 : if ((i < 0) && SSL_want_write(s))
2802 : : {
2803 : 18472 : bio=SSL_get_wbio(s);
2804 [ - + ]: 18472 : if (BIO_should_write(bio))
2805 : : return(SSL_ERROR_WANT_WRITE);
2806 [ # # ]: 0 : else if (BIO_should_read(bio))
2807 : : /* See above (SSL_want_read(s) with BIO_should_write(bio)) */
2808 : : return(SSL_ERROR_WANT_READ);
2809 [ # # ]: 0 : else if (BIO_should_io_special(bio))
2810 : : {
2811 : 0 : reason=BIO_get_retry_reason(bio);
2812 [ # # ]: 0 : if (reason == BIO_RR_CONNECT)
2813 : : return(SSL_ERROR_WANT_CONNECT);
2814 [ # # ]: 0 : else if (reason == BIO_RR_ACCEPT)
2815 : : return(SSL_ERROR_WANT_ACCEPT);
2816 : : else
2817 : 0 : return(SSL_ERROR_SYSCALL);
2818 : : }
2819 : : }
2820 [ # # ][ # # ]: 0 : if ((i < 0) && SSL_want_x509_lookup(s))
2821 : : {
2822 : : return(SSL_ERROR_WANT_X509_LOOKUP);
2823 : : }
2824 : :
2825 [ # # ]: 0 : if (i == 0)
2826 : : {
2827 [ # # ]: 0 : if (s->version == SSL2_VERSION)
2828 : : {
2829 : : /* assume it is the socket being closed */
2830 : : return(SSL_ERROR_ZERO_RETURN);
2831 : : }
2832 : : else
2833 : : {
2834 [ # # ][ # # ]: 0 : if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) &&
2835 : 0 : (s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY))
2836 : : return(SSL_ERROR_ZERO_RETURN);
2837 : : }
2838 : : }
2839 : 0 : return(SSL_ERROR_SYSCALL);
2840 : : }
2841 : :
2842 : 0 : int SSL_do_handshake(SSL *s)
2843 : : {
2844 : 0 : int ret=1;
2845 : :
2846 [ # # ]: 0 : if (s->handshake_func == NULL)
2847 : : {
2848 : 0 : SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
2849 : 0 : return(-1);
2850 : : }
2851 : :
2852 : 0 : s->method->ssl_renegotiate_check(s);
2853 : :
2854 [ # # ][ # # ]: 0 : if (SSL_in_init(s) || SSL_in_before(s))
2855 : : {
2856 : 0 : ret=s->handshake_func(s);
2857 : : }
2858 : 0 : return(ret);
2859 : : }
2860 : :
2861 : : /* For the next 2 functions, SSL_clear() sets shutdown and so
2862 : : * one of these calls will reset it */
2863 : 1212 : void SSL_set_accept_state(SSL *s)
2864 : : {
2865 : 1212 : s->server=1;
2866 : 1212 : s->shutdown=0;
2867 : 1212 : s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
2868 : 1212 : s->handshake_func=s->method->ssl_accept;
2869 : : /* clear the current cipher */
2870 : 1212 : ssl_clear_cipher_ctx(s);
2871 : 1212 : ssl_clear_hash_ctx(&s->read_hash);
2872 : 1212 : ssl_clear_hash_ctx(&s->write_hash);
2873 : 1212 : }
2874 : :
2875 : 1212 : void SSL_set_connect_state(SSL *s)
2876 : : {
2877 : 1212 : s->server=0;
2878 : 1212 : s->shutdown=0;
2879 : 1212 : s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
2880 : 1212 : s->handshake_func=s->method->ssl_connect;
2881 : : /* clear the current cipher */
2882 : 1212 : ssl_clear_cipher_ctx(s);
2883 : 1212 : ssl_clear_hash_ctx(&s->read_hash);
2884 : 1212 : ssl_clear_hash_ctx(&s->write_hash);
2885 : 1212 : }
2886 : :
2887 : 0 : int ssl_undefined_function(SSL *s)
2888 : : {
2889 : 0 : SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2890 : 0 : return(0);
2891 : : }
2892 : :
2893 : 0 : int ssl_undefined_void_function(void)
2894 : : {
2895 : 0 : SSLerr(SSL_F_SSL_UNDEFINED_VOID_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2896 : 0 : return(0);
2897 : : }
2898 : :
2899 : 670 : int ssl_undefined_const_function(const SSL *s)
2900 : : {
2901 : 670 : SSLerr(SSL_F_SSL_UNDEFINED_CONST_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2902 : 670 : return(0);
2903 : : }
2904 : :
2905 : 0 : SSL_METHOD *ssl_bad_method(int ver)
2906 : : {
2907 : 0 : SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2908 : 0 : return(NULL);
2909 : : }
2910 : :
2911 : 1190 : const char *SSL_get_version(const SSL *s)
2912 : : {
2913 [ + + ]: 1190 : if (s->version == TLS1_2_VERSION)
2914 : : return("TLSv1.2");
2915 [ + - ]: 990 : else if (s->version == TLS1_1_VERSION)
2916 : : return("TLSv1.1");
2917 [ + + ]: 990 : else if (s->version == TLS1_VERSION)
2918 : : return("TLSv1");
2919 [ + + ]: 385 : else if (s->version == SSL3_VERSION)
2920 : : return("SSLv3");
2921 [ - + ]: 132 : else if (s->version == SSL2_VERSION)
2922 : : return("SSLv2");
2923 : : else
2924 : 0 : return("unknown");
2925 : : }
2926 : :
2927 : 0 : SSL *SSL_dup(SSL *s)
2928 : : {
2929 : : STACK_OF(X509_NAME) *sk;
2930 : : X509_NAME *xn;
2931 : : SSL *ret;
2932 : : int i;
2933 : :
2934 [ # # ]: 0 : if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
2935 : : return(NULL);
2936 : :
2937 : 0 : ret->version = s->version;
2938 : 0 : ret->type = s->type;
2939 : 0 : ret->method = s->method;
2940 : :
2941 [ # # ]: 0 : if (s->session != NULL)
2942 : : {
2943 : : /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
2944 : 0 : SSL_copy_session_id(ret,s);
2945 : : }
2946 : : else
2947 : : {
2948 : : /* No session has been established yet, so we have to expect
2949 : : * that s->cert or ret->cert will be changed later --
2950 : : * they should not both point to the same object,
2951 : : * and thus we can't use SSL_copy_session_id. */
2952 : :
2953 : 0 : ret->method->ssl_free(ret);
2954 : 0 : ret->method = s->method;
2955 : 0 : ret->method->ssl_new(ret);
2956 : :
2957 [ # # ]: 0 : if (s->cert != NULL)
2958 : : {
2959 [ # # ]: 0 : if (ret->cert != NULL)
2960 : : {
2961 : 0 : ssl_cert_free(ret->cert);
2962 : : }
2963 : 0 : ret->cert = ssl_cert_dup(s->cert);
2964 [ # # ]: 0 : if (ret->cert == NULL)
2965 : : goto err;
2966 : : }
2967 : :
2968 : 0 : SSL_set_session_id_context(ret,
2969 : 0 : s->sid_ctx, s->sid_ctx_length);
2970 : : }
2971 : :
2972 : 0 : ret->options=s->options;
2973 : 0 : ret->mode=s->mode;
2974 : 0 : SSL_set_max_cert_list(ret,SSL_get_max_cert_list(s));
2975 : 0 : SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
2976 : 0 : ret->msg_callback = s->msg_callback;
2977 : 0 : ret->msg_callback_arg = s->msg_callback_arg;
2978 : 0 : SSL_set_verify(ret,SSL_get_verify_mode(s),
2979 : : SSL_get_verify_callback(s));
2980 : 0 : SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
2981 : 0 : ret->generate_session_id = s->generate_session_id;
2982 : :
2983 : 0 : SSL_set_info_callback(ret,SSL_get_info_callback(s));
2984 : :
2985 : 0 : ret->debug=s->debug;
2986 : :
2987 : : /* copy app data, a little dangerous perhaps */
2988 [ # # ]: 0 : if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data))
2989 : : goto err;
2990 : :
2991 : : /* setup rbio, and wbio */
2992 [ # # ]: 0 : if (s->rbio != NULL)
2993 : : {
2994 [ # # ]: 0 : if (!BIO_dup_state(s->rbio,(char *)&ret->rbio))
2995 : : goto err;
2996 : : }
2997 [ # # ]: 0 : if (s->wbio != NULL)
2998 : : {
2999 [ # # ]: 0 : if (s->wbio != s->rbio)
3000 : : {
3001 [ # # ]: 0 : if (!BIO_dup_state(s->wbio,(char *)&ret->wbio))
3002 : : goto err;
3003 : : }
3004 : : else
3005 : 0 : ret->wbio=ret->rbio;
3006 : : }
3007 : 0 : ret->rwstate = s->rwstate;
3008 : 0 : ret->in_handshake = s->in_handshake;
3009 : 0 : ret->handshake_func = s->handshake_func;
3010 : 0 : ret->server = s->server;
3011 : 0 : ret->renegotiate = s->renegotiate;
3012 : 0 : ret->new_session = s->new_session;
3013 : 0 : ret->quiet_shutdown = s->quiet_shutdown;
3014 : 0 : ret->shutdown=s->shutdown;
3015 : 0 : ret->state=s->state; /* SSL_dup does not really work at any state, though */
3016 : 0 : ret->rstate=s->rstate;
3017 : 0 : ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */
3018 : 0 : ret->hit=s->hit;
3019 : :
3020 : 0 : X509_VERIFY_PARAM_inherit(ret->param, s->param);
3021 : :
3022 : : /* dup the cipher_list and cipher_list_by_id stacks */
3023 [ # # ]: 0 : if (s->cipher_list != NULL)
3024 : : {
3025 [ # # ]: 0 : if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
3026 : : goto err;
3027 : : }
3028 [ # # ]: 0 : if (s->cipher_list_by_id != NULL)
3029 [ # # ]: 0 : if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
3030 : : == NULL)
3031 : : goto err;
3032 : :
3033 : : /* Dup the client_CA list */
3034 [ # # ]: 0 : if (s->client_CA != NULL)
3035 : : {
3036 [ # # ]: 0 : if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
3037 : 0 : ret->client_CA=sk;
3038 [ # # ]: 0 : for (i=0; i<sk_X509_NAME_num(sk); i++)
3039 : : {
3040 : 0 : xn=sk_X509_NAME_value(sk,i);
3041 [ # # ]: 0 : if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
3042 : : {
3043 : 0 : X509_NAME_free(xn);
3044 : 0 : goto err;
3045 : : }
3046 : : }
3047 : : }
3048 : :
3049 : : if (0)
3050 : : {
3051 : : err:
3052 [ # # ]: 0 : if (ret != NULL) SSL_free(ret);
3053 : : ret=NULL;
3054 : : }
3055 : 0 : return(ret);
3056 : : }
3057 : :
3058 : 8464 : void ssl_clear_cipher_ctx(SSL *s)
3059 : : {
3060 [ + + ]: 8464 : if (s->enc_read_ctx != NULL)
3061 : : {
3062 : 2380 : EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
3063 : 2380 : OPENSSL_free(s->enc_read_ctx);
3064 : 2380 : s->enc_read_ctx=NULL;
3065 : : }
3066 [ + + ]: 8464 : if (s->enc_write_ctx != NULL)
3067 : : {
3068 : 2380 : EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
3069 : 2380 : OPENSSL_free(s->enc_write_ctx);
3070 : 2380 : s->enc_write_ctx=NULL;
3071 : : }
3072 : : #ifndef OPENSSL_NO_COMP
3073 [ - + ]: 8464 : if (s->expand != NULL)
3074 : : {
3075 : 0 : COMP_CTX_free(s->expand);
3076 : 0 : s->expand=NULL;
3077 : : }
3078 [ - + ]: 8464 : if (s->compress != NULL)
3079 : : {
3080 : 0 : COMP_CTX_free(s->compress);
3081 : 0 : s->compress=NULL;
3082 : : }
3083 : : #endif
3084 : 8464 : }
3085 : :
3086 : 0 : X509 *SSL_get_certificate(const SSL *s)
3087 : : {
3088 [ # # ]: 0 : if (s->cert != NULL)
3089 : 0 : return(s->cert->key->x509);
3090 : : else
3091 : : return(NULL);
3092 : : }
3093 : :
3094 : 0 : EVP_PKEY *SSL_get_privatekey(const SSL *s)
3095 : : {
3096 [ # # ]: 0 : if (s->cert != NULL)
3097 : 0 : return(s->cert->key->privatekey);
3098 : : else
3099 : : return(NULL);
3100 : : }
3101 : :
3102 : 0 : X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx)
3103 : : {
3104 [ # # ]: 0 : if (ctx->cert != NULL)
3105 : 0 : return ctx->cert->key->x509;
3106 : : else
3107 : : return NULL;
3108 : : }
3109 : :
3110 : 0 : EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx)
3111 : : {
3112 [ # # ]: 0 : if (ctx->cert != NULL)
3113 : 0 : return ctx->cert->key->privatekey;
3114 : : else
3115 : : return NULL ;
3116 : : }
3117 : :
3118 : 1190 : const SSL_CIPHER *SSL_get_current_cipher(const SSL *s)
3119 : : {
3120 [ + - ][ + + ]: 1190 : if ((s->session != NULL) && (s->session->cipher != NULL))
3121 : 1168 : return(s->session->cipher);
3122 : : return(NULL);
3123 : : }
3124 : : #ifdef OPENSSL_NO_COMP
3125 : : const void *SSL_get_current_compression(SSL *s)
3126 : : {
3127 : : return NULL;
3128 : : }
3129 : : const void *SSL_get_current_expansion(SSL *s)
3130 : : {
3131 : : return NULL;
3132 : : }
3133 : : #else
3134 : :
3135 : 0 : const COMP_METHOD *SSL_get_current_compression(SSL *s)
3136 : : {
3137 [ # # ]: 0 : if (s->compress != NULL)
3138 : 0 : return(s->compress->meth);
3139 : : return(NULL);
3140 : : }
3141 : :
3142 : 0 : const COMP_METHOD *SSL_get_current_expansion(SSL *s)
3143 : : {
3144 [ # # ]: 0 : if (s->expand != NULL)
3145 : 0 : return(s->expand->meth);
3146 : : return(NULL);
3147 : : }
3148 : : #endif
3149 : :
3150 : 2160 : int ssl_init_wbio_buffer(SSL *s,int push)
3151 : : {
3152 : : BIO *bbio;
3153 : :
3154 [ + - ]: 2160 : if (s->bbio == NULL)
3155 : : {
3156 : 2160 : bbio=BIO_new(BIO_f_buffer());
3157 [ + - ]: 2160 : if (bbio == NULL) return(0);
3158 : 2160 : s->bbio=bbio;
3159 : : }
3160 : : else
3161 : : {
3162 : 0 : bbio=s->bbio;
3163 [ # # ]: 0 : if (s->bbio == s->wbio)
3164 : 0 : s->wbio=BIO_pop(s->wbio);
3165 : : }
3166 : 2160 : (void)BIO_reset(bbio);
3167 : : /* if (!BIO_set_write_buffer_size(bbio,16*1024)) */
3168 [ - + ]: 2160 : if (!BIO_set_read_buffer_size(bbio,1))
3169 : : {
3170 : 0 : SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB);
3171 : 0 : return(0);
3172 : : }
3173 [ + + ]: 2160 : if (push)
3174 : : {
3175 [ + - ]: 1280 : if (s->wbio != bbio)
3176 : 1280 : s->wbio=BIO_push(bbio,s->wbio);
3177 : : }
3178 : : else
3179 : : {
3180 [ - + ]: 880 : if (s->wbio == bbio)
3181 : 0 : s->wbio=BIO_pop(bbio);
3182 : : }
3183 : : return(1);
3184 : : }
3185 : :
3186 : 8556 : void ssl_free_wbio_buffer(SSL *s)
3187 : : {
3188 [ + + ]: 8556 : if (s->bbio == NULL) return;
3189 : :
3190 [ + - ]: 2160 : if (s->bbio == s->wbio)
3191 : : {
3192 : : /* remove buffering */
3193 : 2160 : s->wbio=BIO_pop(s->wbio);
3194 : : #ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids adding one more preprocessor symbol */
3195 : : assert(s->wbio != NULL);
3196 : : #endif
3197 : : }
3198 : 2160 : BIO_free(s->bbio);
3199 : 2160 : s->bbio=NULL;
3200 : : }
3201 : :
3202 : 0 : void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
3203 : : {
3204 : 0 : ctx->quiet_shutdown=mode;
3205 : 0 : }
3206 : :
3207 : 0 : int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx)
3208 : : {
3209 : 0 : return(ctx->quiet_shutdown);
3210 : : }
3211 : :
3212 : 0 : void SSL_set_quiet_shutdown(SSL *s,int mode)
3213 : : {
3214 : 0 : s->quiet_shutdown=mode;
3215 : 0 : }
3216 : :
3217 : 0 : int SSL_get_quiet_shutdown(const SSL *s)
3218 : : {
3219 : 0 : return(s->quiet_shutdown);
3220 : : }
3221 : :
3222 : 0 : void SSL_set_shutdown(SSL *s,int mode)
3223 : : {
3224 : 0 : s->shutdown=mode;
3225 : 0 : }
3226 : :
3227 : 0 : int SSL_get_shutdown(const SSL *s)
3228 : : {
3229 : 0 : return(s->shutdown);
3230 : : }
3231 : :
3232 : 10158 : int SSL_version(const SSL *s)
3233 : : {
3234 : 10158 : return(s->version);
3235 : : }
3236 : :
3237 : 0 : SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl)
3238 : : {
3239 : 0 : return(ssl->ctx);
3240 : : }
3241 : :
3242 : 0 : SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx)
3243 : : {
3244 [ # # ]: 0 : if (ssl->ctx == ctx)
3245 : : return ssl->ctx;
3246 : : #ifndef OPENSSL_NO_TLSEXT
3247 [ # # ]: 0 : if (ctx == NULL)
3248 : 0 : ctx = ssl->initial_ctx;
3249 : : #endif
3250 [ # # ]: 0 : if (ssl->cert != NULL)
3251 : 0 : ssl_cert_free(ssl->cert);
3252 : 0 : ssl->cert = ssl_cert_dup(ctx->cert);
3253 : 0 : CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
3254 [ # # ]: 0 : if (ssl->ctx != NULL)
3255 : 0 : SSL_CTX_free(ssl->ctx); /* decrement reference count */
3256 : 0 : ssl->ctx = ctx;
3257 : 0 : return(ssl->ctx);
3258 : : }
3259 : :
3260 : : #ifndef OPENSSL_NO_STDIO
3261 : 462 : int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
3262 : : {
3263 : 462 : return(X509_STORE_set_default_paths(ctx->cert_store));
3264 : : }
3265 : :
3266 : 1124 : int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
3267 : : const char *CApath)
3268 : : {
3269 : 1124 : return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
3270 : : }
3271 : : #endif
3272 : :
3273 : 0 : void SSL_set_info_callback(SSL *ssl,
3274 : : void (*cb)(const SSL *ssl,int type,int val))
3275 : : {
3276 : 0 : ssl->info_callback=cb;
3277 : 0 : }
3278 : :
3279 : : /* One compiler (Diab DCC) doesn't like argument names in returned
3280 : : function pointer. */
3281 : 0 : void (*SSL_get_info_callback(const SSL *ssl))(const SSL * /*ssl*/,int /*type*/,int /*val*/)
3282 : : {
3283 : 0 : return ssl->info_callback;
3284 : : }
3285 : :
3286 : 304729 : int SSL_state(const SSL *ssl)
3287 : : {
3288 : 304729 : return(ssl->state);
3289 : : }
3290 : :
3291 : 0 : void SSL_set_state(SSL *ssl, int state)
3292 : : {
3293 : 0 : ssl->state = state;
3294 : 0 : }
3295 : :
3296 : 0 : void SSL_set_verify_result(SSL *ssl,long arg)
3297 : : {
3298 : 0 : ssl->verify_result=arg;
3299 : 0 : }
3300 : :
3301 : 0 : long SSL_get_verify_result(const SSL *ssl)
3302 : : {
3303 : 0 : return(ssl->verify_result);
3304 : : }
3305 : :
3306 : 0 : int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
3307 : : CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
3308 : : {
3309 : 0 : return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp,
3310 : : new_func, dup_func, free_func);
3311 : : }
3312 : :
3313 : 0 : int SSL_set_ex_data(SSL *s,int idx,void *arg)
3314 : : {
3315 : 0 : return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
3316 : : }
3317 : :
3318 : 0 : void *SSL_get_ex_data(const SSL *s,int idx)
3319 : : {
3320 : 0 : return(CRYPTO_get_ex_data(&s->ex_data,idx));
3321 : : }
3322 : :
3323 : 0 : int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
3324 : : CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
3325 : : {
3326 : 0 : return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp,
3327 : : new_func, dup_func, free_func);
3328 : : }
3329 : :
3330 : 0 : int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
3331 : : {
3332 : 0 : return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
3333 : : }
3334 : :
3335 : 0 : void *SSL_CTX_get_ex_data(const SSL_CTX *s,int idx)
3336 : : {
3337 : 0 : return(CRYPTO_get_ex_data(&s->ex_data,idx));
3338 : : }
3339 : :
3340 : 0 : int ssl_ok(SSL *s)
3341 : : {
3342 : 0 : return(1);
3343 : : }
3344 : :
3345 : 0 : X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *ctx)
3346 : : {
3347 : 0 : return(ctx->cert_store);
3348 : : }
3349 : :
3350 : 0 : void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
3351 : : {
3352 [ # # ]: 0 : if (ctx->cert_store != NULL)
3353 : 0 : X509_STORE_free(ctx->cert_store);
3354 : 0 : ctx->cert_store=store;
3355 : 0 : }
3356 : :
3357 : 105333 : int SSL_want(const SSL *s)
3358 : : {
3359 : 105333 : return(s->rwstate);
3360 : : }
3361 : :
3362 : : /*!
3363 : : * \brief Set the callback for generating temporary RSA keys.
3364 : : * \param ctx the SSL context.
3365 : : * \param cb the callback
3366 : : */
3367 : :
3368 : : #ifndef OPENSSL_NO_RSA
3369 : 893 : void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
3370 : : int is_export,
3371 : : int keylength))
3372 : : {
3373 : 893 : SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb);
3374 : 893 : }
3375 : :
3376 : 0 : void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
3377 : : int is_export,
3378 : : int keylength))
3379 : : {
3380 : 0 : SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb);
3381 : 0 : }
3382 : : #endif
3383 : :
3384 : : #ifdef DOXYGEN
3385 : : /*!
3386 : : * \brief The RSA temporary key callback function.
3387 : : * \param ssl the SSL session.
3388 : : * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
3389 : : * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
3390 : : * of the required key in bits.
3391 : : * \return the temporary RSA key.
3392 : : * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
3393 : : */
3394 : :
3395 : : RSA *cb(SSL *ssl,int is_export,int keylength)
3396 : : {}
3397 : : #endif
3398 : :
3399 : : /*!
3400 : : * \brief Set the callback for generating temporary DH keys.
3401 : : * \param ctx the SSL context.
3402 : : * \param dh the callback
3403 : : */
3404 : :
3405 : : #ifndef OPENSSL_NO_DH
3406 : 0 : void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
3407 : : int keylength))
3408 : : {
3409 : 0 : SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh);
3410 : 0 : }
3411 : :
3412 : 0 : void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
3413 : : int keylength))
3414 : : {
3415 : 0 : SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh);
3416 : 0 : }
3417 : : #endif
3418 : :
3419 : : #ifndef OPENSSL_NO_ECDH
3420 : 0 : void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx,EC_KEY *(*ecdh)(SSL *ssl,int is_export,
3421 : : int keylength))
3422 : : {
3423 : 0 : SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh);
3424 : 0 : }
3425 : :
3426 : 0 : void SSL_set_tmp_ecdh_callback(SSL *ssl,EC_KEY *(*ecdh)(SSL *ssl,int is_export,
3427 : : int keylength))
3428 : : {
3429 : 0 : SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh);
3430 : 0 : }
3431 : : #endif
3432 : :
3433 : : #ifndef OPENSSL_NO_PSK
3434 : 22 : int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint)
3435 : : {
3436 [ + - ][ - + ]: 22 : if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN)
3437 : : {
3438 : 0 : SSLerr(SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT, SSL_R_DATA_LENGTH_TOO_LONG);
3439 : 0 : return 0;
3440 : : }
3441 [ - + ]: 22 : if (ctx->psk_identity_hint != NULL)
3442 : 0 : OPENSSL_free(ctx->psk_identity_hint);
3443 [ + - ]: 22 : if (identity_hint != NULL)
3444 : : {
3445 : 22 : ctx->psk_identity_hint = BUF_strdup(identity_hint);
3446 [ + - ]: 22 : if (ctx->psk_identity_hint == NULL)
3447 : : return 0;
3448 : : }
3449 : : else
3450 : 0 : ctx->psk_identity_hint = NULL;
3451 : : return 1;
3452 : : }
3453 : :
3454 : 0 : int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint)
3455 : : {
3456 [ # # ]: 0 : if (s == NULL)
3457 : : return 0;
3458 : :
3459 [ # # ]: 0 : if (s->session == NULL)
3460 : : return 1; /* session not created yet, ignored */
3461 : :
3462 [ # # ][ # # ]: 0 : if (identity_hint != NULL && strlen(identity_hint) > PSK_MAX_IDENTITY_LEN)
3463 : : {
3464 : 0 : SSLerr(SSL_F_SSL_USE_PSK_IDENTITY_HINT, SSL_R_DATA_LENGTH_TOO_LONG);
3465 : 0 : return 0;
3466 : : }
3467 [ # # ]: 0 : if (s->session->psk_identity_hint != NULL)
3468 : 0 : OPENSSL_free(s->session->psk_identity_hint);
3469 [ # # ]: 0 : if (identity_hint != NULL)
3470 : : {
3471 : 0 : s->session->psk_identity_hint = BUF_strdup(identity_hint);
3472 [ # # ]: 0 : if (s->session->psk_identity_hint == NULL)
3473 : : return 0;
3474 : : }
3475 : : else
3476 : 0 : s->session->psk_identity_hint = NULL;
3477 : : return 1;
3478 : : }
3479 : :
3480 : 0 : const char *SSL_get_psk_identity_hint(const SSL *s)
3481 : : {
3482 [ # # ][ # # ]: 0 : if (s == NULL || s->session == NULL)
3483 : : return NULL;
3484 : 0 : return(s->session->psk_identity_hint);
3485 : : }
3486 : :
3487 : 0 : const char *SSL_get_psk_identity(const SSL *s)
3488 : : {
3489 [ # # ][ # # ]: 0 : if (s == NULL || s->session == NULL)
3490 : : return NULL;
3491 : 0 : return(s->session->psk_identity);
3492 : : }
3493 : :
3494 : 0 : void SSL_set_psk_client_callback(SSL *s,
3495 : : unsigned int (*cb)(SSL *ssl, const char *hint,
3496 : : char *identity, unsigned int max_identity_len, unsigned char *psk,
3497 : : unsigned int max_psk_len))
3498 : : {
3499 : 0 : s->psk_client_callback = cb;
3500 : 0 : }
3501 : :
3502 : 22 : void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx,
3503 : : unsigned int (*cb)(SSL *ssl, const char *hint,
3504 : : char *identity, unsigned int max_identity_len, unsigned char *psk,
3505 : : unsigned int max_psk_len))
3506 : : {
3507 : 22 : ctx->psk_client_callback = cb;
3508 : 22 : }
3509 : :
3510 : 0 : void SSL_set_psk_server_callback(SSL *s,
3511 : : unsigned int (*cb)(SSL *ssl, const char *identity,
3512 : : unsigned char *psk, unsigned int max_psk_len))
3513 : : {
3514 : 0 : s->psk_server_callback = cb;
3515 : 0 : }
3516 : :
3517 : 22 : void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx,
3518 : : unsigned int (*cb)(SSL *ssl, const char *identity,
3519 : : unsigned char *psk, unsigned int max_psk_len))
3520 : : {
3521 : 22 : ctx->psk_server_callback = cb;
3522 : 22 : }
3523 : : #endif
3524 : :
3525 : 0 : void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
3526 : : {
3527 : 0 : SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
3528 : 0 : }
3529 : 0 : void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
3530 : : {
3531 : 0 : SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
3532 : 0 : }
3533 : :
3534 : 0 : void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx,
3535 : : int (*cb)(SSL *ssl, int is_forward_secure))
3536 : : {
3537 : 0 : SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB,
3538 : : (void (*)(void))cb);
3539 : 0 : }
3540 : 0 : void SSL_set_not_resumable_session_callback(SSL *ssl,
3541 : : int (*cb)(SSL *ssl, int is_forward_secure))
3542 : : {
3543 : 0 : SSL_callback_ctrl(ssl, SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB,
3544 : : (void (*)(void))cb);
3545 : 0 : }
3546 : :
3547 : : /* Allocates new EVP_MD_CTX and sets pointer to it into given pointer
3548 : : * vairable, freeing EVP_MD_CTX previously stored in that variable, if
3549 : : * any. If EVP_MD pointer is passed, initializes ctx with this md
3550 : : * Returns newly allocated ctx;
3551 : : */
3552 : :
3553 : 4760 : EVP_MD_CTX *ssl_replace_hash(EVP_MD_CTX **hash,const EVP_MD *md)
3554 : : {
3555 : 4760 : ssl_clear_hash_ctx(hash);
3556 : 4760 : *hash = EVP_MD_CTX_create();
3557 [ + + ]: 4760 : if (md) EVP_DigestInit_ex(*hash,md,NULL);
3558 : 4760 : return *hash;
3559 : : }
3560 : 21688 : void ssl_clear_hash_ctx(EVP_MD_CTX **hash)
3561 : : {
3562 : :
3563 [ + + ]: 21688 : if (*hash) EVP_MD_CTX_destroy(*hash);
3564 : 21688 : *hash=NULL;
3565 : 21688 : }
3566 : :
3567 : 0 : void SSL_set_debug(SSL *s, int debug)
3568 : : {
3569 : 0 : s->debug = debug;
3570 : 0 : }
3571 : :
3572 : 0 : int SSL_cache_hit(SSL *s)
3573 : : {
3574 : 0 : return s->hit;
3575 : : }
3576 : :
3577 : 0 : int SSL_is_server(SSL *s)
3578 : : {
3579 : 0 : return s->server;
3580 : : }
3581 : :
3582 : 0 : void SSL_set_security_level(SSL *s, int level)
3583 : : {
3584 : 0 : s->cert->sec_level = level;
3585 : 0 : }
3586 : :
3587 : 168915 : int SSL_get_security_level(const SSL *s)
3588 : : {
3589 : 168915 : return s->cert->sec_level;
3590 : : }
3591 : :
3592 : 0 : void SSL_set_security_callback(SSL *s, int (*cb)(SSL *s, SSL_CTX *ctx, int op, int bits, int nid, void *other, void *ex))
3593 : : {
3594 : 0 : s->cert->sec_cb = cb;
3595 : 0 : }
3596 : :
3597 : 0 : int (*SSL_get_security_callback(const SSL *s))(SSL *s, SSL_CTX *ctx, int op, int bits, int nid, void *other, void *ex)
3598 : : {
3599 : 0 : return s->cert->sec_cb;
3600 : : }
3601 : :
3602 : 0 : void SSL_set0_security_ex_data(SSL *s, void *ex)
3603 : : {
3604 : 0 : s->cert->sec_ex = ex;
3605 : 0 : }
3606 : :
3607 : 0 : void *SSL_get0_security_ex_data(const SSL *s)
3608 : : {
3609 : 0 : return s->cert->sec_ex;
3610 : : }
3611 : :
3612 : 1786 : void SSL_CTX_set_security_level(SSL_CTX *ctx, int level)
3613 : : {
3614 : 1786 : ctx->cert->sec_level = level;
3615 : 1786 : }
3616 : :
3617 : 2811 : int SSL_CTX_get_security_level(const SSL_CTX *ctx)
3618 : : {
3619 : 2811 : return ctx->cert->sec_level;
3620 : : }
3621 : :
3622 : 0 : void SSL_CTX_set_security_callback(SSL_CTX *ctx, int (*cb)(SSL *s, SSL_CTX *ctx, int op, int bits, int nid, void *other, void *ex))
3623 : : {
3624 : 0 : ctx->cert->sec_cb = cb;
3625 : 0 : }
3626 : :
3627 : 0 : int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx))(SSL *s, SSL_CTX *ctx, int op, int bits, int nid, void *other, void *ex)
3628 : : {
3629 : 0 : return ctx->cert->sec_cb;
3630 : : }
3631 : :
3632 : 0 : void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex)
3633 : : {
3634 : 0 : ctx->cert->sec_ex = ex;
3635 : 0 : }
3636 : :
3637 : 0 : void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx)
3638 : : {
3639 : 0 : return ctx->cert->sec_ex;
3640 : : }
3641 : :
3642 : :
3643 : : #if defined(_WINDLL) && defined(OPENSSL_SYS_WIN16)
3644 : : #include "../crypto/bio/bss_file.c"
3645 : : #endif
3646 : :
3647 : : IMPLEMENT_STACK_OF(SSL_CIPHER)
3648 : : IMPLEMENT_STACK_OF(SSL_COMP)
3649 : 832012 : IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER,
3650 : : ssl_cipher_id);
|