GCC Code Coverage Report | |||||||||||||||||||||
|
|||||||||||||||||||||
Line | Branch | Exec | Source |
1 |
/* $OpenBSD: ssl_lib.c,v 1.172 2017/10/11 17:35:00 jsing Exp $ */ |
||
2 |
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
||
3 |
* All rights reserved. |
||
4 |
* |
||
5 |
* This package is an SSL implementation written |
||
6 |
* by Eric Young (eay@cryptsoft.com). |
||
7 |
* The implementation was written so as to conform with Netscapes SSL. |
||
8 |
* |
||
9 |
* This library is free for commercial and non-commercial use as long as |
||
10 |
* the following conditions are aheared to. The following conditions |
||
11 |
* apply to all code found in this distribution, be it the RC4, RSA, |
||
12 |
* lhash, DES, etc., code; not just the SSL code. The SSL documentation |
||
13 |
* included with this distribution is covered by the same copyright terms |
||
14 |
* except that the holder is Tim Hudson (tjh@cryptsoft.com). |
||
15 |
* |
||
16 |
* Copyright remains Eric Young's, and as such any Copyright notices in |
||
17 |
* the code are not to be removed. |
||
18 |
* If this package is used in a product, Eric Young should be given attribution |
||
19 |
* as the author of the parts of the library used. |
||
20 |
* This can be in the form of a textual message at program startup or |
||
21 |
* in documentation (online or textual) provided with the package. |
||
22 |
* |
||
23 |
* Redistribution and use in source and binary forms, with or without |
||
24 |
* modification, are permitted provided that the following conditions |
||
25 |
* are met: |
||
26 |
* 1. Redistributions of source code must retain the copyright |
||
27 |
* notice, this list of conditions and the following disclaimer. |
||
28 |
* 2. Redistributions in binary form must reproduce the above copyright |
||
29 |
* notice, this list of conditions and the following disclaimer in the |
||
30 |
* documentation and/or other materials provided with the distribution. |
||
31 |
* 3. All advertising materials mentioning features or use of this software |
||
32 |
* must display the following acknowledgement: |
||
33 |
* "This product includes cryptographic software written by |
||
34 |
* Eric Young (eay@cryptsoft.com)" |
||
35 |
* The word 'cryptographic' can be left out if the rouines from the library |
||
36 |
* being used are not cryptographic related :-). |
||
37 |
* 4. If you include any Windows specific code (or a derivative thereof) from |
||
38 |
* the apps directory (application code) you must include an acknowledgement: |
||
39 |
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" |
||
40 |
* |
||
41 |
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND |
||
42 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||
43 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||
44 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
||
45 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
||
46 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
||
47 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||
48 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||
49 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
||
50 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
||
51 |
* SUCH DAMAGE. |
||
52 |
* |
||
53 |
* The licence and distribution terms for any publically available version or |
||
54 |
* derivative of this code cannot be changed. i.e. this code cannot simply be |
||
55 |
* copied and put under another distribution licence |
||
56 |
* [including the GNU Public Licence.] |
||
57 |
*/ |
||
58 |
/* ==================================================================== |
||
59 |
* Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. |
||
60 |
* |
||
61 |
* Redistribution and use in source and binary forms, with or without |
||
62 |
* modification, are permitted provided that the following conditions |
||
63 |
* are met: |
||
64 |
* |
||
65 |
* 1. Redistributions of source code must retain the above copyright |
||
66 |
* notice, this list of conditions and the following disclaimer. |
||
67 |
* |
||
68 |
* 2. Redistributions in binary form must reproduce the above copyright |
||
69 |
* notice, this list of conditions and the following disclaimer in |
||
70 |
* the documentation and/or other materials provided with the |
||
71 |
* distribution. |
||
72 |
* |
||
73 |
* 3. All advertising materials mentioning features or use of this |
||
74 |
* software must display the following acknowledgment: |
||
75 |
* "This product includes software developed by the OpenSSL Project |
||
76 |
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)" |
||
77 |
* |
||
78 |
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
||
79 |
* endorse or promote products derived from this software without |
||
80 |
* prior written permission. For written permission, please contact |
||
81 |
* openssl-core@openssl.org. |
||
82 |
* |
||
83 |
* 5. Products derived from this software may not be called "OpenSSL" |
||
84 |
* nor may "OpenSSL" appear in their names without prior written |
||
85 |
* permission of the OpenSSL Project. |
||
86 |
* |
||
87 |
* 6. Redistributions of any form whatsoever must retain the following |
||
88 |
* acknowledgment: |
||
89 |
* "This product includes software developed by the OpenSSL Project |
||
90 |
* for use in the OpenSSL Toolkit (http://www.openssl.org/)" |
||
91 |
* |
||
92 |
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
||
93 |
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||
94 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||
95 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
||
96 |
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||
97 |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
||
98 |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||
99 |
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||
100 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
||
101 |
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||
102 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
||
103 |
* OF THE POSSIBILITY OF SUCH DAMAGE. |
||
104 |
* ==================================================================== |
||
105 |
* |
||
106 |
* This product includes cryptographic software written by Eric Young |
||
107 |
* (eay@cryptsoft.com). This product includes software written by Tim |
||
108 |
* Hudson (tjh@cryptsoft.com). |
||
109 |
* |
||
110 |
*/ |
||
111 |
/* ==================================================================== |
||
112 |
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
||
113 |
* ECC cipher suite support in OpenSSL originally developed by |
||
114 |
* SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. |
||
115 |
*/ |
||
116 |
/* ==================================================================== |
||
117 |
* Copyright 2005 Nokia. All rights reserved. |
||
118 |
* |
||
119 |
* The portions of the attached software ("Contribution") is developed by |
||
120 |
* Nokia Corporation and is licensed pursuant to the OpenSSL open source |
||
121 |
* license. |
||
122 |
* |
||
123 |
* The Contribution, originally written by Mika Kousa and Pasi Eronen of |
||
124 |
* Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites |
||
125 |
* support (see RFC 4279) to OpenSSL. |
||
126 |
* |
||
127 |
* No patent licenses or other rights except those expressly stated in |
||
128 |
* the OpenSSL open source license shall be deemed granted or received |
||
129 |
* expressly, by implication, estoppel, or otherwise. |
||
130 |
* |
||
131 |
* No assurances are provided by Nokia that the Contribution does not |
||
132 |
* infringe the patent or other intellectual property rights of any third |
||
133 |
* party or that the license provides you with all the necessary rights |
||
134 |
* to make use of the Contribution. |
||
135 |
* |
||
136 |
* THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN |
||
137 |
* ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA |
||
138 |
* SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY |
||
139 |
* OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR |
||
140 |
* OTHERWISE. |
||
141 |
*/ |
||
142 |
|||
143 |
#include <stdio.h> |
||
144 |
|||
145 |
#include "ssl_locl.h" |
||
146 |
|||
147 |
#include <openssl/bn.h> |
||
148 |
#include <openssl/dh.h> |
||
149 |
#include <openssl/lhash.h> |
||
150 |
#include <openssl/objects.h> |
||
151 |
#include <openssl/ocsp.h> |
||
152 |
#include <openssl/x509v3.h> |
||
153 |
|||
154 |
#ifndef OPENSSL_NO_ENGINE |
||
155 |
#include <openssl/engine.h> |
||
156 |
#endif |
||
157 |
|||
158 |
#include "bytestring.h" |
||
159 |
|||
160 |
const char *SSL_version_str = OPENSSL_VERSION_TEXT; |
||
161 |
|||
162 |
int |
||
163 |
SSL_clear(SSL *s) |
||
164 |
{ |
||
165 |
✗✓ | 35636 |
if (s->method == NULL) { |
166 |
SSLerror(s, SSL_R_NO_METHOD_SPECIFIED); |
||
167 |
return (0); |
||
168 |
} |
||
169 |
|||
170 |
✗✓ | 17818 |
if (ssl_clear_bad_session(s)) { |
171 |
SSL_SESSION_free(s->session); |
||
172 |
s->session = NULL; |
||
173 |
} |
||
174 |
|||
175 |
17818 |
s->error = 0; |
|
176 |
17818 |
s->internal->hit = 0; |
|
177 |
17818 |
s->internal->shutdown = 0; |
|
178 |
|||
179 |
✗✓ | 17818 |
if (s->internal->renegotiate) { |
180 |
SSLerror(s, ERR_R_INTERNAL_ERROR); |
||
181 |
return (0); |
||
182 |
} |
||
183 |
|||
184 |
17818 |
s->internal->type = 0; |
|
185 |
|||
186 |
17818 |
s->version = s->method->internal->version; |
|
187 |
17818 |
s->client_version = s->version; |
|
188 |
17818 |
s->internal->rwstate = SSL_NOTHING; |
|
189 |
17818 |
s->internal->rstate = SSL_ST_READ_HEADER; |
|
190 |
|||
191 |
17818 |
BUF_MEM_free(s->internal->init_buf); |
|
192 |
17818 |
s->internal->init_buf = NULL; |
|
193 |
|||
194 |
17818 |
ssl_clear_cipher_ctx(s); |
|
195 |
17818 |
ssl_clear_hash_ctx(&s->read_hash); |
|
196 |
17818 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
197 |
|||
198 |
17818 |
s->internal->first_packet = 0; |
|
199 |
|||
200 |
/* |
||
201 |
* Check to see if we were changed into a different method, if |
||
202 |
* so, revert back if we are not doing session-id reuse. |
||
203 |
*/ |
||
204 |
✓✓✓✗ ✗✓ |
21250 |
if (!s->internal->in_handshake && (s->session == NULL) && |
205 |
1716 |
(s->method != s->ctx->method)) { |
|
206 |
s->method->internal->ssl_free(s); |
||
207 |
s->method = s->ctx->method; |
||
208 |
if (!s->method->internal->ssl_new(s)) |
||
209 |
return (0); |
||
210 |
} else |
||
211 |
17818 |
s->method->internal->ssl_clear(s); |
|
212 |
|||
213 |
17818 |
S3I(s)->hs.state = SSL_ST_BEFORE|((s->server) ? SSL_ST_ACCEPT : SSL_ST_CONNECT); |
|
214 |
|||
215 |
17818 |
return (1); |
|
216 |
17818 |
} |
|
217 |
|||
218 |
/* Used to change an SSL_CTXs default SSL method type */ |
||
219 |
int |
||
220 |
SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) |
||
221 |
{ |
||
222 |
STACK_OF(SSL_CIPHER) *sk; |
||
223 |
|||
224 |
ctx->method = meth; |
||
225 |
|||
226 |
sk = ssl_create_cipher_list(ctx->method, &(ctx->cipher_list), |
||
227 |
&(ctx->internal->cipher_list_by_id), SSL_DEFAULT_CIPHER_LIST); |
||
228 |
if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) { |
||
229 |
SSLerrorx(SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); |
||
230 |
return (0); |
||
231 |
} |
||
232 |
return (1); |
||
233 |
} |
||
234 |
|||
235 |
SSL * |
||
236 |
SSL_new(SSL_CTX *ctx) |
||
237 |
{ |
||
238 |
SSL *s; |
||
239 |
|||
240 |
✗✓ | 3432 |
if (ctx == NULL) { |
241 |
SSLerrorx(SSL_R_NULL_SSL_CTX); |
||
242 |
return (NULL); |
||
243 |
} |
||
244 |
✗✓ | 1716 |
if (ctx->method == NULL) { |
245 |
SSLerrorx(SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION); |
||
246 |
return (NULL); |
||
247 |
} |
||
248 |
|||
249 |
✗✓ | 1716 |
if ((s = calloc(1, sizeof(*s))) == NULL) { |
250 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
251 |
return (NULL); |
||
252 |
} |
||
253 |
✗✓ | 1716 |
if ((s->internal = calloc(1, sizeof(*s->internal))) == NULL) { |
254 |
free(s); |
||
255 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
256 |
return (NULL); |
||
257 |
} |
||
258 |
|||
259 |
1716 |
s->internal->min_version = ctx->internal->min_version; |
|
260 |
1716 |
s->internal->max_version = ctx->internal->max_version; |
|
261 |
|||
262 |
1716 |
s->internal->options = ctx->internal->options; |
|
263 |
1716 |
s->internal->mode = ctx->internal->mode; |
|
264 |
1716 |
s->internal->max_cert_list = ctx->internal->max_cert_list; |
|
265 |
|||
266 |
✓✗ | 1716 |
if (ctx->internal->cert != NULL) { |
267 |
/* |
||
268 |
* Earlier library versions used to copy the pointer to |
||
269 |
* the CERT, not its contents; only when setting new |
||
270 |
* parameters for the per-SSL copy, ssl_cert_new would be |
||
271 |
* called (and the direct reference to the per-SSL_CTX |
||
272 |
* settings would be lost, but those still were indirectly |
||
273 |
* accessed for various purposes, and for that reason they |
||
274 |
* used to be known as s->ctx->default_cert). |
||
275 |
* Now we don't look at the SSL_CTX's CERT after having |
||
276 |
* duplicated it once. |
||
277 |
*/ |
||
278 |
1716 |
s->cert = ssl_cert_dup(ctx->internal->cert); |
|
279 |
✓✗ | 1716 |
if (s->cert == NULL) |
280 |
goto err; |
||
281 |
} else |
||
282 |
s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */ |
||
283 |
|||
284 |
1716 |
s->internal->read_ahead = ctx->internal->read_ahead; |
|
285 |
1716 |
s->internal->msg_callback = ctx->internal->msg_callback; |
|
286 |
1716 |
s->internal->msg_callback_arg = ctx->internal->msg_callback_arg; |
|
287 |
1716 |
s->verify_mode = ctx->verify_mode; |
|
288 |
1716 |
s->sid_ctx_length = ctx->sid_ctx_length; |
|
289 |
✗✓ | 1716 |
OPENSSL_assert(s->sid_ctx_length <= sizeof s->sid_ctx); |
290 |
1716 |
memcpy(&s->sid_ctx, &ctx->sid_ctx, sizeof(s->sid_ctx)); |
|
291 |
1716 |
s->internal->verify_callback = ctx->internal->default_verify_callback; |
|
292 |
1716 |
s->internal->generate_session_id = ctx->internal->generate_session_id; |
|
293 |
|||
294 |
1716 |
s->param = X509_VERIFY_PARAM_new(); |
|
295 |
✓✗ | 1716 |
if (!s->param) |
296 |
goto err; |
||
297 |
1716 |
X509_VERIFY_PARAM_inherit(s->param, ctx->param); |
|
298 |
1716 |
s->internal->quiet_shutdown = ctx->internal->quiet_shutdown; |
|
299 |
1716 |
s->max_send_fragment = ctx->internal->max_send_fragment; |
|
300 |
|||
301 |
1716 |
CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
|
302 |
1716 |
s->ctx = ctx; |
|
303 |
1716 |
s->internal->tlsext_debug_cb = 0; |
|
304 |
1716 |
s->internal->tlsext_debug_arg = NULL; |
|
305 |
1716 |
s->internal->tlsext_ticket_expected = 0; |
|
306 |
1716 |
s->tlsext_status_type = -1; |
|
307 |
1716 |
s->internal->tlsext_status_expected = 0; |
|
308 |
1716 |
s->internal->tlsext_ocsp_ids = NULL; |
|
309 |
1716 |
s->internal->tlsext_ocsp_exts = NULL; |
|
310 |
1716 |
s->internal->tlsext_ocsp_resp = NULL; |
|
311 |
1716 |
s->internal->tlsext_ocsp_resplen = -1; |
|
312 |
1716 |
CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
|
313 |
1716 |
s->initial_ctx = ctx; |
|
314 |
|||
315 |
✗✓ | 1716 |
if (ctx->internal->tlsext_ecpointformatlist != NULL) { |
316 |
s->internal->tlsext_ecpointformatlist = |
||
317 |
calloc(ctx->internal->tlsext_ecpointformatlist_length, |
||
318 |
sizeof(ctx->internal->tlsext_ecpointformatlist[0])); |
||
319 |
if (s->internal->tlsext_ecpointformatlist == NULL) |
||
320 |
goto err; |
||
321 |
memcpy(s->internal->tlsext_ecpointformatlist, |
||
322 |
ctx->internal->tlsext_ecpointformatlist, |
||
323 |
ctx->internal->tlsext_ecpointformatlist_length * |
||
324 |
sizeof(ctx->internal->tlsext_ecpointformatlist[0])); |
||
325 |
s->internal->tlsext_ecpointformatlist_length = |
||
326 |
ctx->internal->tlsext_ecpointformatlist_length; |
||
327 |
} |
||
328 |
✓✓ | 1716 |
if (ctx->internal->tlsext_supportedgroups != NULL) { |
329 |
174 |
s->internal->tlsext_supportedgroups = |
|
330 |
174 |
calloc(ctx->internal->tlsext_supportedgroups_length, |
|
331 |
sizeof(ctx->internal->tlsext_supportedgroups)); |
||
332 |
✓✗ | 174 |
if (s->internal->tlsext_supportedgroups == NULL) |
333 |
goto err; |
||
334 |
522 |
memcpy(s->internal->tlsext_supportedgroups, |
|
335 |
174 |
ctx->internal->tlsext_supportedgroups, |
|
336 |
174 |
ctx->internal->tlsext_supportedgroups_length * |
|
337 |
sizeof(ctx->internal->tlsext_supportedgroups[0])); |
||
338 |
174 |
s->internal->tlsext_supportedgroups_length = |
|
339 |
174 |
ctx->internal->tlsext_supportedgroups_length; |
|
340 |
174 |
} |
|
341 |
|||
342 |
✓✓ | 1716 |
if (s->ctx->internal->alpn_client_proto_list != NULL) { |
343 |
26 |
s->internal->alpn_client_proto_list = |
|
344 |
26 |
malloc(s->ctx->internal->alpn_client_proto_list_len); |
|
345 |
✓✗ | 26 |
if (s->internal->alpn_client_proto_list == NULL) |
346 |
goto err; |
||
347 |
26 |
memcpy(s->internal->alpn_client_proto_list, |
|
348 |
26 |
s->ctx->internal->alpn_client_proto_list, |
|
349 |
26 |
s->ctx->internal->alpn_client_proto_list_len); |
|
350 |
26 |
s->internal->alpn_client_proto_list_len = |
|
351 |
26 |
s->ctx->internal->alpn_client_proto_list_len; |
|
352 |
26 |
} |
|
353 |
|||
354 |
1716 |
s->verify_result = X509_V_OK; |
|
355 |
|||
356 |
1716 |
s->method = ctx->method; |
|
357 |
|||
358 |
✓✗ | 1716 |
if (!s->method->internal->ssl_new(s)) |
359 |
goto err; |
||
360 |
|||
361 |
1716 |
s->references = 1; |
|
362 |
1716 |
s->server = (ctx->method->internal->ssl_accept == ssl_undefined_function) ? 0 : 1; |
|
363 |
|||
364 |
1716 |
SSL_clear(s); |
|
365 |
|||
366 |
1716 |
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->internal->ex_data); |
|
367 |
|||
368 |
1716 |
return (s); |
|
369 |
|||
370 |
err: |
||
371 |
SSL_free(s); |
||
372 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
373 |
return (NULL); |
||
374 |
1716 |
} |
|
375 |
|||
376 |
int |
||
377 |
SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, |
||
378 |
unsigned int sid_ctx_len) |
||
379 |
{ |
||
380 |
✗✓ | 338 |
if (sid_ctx_len > sizeof ctx->sid_ctx) { |
381 |
SSLerrorx(SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); |
||
382 |
return (0); |
||
383 |
} |
||
384 |
169 |
ctx->sid_ctx_length = sid_ctx_len; |
|
385 |
169 |
memcpy(ctx->sid_ctx, sid_ctx, sid_ctx_len); |
|
386 |
|||
387 |
169 |
return (1); |
|
388 |
169 |
} |
|
389 |
|||
390 |
int |
||
391 |
SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, |
||
392 |
unsigned int sid_ctx_len) |
||
393 |
{ |
||
394 |
if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) { |
||
395 |
SSLerror(ssl, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); |
||
396 |
return (0); |
||
397 |
} |
||
398 |
ssl->sid_ctx_length = sid_ctx_len; |
||
399 |
memcpy(ssl->sid_ctx, sid_ctx, sid_ctx_len); |
||
400 |
|||
401 |
return (1); |
||
402 |
} |
||
403 |
|||
404 |
int |
||
405 |
SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb) |
||
406 |
{ |
||
407 |
CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); |
||
408 |
ctx->internal->generate_session_id = cb; |
||
409 |
CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); |
||
410 |
return (1); |
||
411 |
} |
||
412 |
|||
413 |
int |
||
414 |
SSL_set_generate_session_id(SSL *ssl, GEN_SESSION_CB cb) |
||
415 |
{ |
||
416 |
CRYPTO_w_lock(CRYPTO_LOCK_SSL); |
||
417 |
ssl->internal->generate_session_id = cb; |
||
418 |
CRYPTO_w_unlock(CRYPTO_LOCK_SSL); |
||
419 |
return (1); |
||
420 |
} |
||
421 |
|||
422 |
int |
||
423 |
SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id, |
||
424 |
unsigned int id_len) |
||
425 |
{ |
||
426 |
/* |
||
427 |
* A quick examination of SSL_SESSION_hash and SSL_SESSION_cmp |
||
428 |
* shows how we can "construct" a session to give us the desired |
||
429 |
* check - ie. to find if there's a session in the hash table |
||
430 |
* that would conflict with any new session built out of this |
||
431 |
* id/id_len and the ssl_version in use by this SSL. |
||
432 |
*/ |
||
433 |
72 |
SSL_SESSION r, *p; |
|
434 |
|||
435 |
✗✓ | 36 |
if (id_len > sizeof r.session_id) |
436 |
return (0); |
||
437 |
|||
438 |
36 |
r.ssl_version = ssl->version; |
|
439 |
36 |
r.session_id_length = id_len; |
|
440 |
36 |
memcpy(r.session_id, id, id_len); |
|
441 |
|||
442 |
36 |
CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); |
|
443 |
36 |
p = lh_SSL_SESSION_retrieve(ssl->ctx->internal->sessions, &r); |
|
444 |
36 |
CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); |
|
445 |
36 |
return (p != NULL); |
|
446 |
36 |
} |
|
447 |
|||
448 |
int |
||
449 |
SSL_CTX_set_purpose(SSL_CTX *s, int purpose) |
||
450 |
{ |
||
451 |
return (X509_VERIFY_PARAM_set_purpose(s->param, purpose)); |
||
452 |
} |
||
453 |
|||
454 |
int |
||
455 |
SSL_set_purpose(SSL *s, int purpose) |
||
456 |
{ |
||
457 |
return (X509_VERIFY_PARAM_set_purpose(s->param, purpose)); |
||
458 |
} |
||
459 |
|||
460 |
int |
||
461 |
SSL_CTX_set_trust(SSL_CTX *s, int trust) |
||
462 |
{ |
||
463 |
return (X509_VERIFY_PARAM_set_trust(s->param, trust)); |
||
464 |
} |
||
465 |
|||
466 |
int |
||
467 |
SSL_set_trust(SSL *s, int trust) |
||
468 |
{ |
||
469 |
return (X509_VERIFY_PARAM_set_trust(s->param, trust)); |
||
470 |
} |
||
471 |
|||
472 |
int |
||
473 |
SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm) |
||
474 |
{ |
||
475 |
4 |
return (X509_VERIFY_PARAM_set1(ctx->param, vpm)); |
|
476 |
} |
||
477 |
|||
478 |
int |
||
479 |
SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm) |
||
480 |
{ |
||
481 |
return (X509_VERIFY_PARAM_set1(ssl->param, vpm)); |
||
482 |
} |
||
483 |
|||
484 |
void |
||
485 |
SSL_free(SSL *s) |
||
486 |
{ |
||
487 |
int i; |
||
488 |
|||
489 |
✓✓ | 3840 |
if (s == NULL) |
490 |
225 |
return; |
|
491 |
|||
492 |
1695 |
i = CRYPTO_add(&s->references, -1, CRYPTO_LOCK_SSL); |
|
493 |
✗✓ | 1695 |
if (i > 0) |
494 |
return; |
||
495 |
|||
496 |
1695 |
X509_VERIFY_PARAM_free(s->param); |
|
497 |
|||
498 |
1695 |
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->internal->ex_data); |
|
499 |
|||
500 |
✓✓ | 1695 |
if (s->bbio != NULL) { |
501 |
/* If the buffering BIO is in place, pop it off */ |
||
502 |
✓✗ | 39 |
if (s->bbio == s->wbio) { |
503 |
39 |
s->wbio = BIO_pop(s->wbio); |
|
504 |
39 |
} |
|
505 |
39 |
BIO_free(s->bbio); |
|
506 |
39 |
s->bbio = NULL; |
|
507 |
39 |
} |
|
508 |
|||
509 |
✓✓ | 1695 |
if (s->rbio != s->wbio) |
510 |
45 |
BIO_free_all(s->rbio); |
|
511 |
1695 |
BIO_free_all(s->wbio); |
|
512 |
|||
513 |
1695 |
BUF_MEM_free(s->internal->init_buf); |
|
514 |
|||
515 |
/* add extra stuff */ |
||
516 |
1695 |
sk_SSL_CIPHER_free(s->cipher_list); |
|
517 |
1695 |
sk_SSL_CIPHER_free(s->internal->cipher_list_by_id); |
|
518 |
|||
519 |
/* Make the next call work :-) */ |
||
520 |
✓✓ | 1695 |
if (s->session != NULL) { |
521 |
1498 |
ssl_clear_bad_session(s); |
|
522 |
1498 |
SSL_SESSION_free(s->session); |
|
523 |
1498 |
} |
|
524 |
|||
525 |
1695 |
ssl_clear_cipher_ctx(s); |
|
526 |
1695 |
ssl_clear_hash_ctx(&s->read_hash); |
|
527 |
1695 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
528 |
|||
529 |
1695 |
ssl_cert_free(s->cert); |
|
530 |
|||
531 |
1695 |
free(s->tlsext_hostname); |
|
532 |
1695 |
SSL_CTX_free(s->initial_ctx); |
|
533 |
|||
534 |
1695 |
free(s->internal->tlsext_ecpointformatlist); |
|
535 |
1695 |
free(s->internal->tlsext_supportedgroups); |
|
536 |
|||
537 |
1695 |
sk_X509_EXTENSION_pop_free(s->internal->tlsext_ocsp_exts, |
|
538 |
X509_EXTENSION_free); |
||
539 |
1695 |
sk_OCSP_RESPID_pop_free(s->internal->tlsext_ocsp_ids, OCSP_RESPID_free); |
|
540 |
1695 |
free(s->internal->tlsext_ocsp_resp); |
|
541 |
|||
542 |
1695 |
sk_X509_NAME_pop_free(s->internal->client_CA, X509_NAME_free); |
|
543 |
|||
544 |
✓✗ | 1695 |
if (s->method != NULL) |
545 |
1695 |
s->method->internal->ssl_free(s); |
|
546 |
|||
547 |
1695 |
SSL_CTX_free(s->ctx); |
|
548 |
|||
549 |
1695 |
free(s->internal->alpn_client_proto_list); |
|
550 |
|||
551 |
#ifndef OPENSSL_NO_SRTP |
||
552 |
1695 |
sk_SRTP_PROTECTION_PROFILE_free(s->internal->srtp_profiles); |
|
553 |
#endif |
||
554 |
|||
555 |
1695 |
free(s->internal); |
|
556 |
1695 |
free(s); |
|
557 |
3615 |
} |
|
558 |
|||
559 |
void |
||
560 |
SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio) |
||
561 |
{ |
||
562 |
/* If the output buffering BIO is still in place, remove it */ |
||
563 |
✗✓ | 32228 |
if (s->bbio != NULL) { |
564 |
if (s->wbio == s->bbio) { |
||
565 |
s->wbio = s->wbio->next_bio; |
||
566 |
s->bbio->next_bio = NULL; |
||
567 |
} |
||
568 |
} |
||
569 |
|||
570 |
✓✓✗✓ |
32216 |
if (s->rbio != rbio && s->rbio != s->wbio) |
571 |
BIO_free_all(s->rbio); |
||
572 |
✓✓ | 16114 |
if (s->wbio != wbio) |
573 |
16102 |
BIO_free_all(s->wbio); |
|
574 |
16114 |
s->rbio = rbio; |
|
575 |
16114 |
s->wbio = wbio; |
|
576 |
16114 |
} |
|
577 |
|||
578 |
BIO * |
||
579 |
SSL_get_rbio(const SSL *s) |
||
580 |
{ |
||
581 |
78518 |
return (s->rbio); |
|
582 |
} |
||
583 |
|||
584 |
BIO * |
||
585 |
SSL_get_wbio(const SSL *s) |
||
586 |
{ |
||
587 |
4622 |
return (s->wbio); |
|
588 |
} |
||
589 |
|||
590 |
int |
||
591 |
SSL_get_fd(const SSL *s) |
||
592 |
{ |
||
593 |
62724 |
return (SSL_get_rfd(s)); |
|
594 |
} |
||
595 |
|||
596 |
int |
||
597 |
SSL_get_rfd(const SSL *s) |
||
598 |
{ |
||
599 |
62724 |
int ret = -1; |
|
600 |
BIO *b, *r; |
||
601 |
|||
602 |
31362 |
b = SSL_get_rbio(s); |
|
603 |
31362 |
r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); |
|
604 |
✓✗ | 31362 |
if (r != NULL) |
605 |
31362 |
BIO_get_fd(r, &ret); |
|
606 |
62724 |
return (ret); |
|
607 |
31362 |
} |
|
608 |
|||
609 |
int |
||
610 |
SSL_get_wfd(const SSL *s) |
||
611 |
{ |
||
612 |
int ret = -1; |
||
613 |
BIO *b, *r; |
||
614 |
|||
615 |
b = SSL_get_wbio(s); |
||
616 |
r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); |
||
617 |
if (r != NULL) |
||
618 |
BIO_get_fd(r, &ret); |
||
619 |
return (ret); |
||
620 |
} |
||
621 |
|||
622 |
int |
||
623 |
SSL_set_fd(SSL *s, int fd) |
||
624 |
{ |
||
625 |
int ret = 0; |
||
626 |
BIO *bio = NULL; |
||
627 |
|||
628 |
bio = BIO_new(BIO_s_socket()); |
||
629 |
|||
630 |
if (bio == NULL) { |
||
631 |
SSLerror(s, ERR_R_BUF_LIB); |
||
632 |
goto err; |
||
633 |
} |
||
634 |
BIO_set_fd(bio, fd, BIO_NOCLOSE); |
||
635 |
SSL_set_bio(s, bio, bio); |
||
636 |
ret = 1; |
||
637 |
err: |
||
638 |
return (ret); |
||
639 |
} |
||
640 |
|||
641 |
int |
||
642 |
SSL_set_wfd(SSL *s, int fd) |
||
643 |
{ |
||
644 |
int ret = 0; |
||
645 |
BIO *bio = NULL; |
||
646 |
|||
647 |
✓✗✓✓ |
48 |
if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) |
648 |
✓✗ | 24 |
|| ((int)BIO_get_fd(s->rbio, NULL) != fd)) { |
649 |
6 |
bio = BIO_new(BIO_s_socket()); |
|
650 |
|||
651 |
✗✓ | 6 |
if (bio == NULL) { |
652 |
SSLerror(s, ERR_R_BUF_LIB); |
||
653 |
goto err; |
||
654 |
} |
||
655 |
6 |
BIO_set_fd(bio, fd, BIO_NOCLOSE); |
|
656 |
6 |
SSL_set_bio(s, SSL_get_rbio(s), bio); |
|
657 |
6 |
} else |
|
658 |
6 |
SSL_set_bio(s, SSL_get_rbio(s), SSL_get_rbio(s)); |
|
659 |
12 |
ret = 1; |
|
660 |
err: |
||
661 |
12 |
return (ret); |
|
662 |
} |
||
663 |
|||
664 |
int |
||
665 |
SSL_set_rfd(SSL *s, int fd) |
||
666 |
{ |
||
667 |
int ret = 0; |
||
668 |
BIO *bio = NULL; |
||
669 |
|||
670 |
✗✓✗✗ |
24 |
if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) |
671 |
|| ((int)BIO_get_fd(s->wbio, NULL) != fd)) { |
||
672 |
12 |
bio = BIO_new(BIO_s_socket()); |
|
673 |
|||
674 |
✗✓ | 12 |
if (bio == NULL) { |
675 |
SSLerror(s, ERR_R_BUF_LIB); |
||
676 |
goto err; |
||
677 |
} |
||
678 |
12 |
BIO_set_fd(bio, fd, BIO_NOCLOSE); |
|
679 |
12 |
SSL_set_bio(s, bio, SSL_get_wbio(s)); |
|
680 |
12 |
} else |
|
681 |
SSL_set_bio(s, SSL_get_wbio(s), SSL_get_wbio(s)); |
||
682 |
12 |
ret = 1; |
|
683 |
err: |
||
684 |
12 |
return (ret); |
|
685 |
} |
||
686 |
|||
687 |
|||
688 |
/* return length of latest Finished message we sent, copy to 'buf' */ |
||
689 |
size_t |
||
690 |
SSL_get_finished(const SSL *s, void *buf, size_t count) |
||
691 |
{ |
||
692 |
size_t ret = 0; |
||
693 |
|||
694 |
if (s->s3 != NULL) { |
||
695 |
ret = S3I(s)->tmp.finish_md_len; |
||
696 |
if (count > ret) |
||
697 |
count = ret; |
||
698 |
memcpy(buf, S3I(s)->tmp.finish_md, count); |
||
699 |
} |
||
700 |
return (ret); |
||
701 |
} |
||
702 |
|||
703 |
/* return length of latest Finished message we expected, copy to 'buf' */ |
||
704 |
size_t |
||
705 |
SSL_get_peer_finished(const SSL *s, void *buf, size_t count) |
||
706 |
{ |
||
707 |
size_t ret = 0; |
||
708 |
|||
709 |
if (s->s3 != NULL) { |
||
710 |
ret = S3I(s)->tmp.peer_finish_md_len; |
||
711 |
if (count > ret) |
||
712 |
count = ret; |
||
713 |
memcpy(buf, S3I(s)->tmp.peer_finish_md, count); |
||
714 |
} |
||
715 |
return (ret); |
||
716 |
} |
||
717 |
|||
718 |
|||
719 |
int |
||
720 |
SSL_get_verify_mode(const SSL *s) |
||
721 |
{ |
||
722 |
return (s->verify_mode); |
||
723 |
} |
||
724 |
|||
725 |
int |
||
726 |
SSL_get_verify_depth(const SSL *s) |
||
727 |
{ |
||
728 |
return (X509_VERIFY_PARAM_get_depth(s->param)); |
||
729 |
} |
||
730 |
|||
731 |
int |
||
732 |
(*SSL_get_verify_callback(const SSL *s))(int, X509_STORE_CTX *) |
||
733 |
{ |
||
734 |
return (s->internal->verify_callback); |
||
735 |
} |
||
736 |
|||
737 |
int |
||
738 |
SSL_CTX_get_verify_mode(const SSL_CTX *ctx) |
||
739 |
{ |
||
740 |
return (ctx->verify_mode); |
||
741 |
} |
||
742 |
|||
743 |
int |
||
744 |
SSL_CTX_get_verify_depth(const SSL_CTX *ctx) |
||
745 |
{ |
||
746 |
return (X509_VERIFY_PARAM_get_depth(ctx->param)); |
||
747 |
} |
||
748 |
|||
749 |
int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int, X509_STORE_CTX *) |
||
750 |
{ |
||
751 |
return (ctx->internal->default_verify_callback); |
||
752 |
} |
||
753 |
|||
754 |
void |
||
755 |
SSL_set_verify(SSL *s, int mode, |
||
756 |
int (*callback)(int ok, X509_STORE_CTX *ctx)) |
||
757 |
{ |
||
758 |
s->verify_mode = mode; |
||
759 |
if (callback != NULL) |
||
760 |
s->internal->verify_callback = callback; |
||
761 |
} |
||
762 |
|||
763 |
void |
||
764 |
SSL_set_verify_depth(SSL *s, int depth) |
||
765 |
{ |
||
766 |
X509_VERIFY_PARAM_set_depth(s->param, depth); |
||
767 |
} |
||
768 |
|||
769 |
void |
||
770 |
SSL_set_read_ahead(SSL *s, int yes) |
||
771 |
{ |
||
772 |
s->internal->read_ahead = yes; |
||
773 |
} |
||
774 |
|||
775 |
int |
||
776 |
SSL_get_read_ahead(const SSL *s) |
||
777 |
{ |
||
778 |
return (s->internal->read_ahead); |
||
779 |
} |
||
780 |
|||
781 |
int |
||
782 |
SSL_pending(const SSL *s) |
||
783 |
{ |
||
784 |
/* |
||
785 |
* SSL_pending cannot work properly if read-ahead is enabled |
||
786 |
* (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)), |
||
787 |
* and it is impossible to fix since SSL_pending cannot report |
||
788 |
* errors that may be observed while scanning the new data. |
||
789 |
* (Note that SSL_pending() is often used as a boolean value, |
||
790 |
* so we'd better not return -1.) |
||
791 |
*/ |
||
792 |
3464 |
return (s->method->internal->ssl_pending(s)); |
|
793 |
} |
||
794 |
|||
795 |
X509 * |
||
796 |
SSL_get_peer_certificate(const SSL *s) |
||
797 |
{ |
||
798 |
X509 *r; |
||
799 |
|||
800 |
✓✗✗✓ |
696 |
if ((s == NULL) || (s->session == NULL)) |
801 |
r = NULL; |
||
802 |
else |
||
803 |
232 |
r = s->session->peer; |
|
804 |
|||
805 |
✓✓ | 232 |
if (r == NULL) |
806 |
54 |
return (r); |
|
807 |
|||
808 |
178 |
CRYPTO_add(&r->references, 1, CRYPTO_LOCK_X509); |
|
809 |
|||
810 |
178 |
return (r); |
|
811 |
232 |
} |
|
812 |
|||
813 |
STACK_OF(X509) * |
||
814 |
SSL_get_peer_cert_chain(const SSL *s) |
||
815 |
{ |
||
816 |
STACK_OF(X509) *r; |
||
817 |
|||
818 |
✓✗✓✗ ✓✓ |
208 |
if ((s == NULL) || (s->session == NULL) || |
819 |
52 |
(SSI(s)->sess_cert == NULL)) |
|
820 |
24 |
r = NULL; |
|
821 |
else |
||
822 |
28 |
r = SSI(s)->sess_cert->cert_chain; |
|
823 |
|||
824 |
/* |
||
825 |
* If we are a client, cert_chain includes the peer's own |
||
826 |
* certificate; |
||
827 |
* if we are a server, it does not. |
||
828 |
*/ |
||
829 |
52 |
return (r); |
|
830 |
} |
||
831 |
|||
832 |
/* |
||
833 |
* Now in theory, since the calling process own 't' it should be safe to |
||
834 |
* modify. We need to be able to read f without being hassled |
||
835 |
*/ |
||
836 |
void |
||
837 |
SSL_copy_session_id(SSL *t, const SSL *f) |
||
838 |
{ |
||
839 |
CERT *tmp; |
||
840 |
|||
841 |
/* Do we need to to SSL locking? */ |
||
842 |
SSL_set_session(t, SSL_get_session(f)); |
||
843 |
|||
844 |
/* |
||
845 |
* What if we are setup as SSLv2 but want to talk SSLv3 or |
||
846 |
* vice-versa. |
||
847 |
*/ |
||
848 |
if (t->method != f->method) { |
||
849 |
t->method->internal->ssl_free(t); /* cleanup current */ |
||
850 |
t->method = f->method; /* change method */ |
||
851 |
t->method->internal->ssl_new(t); /* setup new */ |
||
852 |
} |
||
853 |
|||
854 |
tmp = t->cert; |
||
855 |
if (f->cert != NULL) { |
||
856 |
CRYPTO_add(&f->cert->references, 1, CRYPTO_LOCK_SSL_CERT); |
||
857 |
t->cert = f->cert; |
||
858 |
} else |
||
859 |
t->cert = NULL; |
||
860 |
ssl_cert_free(tmp); |
||
861 |
SSL_set_session_id_context(t, f->sid_ctx, f->sid_ctx_length); |
||
862 |
} |
||
863 |
|||
864 |
/* Fix this so it checks all the valid key/cert options */ |
||
865 |
int |
||
866 |
SSL_CTX_check_private_key(const SSL_CTX *ctx) |
||
867 |
{ |
||
868 |
✓✗✓✗ ✗✓ |
48 |
if ((ctx == NULL) || (ctx->internal->cert == NULL) || |
869 |
12 |
(ctx->internal->cert->key->x509 == NULL)) { |
|
870 |
SSLerrorx(SSL_R_NO_CERTIFICATE_ASSIGNED); |
||
871 |
return (0); |
||
872 |
} |
||
873 |
✗✓ | 12 |
if (ctx->internal->cert->key->privatekey == NULL) { |
874 |
SSLerrorx(SSL_R_NO_PRIVATE_KEY_ASSIGNED); |
||
875 |
return (0); |
||
876 |
} |
||
877 |
12 |
return (X509_check_private_key(ctx->internal->cert->key->x509, |
|
878 |
ctx->internal->cert->key->privatekey)); |
||
879 |
12 |
} |
|
880 |
|||
881 |
/* Fix this function so that it takes an optional type parameter */ |
||
882 |
int |
||
883 |
SSL_check_private_key(const SSL *ssl) |
||
884 |
{ |
||
885 |
if (ssl == NULL) { |
||
886 |
SSLerrorx(ERR_R_PASSED_NULL_PARAMETER); |
||
887 |
return (0); |
||
888 |
} |
||
889 |
if (ssl->cert == NULL) { |
||
890 |
SSLerror(ssl, SSL_R_NO_CERTIFICATE_ASSIGNED); |
||
891 |
return (0); |
||
892 |
} |
||
893 |
if (ssl->cert->key->x509 == NULL) { |
||
894 |
SSLerror(ssl, SSL_R_NO_CERTIFICATE_ASSIGNED); |
||
895 |
return (0); |
||
896 |
} |
||
897 |
if (ssl->cert->key->privatekey == NULL) { |
||
898 |
SSLerror(ssl, SSL_R_NO_PRIVATE_KEY_ASSIGNED); |
||
899 |
return (0); |
||
900 |
} |
||
901 |
return (X509_check_private_key(ssl->cert->key->x509, |
||
902 |
ssl->cert->key->privatekey)); |
||
903 |
} |
||
904 |
|||
905 |
int |
||
906 |
SSL_accept(SSL *s) |
||
907 |
{ |
||
908 |
✓✓ | 84 |
if (s->internal->handshake_func == NULL) |
909 |
18 |
SSL_set_accept_state(s); /* Not properly initialized yet */ |
|
910 |
|||
911 |
42 |
return (s->method->internal->ssl_accept(s)); |
|
912 |
} |
||
913 |
|||
914 |
int |
||
915 |
SSL_connect(SSL *s) |
||
916 |
{ |
||
917 |
✓✓ | 31516 |
if (s->internal->handshake_func == NULL) |
918 |
1151 |
SSL_set_connect_state(s); /* Not properly initialized yet */ |
|
919 |
|||
920 |
15758 |
return (s->method->internal->ssl_connect(s)); |
|
921 |
} |
||
922 |
|||
923 |
long |
||
924 |
SSL_get_default_timeout(const SSL *s) |
||
925 |
{ |
||
926 |
return (s->method->internal->get_timeout()); |
||
927 |
} |
||
928 |
|||
929 |
int |
||
930 |
SSL_read(SSL *s, void *buf, int num) |
||
931 |
{ |
||
932 |
✗✓ | 9612 |
if (s->internal->handshake_func == NULL) { |
933 |
SSLerror(s, SSL_R_UNINITIALIZED); |
||
934 |
return (-1); |
||
935 |
} |
||
936 |
|||
937 |
✗✓ | 4806 |
if (s->internal->shutdown & SSL_RECEIVED_SHUTDOWN) { |
938 |
s->internal->rwstate = SSL_NOTHING; |
||
939 |
return (0); |
||
940 |
} |
||
941 |
4806 |
return (s->method->internal->ssl_read(s, buf, num)); |
|
942 |
4806 |
} |
|
943 |
|||
944 |
int |
||
945 |
SSL_peek(SSL *s, void *buf, int num) |
||
946 |
{ |
||
947 |
if (s->internal->handshake_func == NULL) { |
||
948 |
SSLerror(s, SSL_R_UNINITIALIZED); |
||
949 |
return (-1); |
||
950 |
} |
||
951 |
|||
952 |
if (s->internal->shutdown & SSL_RECEIVED_SHUTDOWN) { |
||
953 |
return (0); |
||
954 |
} |
||
955 |
return (s->method->internal->ssl_peek(s, buf, num)); |
||
956 |
} |
||
957 |
|||
958 |
int |
||
959 |
SSL_write(SSL *s, const void *buf, int num) |
||
960 |
{ |
||
961 |
✗✓ | 9184 |
if (s->internal->handshake_func == NULL) { |
962 |
SSLerror(s, SSL_R_UNINITIALIZED); |
||
963 |
return (-1); |
||
964 |
} |
||
965 |
|||
966 |
✗✓ | 4592 |
if (s->internal->shutdown & SSL_SENT_SHUTDOWN) { |
967 |
s->internal->rwstate = SSL_NOTHING; |
||
968 |
SSLerror(s, SSL_R_PROTOCOL_IS_SHUTDOWN); |
||
969 |
return (-1); |
||
970 |
} |
||
971 |
4592 |
return (s->method->internal->ssl_write(s, buf, num)); |
|
972 |
4592 |
} |
|
973 |
|||
974 |
int |
||
975 |
SSL_shutdown(SSL *s) |
||
976 |
{ |
||
977 |
/* |
||
978 |
* Note that this function behaves differently from what one might |
||
979 |
* expect. Return values are 0 for no success (yet), |
||
980 |
* 1 for success; but calling it once is usually not enough, |
||
981 |
* even if blocking I/O is used (see ssl3_shutdown). |
||
982 |
*/ |
||
983 |
|||
984 |
✗✓ | 32126 |
if (s->internal->handshake_func == NULL) { |
985 |
SSLerror(s, SSL_R_UNINITIALIZED); |
||
986 |
return (-1); |
||
987 |
} |
||
988 |
|||
989 |
✓✗✓✗ |
32126 |
if ((s != NULL) && !SSL_in_init(s)) |
990 |
16063 |
return (s->method->internal->ssl_shutdown(s)); |
|
991 |
else |
||
992 |
return (1); |
||
993 |
16063 |
} |
|
994 |
|||
995 |
int |
||
996 |
SSL_renegotiate(SSL *s) |
||
997 |
{ |
||
998 |
✓✗ | 6 |
if (s->internal->renegotiate == 0) |
999 |
3 |
s->internal->renegotiate = 1; |
|
1000 |
|||
1001 |
3 |
s->internal->new_session = 1; |
|
1002 |
|||
1003 |
3 |
return (s->method->internal->ssl_renegotiate(s)); |
|
1004 |
} |
||
1005 |
|||
1006 |
int |
||
1007 |
SSL_renegotiate_abbreviated(SSL *s) |
||
1008 |
{ |
||
1009 |
if (s->internal->renegotiate == 0) |
||
1010 |
s->internal->renegotiate = 1; |
||
1011 |
|||
1012 |
s->internal->new_session = 0; |
||
1013 |
|||
1014 |
return (s->method->internal->ssl_renegotiate(s)); |
||
1015 |
} |
||
1016 |
|||
1017 |
int |
||
1018 |
SSL_renegotiate_pending(SSL *s) |
||
1019 |
{ |
||
1020 |
/* |
||
1021 |
* Becomes true when negotiation is requested; |
||
1022 |
* false again once a handshake has finished. |
||
1023 |
*/ |
||
1024 |
return (s->internal->renegotiate != 0); |
||
1025 |
} |
||
1026 |
|||
1027 |
long |
||
1028 |
SSL_ctrl(SSL *s, int cmd, long larg, void *parg) |
||
1029 |
{ |
||
1030 |
long l; |
||
1031 |
|||
1032 |
✗✗✗✓ ✓✗✗✗ ✗✗✗✓ ✓ |
68010 |
switch (cmd) { |
1033 |
case SSL_CTRL_GET_READ_AHEAD: |
||
1034 |
return (s->internal->read_ahead); |
||
1035 |
case SSL_CTRL_SET_READ_AHEAD: |
||
1036 |
l = s->internal->read_ahead; |
||
1037 |
s->internal->read_ahead = larg; |
||
1038 |
return (l); |
||
1039 |
|||
1040 |
case SSL_CTRL_SET_MSG_CALLBACK_ARG: |
||
1041 |
s->internal->msg_callback_arg = parg; |
||
1042 |
return (1); |
||
1043 |
|||
1044 |
case SSL_CTRL_OPTIONS: |
||
1045 |
18170 |
return (s->internal->options|=larg); |
|
1046 |
case SSL_CTRL_CLEAR_OPTIONS: |
||
1047 |
105 |
return (s->internal->options&=~larg); |
|
1048 |
case SSL_CTRL_MODE: |
||
1049 |
return (s->internal->mode|=larg); |
||
1050 |
case SSL_CTRL_CLEAR_MODE: |
||
1051 |
return (s->internal->mode &=~larg); |
||
1052 |
case SSL_CTRL_GET_MAX_CERT_LIST: |
||
1053 |
return (s->internal->max_cert_list); |
||
1054 |
case SSL_CTRL_SET_MAX_CERT_LIST: |
||
1055 |
l = s->internal->max_cert_list; |
||
1056 |
s->internal->max_cert_list = larg; |
||
1057 |
return (l); |
||
1058 |
case SSL_CTRL_SET_MTU: |
||
1059 |
#ifndef OPENSSL_NO_DTLS1 |
||
1060 |
if (larg < (long)dtls1_min_mtu()) |
||
1061 |
return (0); |
||
1062 |
#endif |
||
1063 |
if (SSL_IS_DTLS(s)) { |
||
1064 |
D1I(s)->mtu = larg; |
||
1065 |
return (larg); |
||
1066 |
} |
||
1067 |
return (0); |
||
1068 |
case SSL_CTRL_SET_MAX_SEND_FRAGMENT: |
||
1069 |
if (larg < 512 || larg > SSL3_RT_MAX_PLAIN_LENGTH) |
||
1070 |
return (0); |
||
1071 |
s->max_send_fragment = larg; |
||
1072 |
return (1); |
||
1073 |
case SSL_CTRL_GET_RI_SUPPORT: |
||
1074 |
✓✗ | 4 |
if (s->s3) |
1075 |
4 |
return (S3I(s)->send_connection_binding); |
|
1076 |
else return (0); |
||
1077 |
default: |
||
1078 |
✗✓ | 15726 |
if (SSL_IS_DTLS(s)) |
1079 |
return dtls1_ctrl(s, cmd, larg, parg); |
||
1080 |
15726 |
return ssl3_ctrl(s, cmd, larg, parg); |
|
1081 |
} |
||
1082 |
34005 |
} |
|
1083 |
|||
1084 |
long |
||
1085 |
SSL_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) |
||
1086 |
{ |
||
1087 |
switch (cmd) { |
||
1088 |
case SSL_CTRL_SET_MSG_CALLBACK: |
||
1089 |
s->internal->msg_callback = (void (*)(int write_p, int version, |
||
1090 |
int content_type, const void *buf, size_t len, |
||
1091 |
SSL *ssl, void *arg))(fp); |
||
1092 |
return (1); |
||
1093 |
|||
1094 |
default: |
||
1095 |
return (ssl3_callback_ctrl(s, cmd, fp)); |
||
1096 |
} |
||
1097 |
} |
||
1098 |
|||
1099 |
struct lhash_st_SSL_SESSION * |
||
1100 |
SSL_CTX_sessions(SSL_CTX *ctx) |
||
1101 |
{ |
||
1102 |
return (ctx->internal->sessions); |
||
1103 |
} |
||
1104 |
|||
1105 |
long |
||
1106 |
SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) |
||
1107 |
{ |
||
1108 |
long l; |
||
1109 |
|||
1110 |
✗✗✗✗ ✗✗✗✓ ✗✗✗✗ ✗✗✗✗ ✗✗✗✗ ✗✓✓✓ ✗✗✓ |
2654 |
switch (cmd) { |
1111 |
case SSL_CTRL_GET_READ_AHEAD: |
||
1112 |
return (ctx->internal->read_ahead); |
||
1113 |
case SSL_CTRL_SET_READ_AHEAD: |
||
1114 |
l = ctx->internal->read_ahead; |
||
1115 |
ctx->internal->read_ahead = larg; |
||
1116 |
return (l); |
||
1117 |
|||
1118 |
case SSL_CTRL_SET_MSG_CALLBACK_ARG: |
||
1119 |
ctx->internal->msg_callback_arg = parg; |
||
1120 |
return (1); |
||
1121 |
|||
1122 |
case SSL_CTRL_GET_MAX_CERT_LIST: |
||
1123 |
return (ctx->internal->max_cert_list); |
||
1124 |
case SSL_CTRL_SET_MAX_CERT_LIST: |
||
1125 |
l = ctx->internal->max_cert_list; |
||
1126 |
ctx->internal->max_cert_list = larg; |
||
1127 |
return (l); |
||
1128 |
|||
1129 |
case SSL_CTRL_SET_SESS_CACHE_SIZE: |
||
1130 |
l = ctx->internal->session_cache_size; |
||
1131 |
ctx->internal->session_cache_size = larg; |
||
1132 |
return (l); |
||
1133 |
case SSL_CTRL_GET_SESS_CACHE_SIZE: |
||
1134 |
return (ctx->internal->session_cache_size); |
||
1135 |
case SSL_CTRL_SET_SESS_CACHE_MODE: |
||
1136 |
24 |
l = ctx->internal->session_cache_mode; |
|
1137 |
24 |
ctx->internal->session_cache_mode = larg; |
|
1138 |
24 |
return (l); |
|
1139 |
case SSL_CTRL_GET_SESS_CACHE_MODE: |
||
1140 |
return (ctx->internal->session_cache_mode); |
||
1141 |
|||
1142 |
case SSL_CTRL_SESS_NUMBER: |
||
1143 |
return (lh_SSL_SESSION_num_items(ctx->internal->sessions)); |
||
1144 |
case SSL_CTRL_SESS_CONNECT: |
||
1145 |
return (ctx->internal->stats.sess_connect); |
||
1146 |
case SSL_CTRL_SESS_CONNECT_GOOD: |
||
1147 |
return (ctx->internal->stats.sess_connect_good); |
||
1148 |
case SSL_CTRL_SESS_CONNECT_RENEGOTIATE: |
||
1149 |
return (ctx->internal->stats.sess_connect_renegotiate); |
||
1150 |
case SSL_CTRL_SESS_ACCEPT: |
||
1151 |
return (ctx->internal->stats.sess_accept); |
||
1152 |
case SSL_CTRL_SESS_ACCEPT_GOOD: |
||
1153 |
return (ctx->internal->stats.sess_accept_good); |
||
1154 |
case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE: |
||
1155 |
return (ctx->internal->stats.sess_accept_renegotiate); |
||
1156 |
case SSL_CTRL_SESS_HIT: |
||
1157 |
return (ctx->internal->stats.sess_hit); |
||
1158 |
case SSL_CTRL_SESS_CB_HIT: |
||
1159 |
return (ctx->internal->stats.sess_cb_hit); |
||
1160 |
case SSL_CTRL_SESS_MISSES: |
||
1161 |
return (ctx->internal->stats.sess_miss); |
||
1162 |
case SSL_CTRL_SESS_TIMEOUTS: |
||
1163 |
return (ctx->internal->stats.sess_timeout); |
||
1164 |
case SSL_CTRL_SESS_CACHE_FULL: |
||
1165 |
return (ctx->internal->stats.sess_cache_full); |
||
1166 |
case SSL_CTRL_OPTIONS: |
||
1167 |
443 |
return (ctx->internal->options|=larg); |
|
1168 |
case SSL_CTRL_CLEAR_OPTIONS: |
||
1169 |
170 |
return (ctx->internal->options&=~larg); |
|
1170 |
case SSL_CTRL_MODE: |
||
1171 |
150 |
return (ctx->internal->mode|=larg); |
|
1172 |
case SSL_CTRL_CLEAR_MODE: |
||
1173 |
return (ctx->internal->mode&=~larg); |
||
1174 |
case SSL_CTRL_SET_MAX_SEND_FRAGMENT: |
||
1175 |
if (larg < 512 || larg > SSL3_RT_MAX_PLAIN_LENGTH) |
||
1176 |
return (0); |
||
1177 |
ctx->internal->max_send_fragment = larg; |
||
1178 |
return (1); |
||
1179 |
default: |
||
1180 |
540 |
return (ssl3_ctx_ctrl(ctx, cmd, larg, parg)); |
|
1181 |
} |
||
1182 |
1327 |
} |
|
1183 |
|||
1184 |
long |
||
1185 |
SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) |
||
1186 |
{ |
||
1187 |
✗✓ | 378 |
switch (cmd) { |
1188 |
case SSL_CTRL_SET_MSG_CALLBACK: |
||
1189 |
ctx->internal->msg_callback = (void (*)(int write_p, int version, |
||
1190 |
int content_type, const void *buf, size_t len, SSL *ssl, |
||
1191 |
void *arg))(fp); |
||
1192 |
return (1); |
||
1193 |
|||
1194 |
default: |
||
1195 |
189 |
return (ssl3_ctx_callback_ctrl(ctx, cmd, fp)); |
|
1196 |
} |
||
1197 |
189 |
} |
|
1198 |
|||
1199 |
int |
||
1200 |
ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) |
||
1201 |
{ |
||
1202 |
long l; |
||
1203 |
|||
1204 |
216046 |
l = a->id - b->id; |
|
1205 |
✓✓ | 108023 |
if (l == 0L) |
1206 |
21139 |
return (0); |
|
1207 |
else |
||
1208 |
86884 |
return ((l > 0) ? 1:-1); |
|
1209 |
108023 |
} |
|
1210 |
|||
1211 |
int |
||
1212 |
ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, |
||
1213 |
const SSL_CIPHER * const *bp) |
||
1214 |
{ |
||
1215 |
long l; |
||
1216 |
|||
1217 |
654460 |
l = (*ap)->id - (*bp)->id; |
|
1218 |
✓✓ | 327230 |
if (l == 0L) |
1219 |
15871 |
return (0); |
|
1220 |
else |
||
1221 |
311359 |
return ((l > 0) ? 1:-1); |
|
1222 |
327230 |
} |
|
1223 |
|||
1224 |
/* |
||
1225 |
* Return a STACK of the ciphers available for the SSL and in order of |
||
1226 |
* preference. |
||
1227 |
*/ |
||
1228 |
STACK_OF(SSL_CIPHER) * |
||
1229 |
SSL_get_ciphers(const SSL *s) |
||
1230 |
{ |
||
1231 |
✓✗ | 95830 |
if (s != NULL) { |
1232 |
✓✓ | 47915 |
if (s->cipher_list != NULL) { |
1233 |
21 |
return (s->cipher_list); |
|
1234 |
✓✗✓✗ |
95788 |
} else if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL)) { |
1235 |
47894 |
return (s->ctx->cipher_list); |
|
1236 |
} |
||
1237 |
} |
||
1238 |
return (NULL); |
||
1239 |
47915 |
} |
|
1240 |
|||
1241 |
/* |
||
1242 |
* Return a STACK of the ciphers available for the SSL and in order of |
||
1243 |
* algorithm id. |
||
1244 |
*/ |
||
1245 |
STACK_OF(SSL_CIPHER) * |
||
1246 |
ssl_get_ciphers_by_id(SSL *s) |
||
1247 |
{ |
||
1248 |
✓✗ | 31742 |
if (s != NULL) { |
1249 |
✗✓ | 15871 |
if (s->internal->cipher_list_by_id != NULL) { |
1250 |
return (s->internal->cipher_list_by_id); |
||
1251 |
✓✗✓✗ |
31742 |
} else if ((s->ctx != NULL) && |
1252 |
15871 |
(s->ctx->internal->cipher_list_by_id != NULL)) { |
|
1253 |
15871 |
return (s->ctx->internal->cipher_list_by_id); |
|
1254 |
} |
||
1255 |
} |
||
1256 |
return (NULL); |
||
1257 |
15871 |
} |
|
1258 |
|||
1259 |
/* See if we have any ECC cipher suites. */ |
||
1260 |
int |
||
1261 |
ssl_has_ecc_ciphers(SSL *s) |
||
1262 |
{ |
||
1263 |
STACK_OF(SSL_CIPHER) *ciphers; |
||
1264 |
unsigned long alg_k, alg_a; |
||
1265 |
SSL_CIPHER *cipher; |
||
1266 |
int i; |
||
1267 |
|||
1268 |
✓✓ | 63670 |
if (s->version == DTLS1_VERSION) |
1269 |
78 |
return 0; |
|
1270 |
✗✓ | 31757 |
if ((ciphers = SSL_get_ciphers(s)) == NULL) |
1271 |
return 0; |
||
1272 |
|||
1273 |
✓✓ | 65614 |
for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { |
1274 |
32657 |
cipher = sk_SSL_CIPHER_value(ciphers, i); |
|
1275 |
|||
1276 |
32657 |
alg_k = cipher->algorithm_mkey; |
|
1277 |
32657 |
alg_a = cipher->algorithm_auth; |
|
1278 |
|||
1279 |
✓✓✗✓ |
33707 |
if ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA)) |
1280 |
31607 |
return 1; |
|
1281 |
} |
||
1282 |
|||
1283 |
150 |
return 0; |
|
1284 |
31835 |
} |
|
1285 |
|||
1286 |
/* The old interface to get the same thing as SSL_get_ciphers(). */ |
||
1287 |
const char * |
||
1288 |
SSL_get_cipher_list(const SSL *s, int n) |
||
1289 |
{ |
||
1290 |
SSL_CIPHER *c; |
||
1291 |
STACK_OF(SSL_CIPHER) *sk; |
||
1292 |
|||
1293 |
if (s == NULL) |
||
1294 |
return (NULL); |
||
1295 |
sk = SSL_get_ciphers(s); |
||
1296 |
if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n)) |
||
1297 |
return (NULL); |
||
1298 |
c = sk_SSL_CIPHER_value(sk, n); |
||
1299 |
if (c == NULL) |
||
1300 |
return (NULL); |
||
1301 |
return (c->name); |
||
1302 |
} |
||
1303 |
|||
1304 |
/* Specify the ciphers to be used by default by the SSL_CTX. */ |
||
1305 |
int |
||
1306 |
SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) |
||
1307 |
{ |
||
1308 |
STACK_OF(SSL_CIPHER) *sk; |
||
1309 |
|||
1310 |
1002 |
sk = ssl_create_cipher_list(ctx->method, &ctx->cipher_list, |
|
1311 |
334 |
&ctx->internal->cipher_list_by_id, str); |
|
1312 |
/* |
||
1313 |
* ssl_create_cipher_list may return an empty stack if it |
||
1314 |
* was unable to find a cipher matching the given rule string |
||
1315 |
* (for example if the rule string specifies a cipher which |
||
1316 |
* has been disabled). This is not an error as far as |
||
1317 |
* ssl_create_cipher_list is concerned, and hence |
||
1318 |
* ctx->cipher_list and ctx->internal->cipher_list_by_id has been |
||
1319 |
* updated. |
||
1320 |
*/ |
||
1321 |
✗✓ | 334 |
if (sk == NULL) |
1322 |
return (0); |
||
1323 |
✗✓ | 334 |
else if (sk_SSL_CIPHER_num(sk) == 0) { |
1324 |
SSLerrorx(SSL_R_NO_CIPHER_MATCH); |
||
1325 |
return (0); |
||
1326 |
} |
||
1327 |
334 |
return (1); |
|
1328 |
334 |
} |
|
1329 |
|||
1330 |
/* Specify the ciphers to be used by the SSL. */ |
||
1331 |
int |
||
1332 |
SSL_set_cipher_list(SSL *s, const char *str) |
||
1333 |
{ |
||
1334 |
STACK_OF(SSL_CIPHER) *sk; |
||
1335 |
|||
1336 |
36 |
sk = ssl_create_cipher_list(s->ctx->method, &s->cipher_list, |
|
1337 |
12 |
&s->internal->cipher_list_by_id, str); |
|
1338 |
/* see comment in SSL_CTX_set_cipher_list */ |
||
1339 |
✗✓ | 12 |
if (sk == NULL) |
1340 |
return (0); |
||
1341 |
✗✓ | 12 |
else if (sk_SSL_CIPHER_num(sk) == 0) { |
1342 |
SSLerror(s, SSL_R_NO_CIPHER_MATCH); |
||
1343 |
return (0); |
||
1344 |
} |
||
1345 |
12 |
return (1); |
|
1346 |
12 |
} |
|
1347 |
|||
1348 |
/* works well for SSLv2, not so good for SSLv3 */ |
||
1349 |
char * |
||
1350 |
SSL_get_shared_ciphers(const SSL *s, char *buf, int len) |
||
1351 |
{ |
||
1352 |
char *end; |
||
1353 |
STACK_OF(SSL_CIPHER) *sk; |
||
1354 |
SSL_CIPHER *c; |
||
1355 |
size_t curlen = 0; |
||
1356 |
int i; |
||
1357 |
|||
1358 |
✓✗✓✗ |
12 |
if (s->session == NULL || s->session->ciphers == NULL || len < 2) |
1359 |
4 |
return (NULL); |
|
1360 |
|||
1361 |
sk = s->session->ciphers; |
||
1362 |
if (sk_SSL_CIPHER_num(sk) == 0) |
||
1363 |
return (NULL); |
||
1364 |
|||
1365 |
buf[0] = '\0'; |
||
1366 |
for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { |
||
1367 |
c = sk_SSL_CIPHER_value(sk, i); |
||
1368 |
end = buf + curlen; |
||
1369 |
if (strlcat(buf, c->name, len) >= len || |
||
1370 |
(curlen = strlcat(buf, ":", len)) >= len) { |
||
1371 |
/* remove truncated cipher from list */ |
||
1372 |
*end = '\0'; |
||
1373 |
break; |
||
1374 |
} |
||
1375 |
} |
||
1376 |
/* remove trailing colon */ |
||
1377 |
if ((end = strrchr(buf, ':')) != NULL) |
||
1378 |
*end = '\0'; |
||
1379 |
return (buf); |
||
1380 |
4 |
} |
|
1381 |
|||
1382 |
int |
||
1383 |
ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *ciphers, CBB *cbb) |
||
1384 |
{ |
||
1385 |
SSL_CIPHER *cipher; |
||
1386 |
int num_ciphers = 0; |
||
1387 |
int i; |
||
1388 |
|||
1389 |
✗✓ | 31820 |
if (ciphers == NULL) |
1390 |
return 0; |
||
1391 |
|||
1392 |
✓✓ | 1516344 |
for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { |
1393 |
✗✓ | 742262 |
if ((cipher = sk_SSL_CIPHER_value(ciphers, i)) == NULL) |
1394 |
return 0; |
||
1395 |
|||
1396 |
/* Skip TLS v1.2 only ciphersuites if lower than v1.2 */ |
||
1397 |
✓✓✓✓ |
1105600 |
if ((cipher->algorithm_ssl & SSL_TLSV1_2) && |
1398 |
✓✓ | 1089669 |
(TLS1_get_client_version(s) < TLS1_2_VERSION)) |
1399 |
continue; |
||
1400 |
|||
1401 |
✗✓ | 740771 |
if (!CBB_add_u16(cbb, ssl3_cipher_get_value(cipher))) |
1402 |
return 0; |
||
1403 |
|||
1404 |
740771 |
num_ciphers++; |
|
1405 |
740771 |
} |
|
1406 |
|||
1407 |
/* Add SCSV if there are other ciphers and we're not renegotiating. */ |
||
1408 |
✓✗✓✓ |
31820 |
if (num_ciphers > 0 && !s->internal->renegotiate) { |
1409 |
✗✓ | 15907 |
if (!CBB_add_u16(cbb, SSL3_CK_SCSV & SSL3_CK_VALUE_MASK)) |
1410 |
return 0; |
||
1411 |
} |
||
1412 |
|||
1413 |
✗✓ | 15910 |
if (!CBB_flush(cbb)) |
1414 |
return 0; |
||
1415 |
|||
1416 |
15910 |
return 1; |
|
1417 |
15910 |
} |
|
1418 |
|||
1419 |
STACK_OF(SSL_CIPHER) * |
||
1420 |
ssl_bytes_to_cipher_list(SSL *s, CBS *cbs) |
||
1421 |
{ |
||
1422 |
STACK_OF(SSL_CIPHER) *ciphers = NULL; |
||
1423 |
const SSL_CIPHER *cipher; |
||
1424 |
414 |
uint16_t cipher_value, max_version; |
|
1425 |
unsigned long cipher_id; |
||
1426 |
|||
1427 |
✓✗ | 207 |
if (s->s3 != NULL) |
1428 |
207 |
S3I(s)->send_connection_binding = 0; |
|
1429 |
|||
1430 |
✗✓ | 207 |
if ((ciphers = sk_SSL_CIPHER_new_null()) == NULL) { |
1431 |
SSLerror(s, ERR_R_MALLOC_FAILURE); |
||
1432 |
goto err; |
||
1433 |
} |
||
1434 |
|||
1435 |
✓✓ | 6687 |
while (CBS_len(cbs) > 0) { |
1436 |
✓✓ | 3240 |
if (!CBS_get_u16(cbs, &cipher_value)) { |
1437 |
6 |
SSLerror(s, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); |
|
1438 |
6 |
goto err; |
|
1439 |
} |
||
1440 |
|||
1441 |
3234 |
cipher_id = SSL3_CK_ID | cipher_value; |
|
1442 |
|||
1443 |
✓✓ | 3234 |
if (s->s3 != NULL && cipher_id == SSL3_CK_SCSV) { |
1444 |
/* |
||
1445 |
* TLS_EMPTY_RENEGOTIATION_INFO_SCSV is fatal if |
||
1446 |
* renegotiating. |
||
1447 |
*/ |
||
1448 |
✗✓ | 195 |
if (s->internal->renegotiate) { |
1449 |
SSLerror(s, SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING); |
||
1450 |
ssl3_send_alert(s, SSL3_AL_FATAL, |
||
1451 |
SSL_AD_HANDSHAKE_FAILURE); |
||
1452 |
|||
1453 |
goto err; |
||
1454 |
} |
||
1455 |
195 |
S3I(s)->send_connection_binding = 1; |
|
1456 |
195 |
continue; |
|
1457 |
} |
||
1458 |
|||
1459 |
✗✓ | 3039 |
if (cipher_id == SSL3_CK_FALLBACK_SCSV) { |
1460 |
/* |
||
1461 |
* TLS_FALLBACK_SCSV indicates that the client |
||
1462 |
* previously tried a higher protocol version. |
||
1463 |
* Fail if the current version is an unexpected |
||
1464 |
* downgrade. |
||
1465 |
*/ |
||
1466 |
max_version = ssl_max_server_version(s); |
||
1467 |
if (max_version == 0 || s->version < max_version) { |
||
1468 |
SSLerror(s, SSL_R_INAPPROPRIATE_FALLBACK); |
||
1469 |
if (s->s3 != NULL) |
||
1470 |
ssl3_send_alert(s, SSL3_AL_FATAL, |
||
1471 |
SSL_AD_INAPPROPRIATE_FALLBACK); |
||
1472 |
goto err; |
||
1473 |
} |
||
1474 |
continue; |
||
1475 |
} |
||
1476 |
|||
1477 |
✓✓ | 3039 |
if ((cipher = ssl3_get_cipher_by_value(cipher_value)) != NULL) { |
1478 |
✗✓ | 2889 |
if (!sk_SSL_CIPHER_push(ciphers, cipher)) { |
1479 |
SSLerror(s, ERR_R_MALLOC_FAILURE); |
||
1480 |
goto err; |
||
1481 |
} |
||
1482 |
} |
||
1483 |
} |
||
1484 |
|||
1485 |
201 |
return (ciphers); |
|
1486 |
|||
1487 |
err: |
||
1488 |
6 |
sk_SSL_CIPHER_free(ciphers); |
|
1489 |
|||
1490 |
6 |
return (NULL); |
|
1491 |
207 |
} |
|
1492 |
|||
1493 |
|||
1494 |
/* |
||
1495 |
* Return a servername extension value if provided in Client Hello, or NULL. |
||
1496 |
* So far, only host_name types are defined (RFC 3546). |
||
1497 |
*/ |
||
1498 |
const char * |
||
1499 |
SSL_get_servername(const SSL *s, const int type) |
||
1500 |
{ |
||
1501 |
✗✓ | 24 |
if (type != TLSEXT_NAMETYPE_host_name) |
1502 |
return (NULL); |
||
1503 |
|||
1504 |
✓✗✓✗ |
48 |
return (s->session && !s->tlsext_hostname ? |
1505 |
12 |
s->session->tlsext_hostname : |
|
1506 |
s->tlsext_hostname); |
||
1507 |
12 |
} |
|
1508 |
|||
1509 |
int |
||
1510 |
SSL_get_servername_type(const SSL *s) |
||
1511 |
{ |
||
1512 |
if (s->session && |
||
1513 |
(!s->tlsext_hostname ? |
||
1514 |
s->session->tlsext_hostname : s->tlsext_hostname)) |
||
1515 |
return (TLSEXT_NAMETYPE_host_name); |
||
1516 |
return (-1); |
||
1517 |
} |
||
1518 |
|||
1519 |
/* |
||
1520 |
* SSL_select_next_proto implements standard protocol selection. It is |
||
1521 |
* expected that this function is called from the callback set by |
||
1522 |
* SSL_CTX_set_alpn_select_cb. |
||
1523 |
* |
||
1524 |
* The protocol data is assumed to be a vector of 8-bit, length prefixed byte |
||
1525 |
* strings. The length byte itself is not included in the length. A byte |
||
1526 |
* string of length 0 is invalid. No byte string may be truncated. |
||
1527 |
* |
||
1528 |
* It returns either: |
||
1529 |
* OPENSSL_NPN_NEGOTIATED if a common protocol was found, or |
||
1530 |
* OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. |
||
1531 |
*/ |
||
1532 |
int |
||
1533 |
SSL_select_next_proto(unsigned char **out, unsigned char *outlen, |
||
1534 |
const unsigned char *server, unsigned int server_len, |
||
1535 |
const unsigned char *client, unsigned int client_len) |
||
1536 |
{ |
||
1537 |
unsigned int i, j; |
||
1538 |
const unsigned char *result; |
||
1539 |
int status = OPENSSL_NPN_UNSUPPORTED; |
||
1540 |
|||
1541 |
/* |
||
1542 |
* For each protocol in server preference order, |
||
1543 |
* see if we support it. |
||
1544 |
*/ |
||
1545 |
✓✓ | 90 |
for (i = 0; i < server_len; ) { |
1546 |
✓✓ | 90 |
for (j = 0; j < client_len; ) { |
1547 |
✓✗✓✓ |
72 |
if (server[i] == client[j] && |
1548 |
72 |
memcmp(&server[i + 1], |
|
1549 |
72 |
&client[j + 1], server[i]) == 0) { |
|
1550 |
/* We found a match */ |
||
1551 |
result = &server[i]; |
||
1552 |
status = OPENSSL_NPN_NEGOTIATED; |
||
1553 |
18 |
goto found; |
|
1554 |
} |
||
1555 |
18 |
j += client[j]; |
|
1556 |
18 |
j++; |
|
1557 |
} |
||
1558 |
9 |
i += server[i]; |
|
1559 |
9 |
i++; |
|
1560 |
} |
||
1561 |
|||
1562 |
/* There's no overlap between our protocols and the server's list. */ |
||
1563 |
result = client; |
||
1564 |
6 |
status = OPENSSL_NPN_NO_OVERLAP; |
|
1565 |
|||
1566 |
found: |
||
1567 |
24 |
*out = (unsigned char *) result + 1; |
|
1568 |
24 |
*outlen = result[0]; |
|
1569 |
24 |
return (status); |
|
1570 |
} |
||
1571 |
|||
1572 |
/* SSL_get0_next_proto_negotiated is deprecated. */ |
||
1573 |
void |
||
1574 |
SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, |
||
1575 |
unsigned *len) |
||
1576 |
{ |
||
1577 |
*data = NULL; |
||
1578 |
*len = 0; |
||
1579 |
} |
||
1580 |
|||
1581 |
/* SSL_CTX_set_next_protos_advertised_cb is deprecated. */ |
||
1582 |
void |
||
1583 |
SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, |
||
1584 |
const unsigned char **out, unsigned int *outlen, void *arg), void *arg) |
||
1585 |
{ |
||
1586 |
} |
||
1587 |
|||
1588 |
/* SSL_CTX_set_next_proto_select_cb is deprecated. */ |
||
1589 |
void |
||
1590 |
SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, |
||
1591 |
unsigned char **out, unsigned char *outlen, const unsigned char *in, |
||
1592 |
unsigned int inlen, void *arg), void *arg) |
||
1593 |
{ |
||
1594 |
} |
||
1595 |
|||
1596 |
/* |
||
1597 |
* SSL_CTX_set_alpn_protos sets the ALPN protocol list to the specified |
||
1598 |
* protocols, which must be in wire-format (i.e. a series of non-empty, |
||
1599 |
* 8-bit length-prefixed strings). Returns 0 on success. |
||
1600 |
*/ |
||
1601 |
int |
||
1602 |
SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, |
||
1603 |
unsigned int protos_len) |
||
1604 |
{ |
||
1605 |
int failed = 1; |
||
1606 |
|||
1607 |
✓✗ | 52 |
if (protos == NULL || protos_len == 0) |
1608 |
goto err; |
||
1609 |
|||
1610 |
26 |
free(ctx->internal->alpn_client_proto_list); |
|
1611 |
26 |
ctx->internal->alpn_client_proto_list = NULL; |
|
1612 |
26 |
ctx->internal->alpn_client_proto_list_len = 0; |
|
1613 |
|||
1614 |
✓✗ | 52 |
if ((ctx->internal->alpn_client_proto_list = malloc(protos_len)) |
1615 |
26 |
== NULL) |
|
1616 |
goto err; |
||
1617 |
26 |
ctx->internal->alpn_client_proto_list_len = protos_len; |
|
1618 |
|||
1619 |
26 |
memcpy(ctx->internal->alpn_client_proto_list, protos, protos_len); |
|
1620 |
|||
1621 |
26 |
failed = 0; |
|
1622 |
|||
1623 |
err: |
||
1624 |
/* NOTE: Return values are the reverse of what you expect. */ |
||
1625 |
26 |
return (failed); |
|
1626 |
} |
||
1627 |
|||
1628 |
/* |
||
1629 |
* SSL_set_alpn_protos sets the ALPN protocol list to the specified |
||
1630 |
* protocols, which must be in wire-format (i.e. a series of non-empty, |
||
1631 |
* 8-bit length-prefixed strings). Returns 0 on success. |
||
1632 |
*/ |
||
1633 |
int |
||
1634 |
SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, |
||
1635 |
unsigned int protos_len) |
||
1636 |
{ |
||
1637 |
int failed = 1; |
||
1638 |
|||
1639 |
✓✗ | 30 |
if (protos == NULL || protos_len == 0) |
1640 |
goto err; |
||
1641 |
|||
1642 |
15 |
free(ssl->internal->alpn_client_proto_list); |
|
1643 |
15 |
ssl->internal->alpn_client_proto_list = NULL; |
|
1644 |
15 |
ssl->internal->alpn_client_proto_list_len = 0; |
|
1645 |
|||
1646 |
✓✗ | 30 |
if ((ssl->internal->alpn_client_proto_list = malloc(protos_len)) |
1647 |
15 |
== NULL) |
|
1648 |
goto err; |
||
1649 |
15 |
ssl->internal->alpn_client_proto_list_len = protos_len; |
|
1650 |
|||
1651 |
15 |
memcpy(ssl->internal->alpn_client_proto_list, protos, protos_len); |
|
1652 |
|||
1653 |
15 |
failed = 0; |
|
1654 |
|||
1655 |
err: |
||
1656 |
/* NOTE: Return values are the reverse of what you expect. */ |
||
1657 |
15 |
return (failed); |
|
1658 |
} |
||
1659 |
|||
1660 |
/* |
||
1661 |
* SSL_CTX_set_alpn_select_cb sets a callback function that is called during |
||
1662 |
* ClientHello processing in order to select an ALPN protocol from the |
||
1663 |
* client's list of offered protocols. |
||
1664 |
*/ |
||
1665 |
void |
||
1666 |
SSL_CTX_set_alpn_select_cb(SSL_CTX* ctx, |
||
1667 |
int (*cb) (SSL *ssl, const unsigned char **out, unsigned char *outlen, |
||
1668 |
const unsigned char *in, unsigned int inlen, void *arg), void *arg) |
||
1669 |
{ |
||
1670 |
60 |
ctx->internal->alpn_select_cb = cb; |
|
1671 |
30 |
ctx->internal->alpn_select_cb_arg = arg; |
|
1672 |
30 |
} |
|
1673 |
|||
1674 |
/* |
||
1675 |
* SSL_get0_alpn_selected gets the selected ALPN protocol (if any). On return |
||
1676 |
* it sets data to point to len bytes of protocol name (not including the |
||
1677 |
* leading length-prefix byte). If the server didn't respond with* a negotiated |
||
1678 |
* protocol then len will be zero. |
||
1679 |
*/ |
||
1680 |
void |
||
1681 |
SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, |
||
1682 |
unsigned *len) |
||
1683 |
{ |
||
1684 |
776 |
*data = NULL; |
|
1685 |
388 |
*len = 0; |
|
1686 |
|||
1687 |
✓✗ | 388 |
if (ssl->s3 != NULL) { |
1688 |
388 |
*data = ssl->s3->internal->alpn_selected; |
|
1689 |
388 |
*len = ssl->s3->internal->alpn_selected_len; |
|
1690 |
388 |
} |
|
1691 |
388 |
} |
|
1692 |
|||
1693 |
int |
||
1694 |
SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, |
||
1695 |
const char *label, size_t llen, const unsigned char *p, size_t plen, |
||
1696 |
int use_context) |
||
1697 |
{ |
||
1698 |
return (tls1_export_keying_material(s, out, olen, |
||
1699 |
label, llen, p, plen, use_context)); |
||
1700 |
} |
||
1701 |
|||
1702 |
static unsigned long |
||
1703 |
ssl_session_hash(const SSL_SESSION *a) |
||
1704 |
{ |
||
1705 |
unsigned long l; |
||
1706 |
|||
1707 |
36 |
l = (unsigned long) |
|
1708 |
108 |
((unsigned int) a->session_id[0] )| |
|
1709 |
72 |
((unsigned int) a->session_id[1]<< 8L)| |
|
1710 |
72 |
((unsigned long)a->session_id[2]<<16L)| |
|
1711 |
36 |
((unsigned long)a->session_id[3]<<24L); |
|
1712 |
36 |
return (l); |
|
1713 |
} |
||
1714 |
|||
1715 |
/* |
||
1716 |
* NB: If this function (or indeed the hash function which uses a sort of |
||
1717 |
* coarser function than this one) is changed, ensure |
||
1718 |
* SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being |
||
1719 |
* able to construct an SSL_SESSION that will collide with any existing session |
||
1720 |
* with a matching session ID. |
||
1721 |
*/ |
||
1722 |
static int |
||
1723 |
ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) |
||
1724 |
{ |
||
1725 |
if (a->ssl_version != b->ssl_version) |
||
1726 |
return (1); |
||
1727 |
if (a->session_id_length != b->session_id_length) |
||
1728 |
return (1); |
||
1729 |
if (timingsafe_memcmp(a->session_id, b->session_id, a->session_id_length) != 0) |
||
1730 |
return (1); |
||
1731 |
return (0); |
||
1732 |
} |
||
1733 |
|||
1734 |
/* |
||
1735 |
* These wrapper functions should remain rather than redeclaring |
||
1736 |
* SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each |
||
1737 |
* variable. The reason is that the functions aren't static, they're exposed via |
||
1738 |
* ssl.h. |
||
1739 |
*/ |
||
1740 |
static unsigned long |
||
1741 |
ssl_session_LHASH_HASH(const void *arg) |
||
1742 |
{ |
||
1743 |
72 |
const SSL_SESSION *a = arg; |
|
1744 |
|||
1745 |
36 |
return ssl_session_hash(a); |
|
1746 |
} |
||
1747 |
|||
1748 |
static int |
||
1749 |
ssl_session_LHASH_COMP(const void *arg1, const void *arg2) |
||
1750 |
{ |
||
1751 |
const SSL_SESSION *a = arg1; |
||
1752 |
const SSL_SESSION *b = arg2; |
||
1753 |
|||
1754 |
return ssl_session_cmp(a, b); |
||
1755 |
} |
||
1756 |
|||
1757 |
SSL_CTX * |
||
1758 |
SSL_CTX_new(const SSL_METHOD *meth) |
||
1759 |
{ |
||
1760 |
SSL_CTX *ret; |
||
1761 |
|||
1762 |
✗✓ | 1526 |
if (meth == NULL) { |
1763 |
SSLerrorx(SSL_R_NULL_SSL_METHOD_PASSED); |
||
1764 |
return (NULL); |
||
1765 |
} |
||
1766 |
|||
1767 |
✗✓ | 763 |
if ((ret = calloc(1, sizeof(*ret))) == NULL) { |
1768 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
1769 |
return (NULL); |
||
1770 |
} |
||
1771 |
✗✓ | 763 |
if ((ret->internal = calloc(1, sizeof(*ret->internal))) == NULL) { |
1772 |
free(ret); |
||
1773 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
1774 |
return (NULL); |
||
1775 |
} |
||
1776 |
|||
1777 |
✗✓ | 763 |
if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) { |
1778 |
SSLerrorx(SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); |
||
1779 |
goto err; |
||
1780 |
} |
||
1781 |
|||
1782 |
763 |
ret->method = meth; |
|
1783 |
763 |
ret->internal->min_version = meth->internal->min_version; |
|
1784 |
763 |
ret->internal->max_version = meth->internal->max_version; |
|
1785 |
|||
1786 |
763 |
ret->cert_store = NULL; |
|
1787 |
763 |
ret->internal->session_cache_mode = SSL_SESS_CACHE_SERVER; |
|
1788 |
763 |
ret->internal->session_cache_size = SSL_SESSION_CACHE_MAX_SIZE_DEFAULT; |
|
1789 |
763 |
ret->internal->session_cache_head = NULL; |
|
1790 |
763 |
ret->internal->session_cache_tail = NULL; |
|
1791 |
|||
1792 |
/* We take the system default */ |
||
1793 |
763 |
ret->session_timeout = meth->internal->get_timeout(); |
|
1794 |
|||
1795 |
763 |
ret->internal->new_session_cb = 0; |
|
1796 |
763 |
ret->internal->remove_session_cb = 0; |
|
1797 |
763 |
ret->internal->get_session_cb = 0; |
|
1798 |
763 |
ret->internal->generate_session_id = 0; |
|
1799 |
|||
1800 |
763 |
memset((char *)&ret->internal->stats, 0, sizeof(ret->internal->stats)); |
|
1801 |
|||
1802 |
763 |
ret->references = 1; |
|
1803 |
763 |
ret->internal->quiet_shutdown = 0; |
|
1804 |
|||
1805 |
763 |
ret->internal->info_callback = NULL; |
|
1806 |
|||
1807 |
763 |
ret->internal->app_verify_callback = 0; |
|
1808 |
763 |
ret->internal->app_verify_arg = NULL; |
|
1809 |
|||
1810 |
763 |
ret->internal->max_cert_list = SSL_MAX_CERT_LIST_DEFAULT; |
|
1811 |
763 |
ret->internal->read_ahead = 0; |
|
1812 |
763 |
ret->internal->msg_callback = 0; |
|
1813 |
763 |
ret->internal->msg_callback_arg = NULL; |
|
1814 |
763 |
ret->verify_mode = SSL_VERIFY_NONE; |
|
1815 |
763 |
ret->sid_ctx_length = 0; |
|
1816 |
763 |
ret->internal->default_verify_callback = NULL; |
|
1817 |
✓✗ | 763 |
if ((ret->internal->cert = ssl_cert_new()) == NULL) |
1818 |
goto err; |
||
1819 |
|||
1820 |
763 |
ret->default_passwd_callback = 0; |
|
1821 |
763 |
ret->default_passwd_callback_userdata = NULL; |
|
1822 |
763 |
ret->internal->client_cert_cb = 0; |
|
1823 |
763 |
ret->internal->app_gen_cookie_cb = 0; |
|
1824 |
763 |
ret->internal->app_verify_cookie_cb = 0; |
|
1825 |
|||
1826 |
763 |
ret->internal->sessions = lh_SSL_SESSION_new(); |
|
1827 |
✓✗ | 763 |
if (ret->internal->sessions == NULL) |
1828 |
goto err; |
||
1829 |
763 |
ret->cert_store = X509_STORE_new(); |
|
1830 |
✓✗ | 763 |
if (ret->cert_store == NULL) |
1831 |
goto err; |
||
1832 |
|||
1833 |
1526 |
ssl_create_cipher_list(ret->method, &ret->cipher_list, |
|
1834 |
763 |
&ret->internal->cipher_list_by_id, SSL_DEFAULT_CIPHER_LIST); |
|
1835 |
✓✗✗✓ |
1526 |
if (ret->cipher_list == NULL || |
1836 |
763 |
sk_SSL_CIPHER_num(ret->cipher_list) <= 0) { |
|
1837 |
SSLerrorx(SSL_R_LIBRARY_HAS_NO_CIPHERS); |
||
1838 |
goto err2; |
||
1839 |
} |
||
1840 |
|||
1841 |
763 |
ret->param = X509_VERIFY_PARAM_new(); |
|
1842 |
✓✗ | 763 |
if (!ret->param) |
1843 |
goto err; |
||
1844 |
|||
1845 |
✓✗ | 763 |
if ((ret->internal->client_CA = sk_X509_NAME_new_null()) == NULL) |
1846 |
goto err; |
||
1847 |
|||
1848 |
763 |
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->internal->ex_data); |
|
1849 |
|||
1850 |
763 |
ret->extra_certs = NULL; |
|
1851 |
|||
1852 |
763 |
ret->internal->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; |
|
1853 |
|||
1854 |
763 |
ret->internal->tlsext_servername_callback = 0; |
|
1855 |
763 |
ret->internal->tlsext_servername_arg = NULL; |
|
1856 |
|||
1857 |
/* Setup RFC4507 ticket keys */ |
||
1858 |
763 |
arc4random_buf(ret->internal->tlsext_tick_key_name, 16); |
|
1859 |
763 |
arc4random_buf(ret->internal->tlsext_tick_hmac_key, 16); |
|
1860 |
763 |
arc4random_buf(ret->internal->tlsext_tick_aes_key, 16); |
|
1861 |
|||
1862 |
763 |
ret->internal->tlsext_status_cb = 0; |
|
1863 |
763 |
ret->internal->tlsext_status_arg = NULL; |
|
1864 |
|||
1865 |
#ifndef OPENSSL_NO_ENGINE |
||
1866 |
763 |
ret->internal->client_cert_engine = NULL; |
|
1867 |
#ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO |
||
1868 |
#define eng_strx(x) #x |
||
1869 |
#define eng_str(x) eng_strx(x) |
||
1870 |
/* Use specific client engine automatically... ignore errors */ |
||
1871 |
{ |
||
1872 |
ENGINE *eng; |
||
1873 |
eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO)); |
||
1874 |
if (!eng) { |
||
1875 |
ERR_clear_error(); |
||
1876 |
ENGINE_load_builtin_engines(); |
||
1877 |
eng = ENGINE_by_id(eng_str( |
||
1878 |
OPENSSL_SSL_CLIENT_ENGINE_AUTO)); |
||
1879 |
} |
||
1880 |
if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng)) |
||
1881 |
ERR_clear_error(); |
||
1882 |
} |
||
1883 |
#endif |
||
1884 |
#endif |
||
1885 |
/* |
||
1886 |
* Default is to connect to non-RI servers. When RI is more widely |
||
1887 |
* deployed might change this. |
||
1888 |
*/ |
||
1889 |
763 |
ret->internal->options |= SSL_OP_LEGACY_SERVER_CONNECT; |
|
1890 |
|||
1891 |
763 |
return (ret); |
|
1892 |
err: |
||
1893 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
1894 |
err2: |
||
1895 |
SSL_CTX_free(ret); |
||
1896 |
return (NULL); |
||
1897 |
763 |
} |
|
1898 |
|||
1899 |
void |
||
1900 |
SSL_CTX_free(SSL_CTX *ctx) |
||
1901 |
{ |
||
1902 |
int i; |
||
1903 |
|||
1904 |
✓✓ | 8708 |
if (ctx == NULL) |
1905 |
222 |
return; |
|
1906 |
|||
1907 |
4132 |
i = CRYPTO_add(&ctx->references, -1, CRYPTO_LOCK_SSL_CTX); |
|
1908 |
✓✓ | 4132 |
if (i > 0) |
1909 |
3390 |
return; |
|
1910 |
|||
1911 |
742 |
X509_VERIFY_PARAM_free(ctx->param); |
|
1912 |
|||
1913 |
/* |
||
1914 |
* Free internal session cache. However: the remove_cb() may reference |
||
1915 |
* the ex_data of SSL_CTX, thus the ex_data store can only be removed |
||
1916 |
* after the sessions were flushed. |
||
1917 |
* As the ex_data handling routines might also touch the session cache, |
||
1918 |
* the most secure solution seems to be: empty (flush) the cache, then |
||
1919 |
* free ex_data, then finally free the cache. |
||
1920 |
* (See ticket [openssl.org #212].) |
||
1921 |
*/ |
||
1922 |
✓✗ | 742 |
if (ctx->internal->sessions != NULL) |
1923 |
742 |
SSL_CTX_flush_sessions(ctx, 0); |
|
1924 |
|||
1925 |
742 |
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ctx, &ctx->internal->ex_data); |
|
1926 |
|||
1927 |
742 |
lh_SSL_SESSION_free(ctx->internal->sessions); |
|
1928 |
|||
1929 |
742 |
X509_STORE_free(ctx->cert_store); |
|
1930 |
742 |
sk_SSL_CIPHER_free(ctx->cipher_list); |
|
1931 |
742 |
sk_SSL_CIPHER_free(ctx->internal->cipher_list_by_id); |
|
1932 |
742 |
ssl_cert_free(ctx->internal->cert); |
|
1933 |
742 |
sk_X509_NAME_pop_free(ctx->internal->client_CA, X509_NAME_free); |
|
1934 |
742 |
sk_X509_pop_free(ctx->extra_certs, X509_free); |
|
1935 |
|||
1936 |
#ifndef OPENSSL_NO_SRTP |
||
1937 |
✗✓ | 742 |
if (ctx->internal->srtp_profiles) |
1938 |
sk_SRTP_PROTECTION_PROFILE_free(ctx->internal->srtp_profiles); |
||
1939 |
#endif |
||
1940 |
|||
1941 |
#ifndef OPENSSL_NO_ENGINE |
||
1942 |
✗✓ | 742 |
if (ctx->internal->client_cert_engine) |
1943 |
ENGINE_finish(ctx->internal->client_cert_engine); |
||
1944 |
#endif |
||
1945 |
|||
1946 |
742 |
free(ctx->internal->tlsext_ecpointformatlist); |
|
1947 |
742 |
free(ctx->internal->tlsext_supportedgroups); |
|
1948 |
|||
1949 |
742 |
free(ctx->internal->alpn_client_proto_list); |
|
1950 |
|||
1951 |
742 |
free(ctx->internal); |
|
1952 |
742 |
free(ctx); |
|
1953 |
5096 |
} |
|
1954 |
|||
1955 |
void |
||
1956 |
SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb) |
||
1957 |
{ |
||
1958 |
ctx->default_passwd_callback = cb; |
||
1959 |
} |
||
1960 |
|||
1961 |
void |
||
1962 |
SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) |
||
1963 |
{ |
||
1964 |
ctx->default_passwd_callback_userdata = u; |
||
1965 |
} |
||
1966 |
|||
1967 |
void |
||
1968 |
SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *, |
||
1969 |
void *), void *arg) |
||
1970 |
{ |
||
1971 |
108 |
ctx->internal->app_verify_callback = cb; |
|
1972 |
54 |
ctx->internal->app_verify_arg = arg; |
|
1973 |
54 |
} |
|
1974 |
|||
1975 |
void |
||
1976 |
SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int (*cb)(int, X509_STORE_CTX *)) |
||
1977 |
{ |
||
1978 |
328 |
ctx->verify_mode = mode; |
|
1979 |
164 |
ctx->internal->default_verify_callback = cb; |
|
1980 |
164 |
} |
|
1981 |
|||
1982 |
void |
||
1983 |
SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) |
||
1984 |
{ |
||
1985 |
24 |
X509_VERIFY_PARAM_set_depth(ctx->param, depth); |
|
1986 |
12 |
} |
|
1987 |
|||
1988 |
void |
||
1989 |
ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) |
||
1990 |
{ |
||
1991 |
int rsa_enc, rsa_sign, dh_tmp; |
||
1992 |
int have_ecc_cert; |
||
1993 |
unsigned long mask_k, mask_a; |
||
1994 |
X509 *x = NULL; |
||
1995 |
CERT_PKEY *cpk; |
||
1996 |
|||
1997 |
✗✓ | 816 |
if (c == NULL) |
1998 |
return; |
||
1999 |
|||
2000 |
✓✓✓✗ |
936 |
dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL || |
2001 |
60 |
c->dh_tmp_auto != 0); |
|
2002 |
|||
2003 |
408 |
cpk = &(c->pkeys[SSL_PKEY_RSA_ENC]); |
|
2004 |
✓✗ | 1224 |
rsa_enc = (cpk->x509 != NULL && cpk->privatekey != NULL); |
2005 |
408 |
cpk = &(c->pkeys[SSL_PKEY_RSA_SIGN]); |
|
2006 |
✗✓ | 816 |
rsa_sign = (cpk->x509 != NULL && cpk->privatekey != NULL); |
2007 |
408 |
cpk = &(c->pkeys[SSL_PKEY_ECC]); |
|
2008 |
✗✓ | 816 |
have_ecc_cert = (cpk->x509 != NULL && cpk->privatekey != NULL); |
2009 |
|||
2010 |
mask_k = 0; |
||
2011 |
mask_a = 0; |
||
2012 |
|||
2013 |
408 |
cpk = &(c->pkeys[SSL_PKEY_GOST01]); |
|
2014 |
✗✓✗✗ |
408 |
if (cpk->x509 != NULL && cpk->privatekey !=NULL) { |
2015 |
mask_k |= SSL_kGOST; |
||
2016 |
mask_a |= SSL_aGOST01; |
||
2017 |
} |
||
2018 |
|||
2019 |
✓✗ | 408 |
if (rsa_enc) |
2020 |
408 |
mask_k |= SSL_kRSA; |
|
2021 |
|||
2022 |
✓✓ | 408 |
if (dh_tmp) |
2023 |
366 |
mask_k |= SSL_kDHE; |
|
2024 |
|||
2025 |
✓✗ | 408 |
if (rsa_enc || rsa_sign) |
2026 |
408 |
mask_a |= SSL_aRSA; |
|
2027 |
|||
2028 |
408 |
mask_a |= SSL_aNULL; |
|
2029 |
|||
2030 |
/* |
||
2031 |
* An ECC certificate may be usable for ECDH and/or |
||
2032 |
* ECDSA cipher suites depending on the key usage extension. |
||
2033 |
*/ |
||
2034 |
✗✓ | 408 |
if (have_ecc_cert) { |
2035 |
x = (c->pkeys[SSL_PKEY_ECC]).x509; |
||
2036 |
|||
2037 |
/* This call populates extension flags (ex_flags). */ |
||
2038 |
X509_check_purpose(x, -1, 0); |
||
2039 |
|||
2040 |
/* Key usage, if present, must allow signing. */ |
||
2041 |
if ((x->ex_flags & EXFLAG_KUSAGE) == 0 || |
||
2042 |
(x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE)) |
||
2043 |
mask_a |= SSL_aECDSA; |
||
2044 |
} |
||
2045 |
|||
2046 |
408 |
mask_k |= SSL_kECDHE; |
|
2047 |
|||
2048 |
408 |
c->mask_k = mask_k; |
|
2049 |
408 |
c->mask_a = mask_a; |
|
2050 |
408 |
c->valid = 1; |
|
2051 |
816 |
} |
|
2052 |
|||
2053 |
/* See if this handshake is using an ECC cipher suite. */ |
||
2054 |
int |
||
2055 |
ssl_using_ecc_cipher(SSL *s) |
||
2056 |
{ |
||
2057 |
unsigned long alg_a, alg_k; |
||
2058 |
|||
2059 |
336 |
alg_a = S3I(s)->hs.new_cipher->algorithm_auth; |
|
2060 |
168 |
alg_k = S3I(s)->hs.new_cipher->algorithm_mkey; |
|
2061 |
|||
2062 |
✓✓ | 336 |
return SSI(s)->tlsext_ecpointformatlist != NULL && |
2063 |
✓✗ | 258 |
SSI(s)->tlsext_ecpointformatlist_length > 0 && |
2064 |
✗✓ | 90 |
((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA)); |
2065 |
} |
||
2066 |
|||
2067 |
int |
||
2068 |
ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) |
||
2069 |
{ |
||
2070 |
const SSL_CIPHER *cs = S3I(s)->hs.new_cipher; |
||
2071 |
unsigned long alg_a; |
||
2072 |
|||
2073 |
alg_a = cs->algorithm_auth; |
||
2074 |
|||
2075 |
if (alg_a & SSL_aECDSA) { |
||
2076 |
/* This call populates extension flags (ex_flags). */ |
||
2077 |
X509_check_purpose(x, -1, 0); |
||
2078 |
|||
2079 |
/* Key usage, if present, must allow signing. */ |
||
2080 |
if ((x->ex_flags & EXFLAG_KUSAGE) && |
||
2081 |
((x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE) == 0)) { |
||
2082 |
SSLerror(s, SSL_R_ECC_CERT_NOT_FOR_SIGNING); |
||
2083 |
return (0); |
||
2084 |
} |
||
2085 |
} |
||
2086 |
|||
2087 |
return (1); |
||
2088 |
} |
||
2089 |
|||
2090 |
CERT_PKEY * |
||
2091 |
ssl_get_server_send_pkey(const SSL *s) |
||
2092 |
{ |
||
2093 |
unsigned long alg_a; |
||
2094 |
CERT *c; |
||
2095 |
int i; |
||
2096 |
|||
2097 |
372 |
c = s->cert; |
|
2098 |
186 |
ssl_set_cert_masks(c, S3I(s)->hs.new_cipher); |
|
2099 |
|||
2100 |
186 |
alg_a = S3I(s)->hs.new_cipher->algorithm_auth; |
|
2101 |
|||
2102 |
✗✓ | 186 |
if (alg_a & SSL_aECDSA) { |
2103 |
i = SSL_PKEY_ECC; |
||
2104 |
✓✗ | 186 |
} else if (alg_a & SSL_aRSA) { |
2105 |
✗✓ | 186 |
if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL) |
2106 |
i = SSL_PKEY_RSA_SIGN; |
||
2107 |
else |
||
2108 |
i = SSL_PKEY_RSA_ENC; |
||
2109 |
} else if (alg_a & SSL_aGOST01) { |
||
2110 |
i = SSL_PKEY_GOST01; |
||
2111 |
} else { /* if (alg_a & SSL_aNULL) */ |
||
2112 |
SSLerror(s, ERR_R_INTERNAL_ERROR); |
||
2113 |
return (NULL); |
||
2114 |
} |
||
2115 |
|||
2116 |
186 |
return (c->pkeys + i); |
|
2117 |
186 |
} |
|
2118 |
|||
2119 |
X509 * |
||
2120 |
ssl_get_server_send_cert(const SSL *s) |
||
2121 |
{ |
||
2122 |
CERT_PKEY *cpk; |
||
2123 |
|||
2124 |
336 |
cpk = ssl_get_server_send_pkey(s); |
|
2125 |
✗✓ | 168 |
if (!cpk) |
2126 |
return (NULL); |
||
2127 |
168 |
return (cpk->x509); |
|
2128 |
168 |
} |
|
2129 |
|||
2130 |
EVP_PKEY * |
||
2131 |
ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) |
||
2132 |
{ |
||
2133 |
unsigned long alg_a; |
||
2134 |
CERT *c; |
||
2135 |
int idx = -1; |
||
2136 |
|||
2137 |
246 |
alg_a = cipher->algorithm_auth; |
|
2138 |
123 |
c = s->cert; |
|
2139 |
|||
2140 |
✓✗ | 123 |
if (alg_a & SSL_aRSA) { |
2141 |
✗✓ | 123 |
if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL) |
2142 |
idx = SSL_PKEY_RSA_SIGN; |
||
2143 |
✓✗ | 123 |
else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL) |
2144 |
123 |
idx = SSL_PKEY_RSA_ENC; |
|
2145 |
} else if ((alg_a & SSL_aECDSA) && |
||
2146 |
(c->pkeys[SSL_PKEY_ECC].privatekey != NULL)) |
||
2147 |
idx = SSL_PKEY_ECC; |
||
2148 |
✗✓ | 123 |
if (idx == -1) { |
2149 |
SSLerror(s, ERR_R_INTERNAL_ERROR); |
||
2150 |
return (NULL); |
||
2151 |
} |
||
2152 |
✓✗ | 123 |
if (pmd) |
2153 |
123 |
*pmd = c->pkeys[idx].digest; |
|
2154 |
123 |
return (c->pkeys[idx].privatekey); |
|
2155 |
123 |
} |
|
2156 |
|||
2157 |
DH * |
||
2158 |
ssl_get_auto_dh(SSL *s) |
||
2159 |
{ |
||
2160 |
CERT_PKEY *cpk; |
||
2161 |
int keylen; |
||
2162 |
DH *dhp; |
||
2163 |
|||
2164 |
✗✓ | 12 |
if (s->cert->dh_tmp_auto == 2) { |
2165 |
keylen = 1024; |
||
2166 |
✗✓ | 6 |
} else if (S3I(s)->hs.new_cipher->algorithm_auth & SSL_aNULL) { |
2167 |
keylen = 1024; |
||
2168 |
if (S3I(s)->hs.new_cipher->strength_bits == 256) |
||
2169 |
keylen = 3072; |
||
2170 |
} else { |
||
2171 |
✗✓ | 6 |
if ((cpk = ssl_get_server_send_pkey(s)) == NULL) |
2172 |
return (NULL); |
||
2173 |
✓✗✗✓ |
12 |
if (cpk->privatekey == NULL || cpk->privatekey->pkey.dh == NULL) |
2174 |
return (NULL); |
||
2175 |
6 |
keylen = EVP_PKEY_bits(cpk->privatekey); |
|
2176 |
} |
||
2177 |
|||
2178 |
✗✓ | 6 |
if ((dhp = DH_new()) == NULL) |
2179 |
return (NULL); |
||
2180 |
|||
2181 |
6 |
dhp->g = BN_new(); |
|
2182 |
✓✗ | 6 |
if (dhp->g != NULL) |
2183 |
6 |
BN_set_word(dhp->g, 2); |
|
2184 |
|||
2185 |
✗✓ | 6 |
if (keylen >= 8192) |
2186 |
dhp->p = get_rfc3526_prime_8192(NULL); |
||
2187 |
✗✓ | 6 |
else if (keylen >= 4096) |
2188 |
dhp->p = get_rfc3526_prime_4096(NULL); |
||
2189 |
✗✓ | 6 |
else if (keylen >= 3072) |
2190 |
dhp->p = get_rfc3526_prime_3072(NULL); |
||
2191 |
✓✗ | 6 |
else if (keylen >= 2048) |
2192 |
6 |
dhp->p = get_rfc3526_prime_2048(NULL); |
|
2193 |
else if (keylen >= 1536) |
||
2194 |
dhp->p = get_rfc3526_prime_1536(NULL); |
||
2195 |
else |
||
2196 |
dhp->p = get_rfc2409_prime_1024(NULL); |
||
2197 |
|||
2198 |
✓✗✗✓ |
12 |
if (dhp->p == NULL || dhp->g == NULL) { |
2199 |
DH_free(dhp); |
||
2200 |
return (NULL); |
||
2201 |
} |
||
2202 |
6 |
return (dhp); |
|
2203 |
6 |
} |
|
2204 |
|||
2205 |
void |
||
2206 |
ssl_update_cache(SSL *s, int mode) |
||
2207 |
{ |
||
2208 |
int i; |
||
2209 |
|||
2210 |
/* |
||
2211 |
* If the session_id_length is 0, we are not supposed to cache it, |
||
2212 |
* and it would be rather hard to do anyway :-) |
||
2213 |
*/ |
||
2214 |
✓✓ | 32126 |
if (s->session->session_id_length == 0) |
2215 |
204 |
return; |
|
2216 |
|||
2217 |
15859 |
i = s->session_ctx->internal->session_cache_mode; |
|
2218 |
✗✓✗✗ ✗✗ |
15859 |
if ((i & mode) && (!s->internal->hit) && ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) |
2219 |
|| SSL_CTX_add_session(s->session_ctx, s->session)) |
||
2220 |
&& (s->session_ctx->internal->new_session_cb != NULL)) { |
||
2221 |
CRYPTO_add(&s->session->references, 1, CRYPTO_LOCK_SSL_SESSION); |
||
2222 |
if (!s->session_ctx->internal->new_session_cb(s, s->session)) |
||
2223 |
SSL_SESSION_free(s->session); |
||
2224 |
} |
||
2225 |
|||
2226 |
/* auto flush every 255 connections */ |
||
2227 |
✓✗✗✓ |
31718 |
if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && |
2228 |
15859 |
((i & mode) == mode)) { |
|
2229 |
if ((((mode & SSL_SESS_CACHE_CLIENT) ? |
||
2230 |
s->session_ctx->internal->stats.sess_connect_good : |
||
2231 |
s->session_ctx->internal->stats.sess_accept_good) & 0xff) == 0xff) { |
||
2232 |
SSL_CTX_flush_sessions(s->session_ctx, time(NULL)); |
||
2233 |
} |
||
2234 |
} |
||
2235 |
31922 |
} |
|
2236 |
|||
2237 |
const SSL_METHOD * |
||
2238 |
SSL_get_ssl_method(SSL *s) |
||
2239 |
{ |
||
2240 |
return (s->method); |
||
2241 |
} |
||
2242 |
|||
2243 |
int |
||
2244 |
SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) |
||
2245 |
{ |
||
2246 |
int conn = -1; |
||
2247 |
int ret = 1; |
||
2248 |
|||
2249 |
✓✗ | 54 |
if (s->method != meth) { |
2250 |
✓✗ | 27 |
if (s->internal->handshake_func != NULL) |
2251 |
27 |
conn = (s->internal->handshake_func == s->method->internal->ssl_connect); |
|
2252 |
|||
2253 |
✓✗ | 27 |
if (s->method->internal->version == meth->internal->version) |
2254 |
27 |
s->method = meth; |
|
2255 |
else { |
||
2256 |
s->method->internal->ssl_free(s); |
||
2257 |
s->method = meth; |
||
2258 |
ret = s->method->internal->ssl_new(s); |
||
2259 |
} |
||
2260 |
|||
2261 |
✓✗ | 27 |
if (conn == 1) |
2262 |
27 |
s->internal->handshake_func = meth->internal->ssl_connect; |
|
2263 |
else if (conn == 0) |
||
2264 |
s->internal->handshake_func = meth->internal->ssl_accept; |
||
2265 |
} |
||
2266 |
27 |
return (ret); |
|
2267 |
} |
||
2268 |
|||
2269 |
int |
||
2270 |
SSL_get_error(const SSL *s, int i) |
||
2271 |
{ |
||
2272 |
int reason; |
||
2273 |
unsigned long l; |
||
2274 |
BIO *bio; |
||
2275 |
|||
2276 |
✓✓ | 18916 |
if (i > 0) |
2277 |
720 |
return (SSL_ERROR_NONE); |
|
2278 |
|||
2279 |
/* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake |
||
2280 |
* etc, where we do encode the error */ |
||
2281 |
✗✓ | 8738 |
if ((l = ERR_peek_error()) != 0) { |
2282 |
if (ERR_GET_LIB(l) == ERR_LIB_SYS) |
||
2283 |
return (SSL_ERROR_SYSCALL); |
||
2284 |
else |
||
2285 |
return (SSL_ERROR_SSL); |
||
2286 |
} |
||
2287 |
|||
2288 |
✓✓✓✓ |
17474 |
if ((i < 0) && SSL_want_read(s)) { |
2289 |
7050 |
bio = SSL_get_rbio(s); |
|
2290 |
✓✗ | 7050 |
if (BIO_should_read(bio)) { |
2291 |
7050 |
return (SSL_ERROR_WANT_READ); |
|
2292 |
} else if (BIO_should_write(bio)) { |
||
2293 |
/* |
||
2294 |
* This one doesn't make too much sense... We never |
||
2295 |
* try to write to the rbio, and an application |
||
2296 |
* program where rbio and wbio are separate couldn't |
||
2297 |
* even know what it should wait for. However if we |
||
2298 |
* ever set s->internal->rwstate incorrectly (so that we have |
||
2299 |
* SSL_want_read(s) instead of SSL_want_write(s)) |
||
2300 |
* and rbio and wbio *are* the same, this test works |
||
2301 |
* around that bug; so it might be safer to keep it. |
||
2302 |
*/ |
||
2303 |
return (SSL_ERROR_WANT_WRITE); |
||
2304 |
} else if (BIO_should_io_special(bio)) { |
||
2305 |
reason = BIO_get_retry_reason(bio); |
||
2306 |
if (reason == BIO_RR_CONNECT) |
||
2307 |
return (SSL_ERROR_WANT_CONNECT); |
||
2308 |
else if (reason == BIO_RR_ACCEPT) |
||
2309 |
return (SSL_ERROR_WANT_ACCEPT); |
||
2310 |
else |
||
2311 |
return (SSL_ERROR_SYSCALL); /* unknown */ |
||
2312 |
} |
||
2313 |
} |
||
2314 |
|||
2315 |
✓✓✓✗ |
3374 |
if ((i < 0) && SSL_want_write(s)) { |
2316 |
1686 |
bio = SSL_get_wbio(s); |
|
2317 |
✓✗ | 1686 |
if (BIO_should_write(bio)) { |
2318 |
1686 |
return (SSL_ERROR_WANT_WRITE); |
|
2319 |
} else if (BIO_should_read(bio)) { |
||
2320 |
/* |
||
2321 |
* See above (SSL_want_read(s) with |
||
2322 |
* BIO_should_write(bio)) |
||
2323 |
*/ |
||
2324 |
return (SSL_ERROR_WANT_READ); |
||
2325 |
} else if (BIO_should_io_special(bio)) { |
||
2326 |
reason = BIO_get_retry_reason(bio); |
||
2327 |
if (reason == BIO_RR_CONNECT) |
||
2328 |
return (SSL_ERROR_WANT_CONNECT); |
||
2329 |
else if (reason == BIO_RR_ACCEPT) |
||
2330 |
return (SSL_ERROR_WANT_ACCEPT); |
||
2331 |
else |
||
2332 |
return (SSL_ERROR_SYSCALL); |
||
2333 |
} |
||
2334 |
} |
||
2335 |
✗✓✗✗ |
2 |
if ((i < 0) && SSL_want_x509_lookup(s)) { |
2336 |
return (SSL_ERROR_WANT_X509_LOOKUP); |
||
2337 |
} |
||
2338 |
|||
2339 |
✓✗ | 2 |
if (i == 0) { |
2340 |
✗✓✗✗ |
2 |
if ((s->internal->shutdown & SSL_RECEIVED_SHUTDOWN) && |
2341 |
(S3I(s)->warn_alert == SSL_AD_CLOSE_NOTIFY)) |
||
2342 |
return (SSL_ERROR_ZERO_RETURN); |
||
2343 |
} |
||
2344 |
2 |
return (SSL_ERROR_SYSCALL); |
|
2345 |
9458 |
} |
|
2346 |
|||
2347 |
int |
||
2348 |
SSL_do_handshake(SSL *s) |
||
2349 |
{ |
||
2350 |
int ret = 1; |
||
2351 |
|||
2352 |
if (s->internal->handshake_func == NULL) { |
||
2353 |
SSLerror(s, SSL_R_CONNECTION_TYPE_NOT_SET); |
||
2354 |
return (-1); |
||
2355 |
} |
||
2356 |
|||
2357 |
s->method->internal->ssl_renegotiate_check(s); |
||
2358 |
|||
2359 |
if (SSL_in_init(s) || SSL_in_before(s)) { |
||
2360 |
ret = s->internal->handshake_func(s); |
||
2361 |
} |
||
2362 |
return (ret); |
||
2363 |
} |
||
2364 |
|||
2365 |
/* |
||
2366 |
* For the next 2 functions, SSL_clear() sets shutdown and so |
||
2367 |
* one of these calls will reset it |
||
2368 |
*/ |
||
2369 |
void |
||
2370 |
SSL_set_accept_state(SSL *s) |
||
2371 |
{ |
||
2372 |
396 |
s->server = 1; |
|
2373 |
198 |
s->internal->shutdown = 0; |
|
2374 |
198 |
S3I(s)->hs.state = SSL_ST_ACCEPT|SSL_ST_BEFORE; |
|
2375 |
198 |
s->internal->handshake_func = s->method->internal->ssl_accept; |
|
2376 |
/* clear the current cipher */ |
||
2377 |
198 |
ssl_clear_cipher_ctx(s); |
|
2378 |
198 |
ssl_clear_hash_ctx(&s->read_hash); |
|
2379 |
198 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
2380 |
198 |
} |
|
2381 |
|||
2382 |
void |
||
2383 |
SSL_set_connect_state(SSL *s) |
||
2384 |
{ |
||
2385 |
31808 |
s->server = 0; |
|
2386 |
15904 |
s->internal->shutdown = 0; |
|
2387 |
15904 |
S3I(s)->hs.state = SSL_ST_CONNECT|SSL_ST_BEFORE; |
|
2388 |
15904 |
s->internal->handshake_func = s->method->internal->ssl_connect; |
|
2389 |
/* clear the current cipher */ |
||
2390 |
15904 |
ssl_clear_cipher_ctx(s); |
|
2391 |
15904 |
ssl_clear_hash_ctx(&s->read_hash); |
|
2392 |
15904 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
2393 |
15904 |
} |
|
2394 |
|||
2395 |
int |
||
2396 |
ssl_undefined_function(SSL *s) |
||
2397 |
{ |
||
2398 |
SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
||
2399 |
return (0); |
||
2400 |
} |
||
2401 |
|||
2402 |
int |
||
2403 |
ssl_undefined_void_function(void) |
||
2404 |
{ |
||
2405 |
SSLerrorx(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
||
2406 |
return (0); |
||
2407 |
} |
||
2408 |
|||
2409 |
int |
||
2410 |
ssl_undefined_const_function(const SSL *s) |
||
2411 |
{ |
||
2412 |
SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
||
2413 |
return (0); |
||
2414 |
} |
||
2415 |
|||
2416 |
const char * |
||
2417 |
ssl_version_string(int ver) |
||
2418 |
{ |
||
2419 |
✓✓✗✓ ✗ |
420 |
switch (ver) { |
2420 |
case DTLS1_VERSION: |
||
2421 |
36 |
return (SSL_TXT_DTLS1); |
|
2422 |
case TLS1_VERSION: |
||
2423 |
54 |
return (SSL_TXT_TLSV1); |
|
2424 |
case TLS1_1_VERSION: |
||
2425 |
return (SSL_TXT_TLSV1_1); |
||
2426 |
case TLS1_2_VERSION: |
||
2427 |
120 |
return (SSL_TXT_TLSV1_2); |
|
2428 |
default: |
||
2429 |
return ("unknown"); |
||
2430 |
} |
||
2431 |
210 |
} |
|
2432 |
|||
2433 |
const char * |
||
2434 |
SSL_get_version(const SSL *s) |
||
2435 |
{ |
||
2436 |
408 |
return ssl_version_string(s->version); |
|
2437 |
} |
||
2438 |
|||
2439 |
SSL * |
||
2440 |
SSL_dup(SSL *s) |
||
2441 |
{ |
||
2442 |
STACK_OF(X509_NAME) *sk; |
||
2443 |
X509_NAME *xn; |
||
2444 |
SSL *ret; |
||
2445 |
int i; |
||
2446 |
|||
2447 |
if ((ret = SSL_new(SSL_get_SSL_CTX(s))) == NULL) |
||
2448 |
return (NULL); |
||
2449 |
|||
2450 |
ret->version = s->version; |
||
2451 |
ret->internal->type = s->internal->type; |
||
2452 |
ret->method = s->method; |
||
2453 |
|||
2454 |
if (s->session != NULL) { |
||
2455 |
/* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */ |
||
2456 |
SSL_copy_session_id(ret, s); |
||
2457 |
} else { |
||
2458 |
/* |
||
2459 |
* No session has been established yet, so we have to expect |
||
2460 |
* that s->cert or ret->cert will be changed later -- |
||
2461 |
* they should not both point to the same object, |
||
2462 |
* and thus we can't use SSL_copy_session_id. |
||
2463 |
*/ |
||
2464 |
|||
2465 |
ret->method->internal->ssl_free(ret); |
||
2466 |
ret->method = s->method; |
||
2467 |
ret->method->internal->ssl_new(ret); |
||
2468 |
|||
2469 |
if (s->cert != NULL) { |
||
2470 |
ssl_cert_free(ret->cert); |
||
2471 |
ret->cert = ssl_cert_dup(s->cert); |
||
2472 |
if (ret->cert == NULL) |
||
2473 |
goto err; |
||
2474 |
} |
||
2475 |
|||
2476 |
SSL_set_session_id_context(ret, |
||
2477 |
s->sid_ctx, s->sid_ctx_length); |
||
2478 |
} |
||
2479 |
|||
2480 |
ret->internal->options = s->internal->options; |
||
2481 |
ret->internal->mode = s->internal->mode; |
||
2482 |
SSL_set_max_cert_list(ret, SSL_get_max_cert_list(s)); |
||
2483 |
SSL_set_read_ahead(ret, SSL_get_read_ahead(s)); |
||
2484 |
ret->internal->msg_callback = s->internal->msg_callback; |
||
2485 |
ret->internal->msg_callback_arg = s->internal->msg_callback_arg; |
||
2486 |
SSL_set_verify(ret, SSL_get_verify_mode(s), |
||
2487 |
SSL_get_verify_callback(s)); |
||
2488 |
SSL_set_verify_depth(ret, SSL_get_verify_depth(s)); |
||
2489 |
ret->internal->generate_session_id = s->internal->generate_session_id; |
||
2490 |
|||
2491 |
SSL_set_info_callback(ret, SSL_get_info_callback(s)); |
||
2492 |
|||
2493 |
ret->internal->debug = s->internal->debug; |
||
2494 |
|||
2495 |
/* copy app data, a little dangerous perhaps */ |
||
2496 |
if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, |
||
2497 |
&ret->internal->ex_data, &s->internal->ex_data)) |
||
2498 |
goto err; |
||
2499 |
|||
2500 |
/* setup rbio, and wbio */ |
||
2501 |
if (s->rbio != NULL) { |
||
2502 |
if (!BIO_dup_state(s->rbio,(char *)&ret->rbio)) |
||
2503 |
goto err; |
||
2504 |
} |
||
2505 |
if (s->wbio != NULL) { |
||
2506 |
if (s->wbio != s->rbio) { |
||
2507 |
if (!BIO_dup_state(s->wbio,(char *)&ret->wbio)) |
||
2508 |
goto err; |
||
2509 |
} else |
||
2510 |
ret->wbio = ret->rbio; |
||
2511 |
} |
||
2512 |
ret->internal->rwstate = s->internal->rwstate; |
||
2513 |
ret->internal->in_handshake = s->internal->in_handshake; |
||
2514 |
ret->internal->handshake_func = s->internal->handshake_func; |
||
2515 |
ret->server = s->server; |
||
2516 |
ret->internal->renegotiate = s->internal->renegotiate; |
||
2517 |
ret->internal->new_session = s->internal->new_session; |
||
2518 |
ret->internal->quiet_shutdown = s->internal->quiet_shutdown; |
||
2519 |
ret->internal->shutdown = s->internal->shutdown; |
||
2520 |
/* SSL_dup does not really work at any state, though */ |
||
2521 |
S3I(ret)->hs.state = S3I(s)->hs.state; |
||
2522 |
ret->internal->rstate = s->internal->rstate; |
||
2523 |
|||
2524 |
/* |
||
2525 |
* Would have to copy ret->init_buf, ret->init_msg, ret->init_num, |
||
2526 |
* ret->init_off |
||
2527 |
*/ |
||
2528 |
ret->internal->init_num = 0; |
||
2529 |
|||
2530 |
ret->internal->hit = s->internal->hit; |
||
2531 |
|||
2532 |
X509_VERIFY_PARAM_inherit(ret->param, s->param); |
||
2533 |
|||
2534 |
/* dup the cipher_list and cipher_list_by_id stacks */ |
||
2535 |
if (s->cipher_list != NULL) { |
||
2536 |
if ((ret->cipher_list = |
||
2537 |
sk_SSL_CIPHER_dup(s->cipher_list)) == NULL) |
||
2538 |
goto err; |
||
2539 |
} |
||
2540 |
if (s->internal->cipher_list_by_id != NULL) { |
||
2541 |
if ((ret->internal->cipher_list_by_id = |
||
2542 |
sk_SSL_CIPHER_dup(s->internal->cipher_list_by_id)) == NULL) |
||
2543 |
goto err; |
||
2544 |
} |
||
2545 |
|||
2546 |
/* Dup the client_CA list */ |
||
2547 |
if (s->internal->client_CA != NULL) { |
||
2548 |
if ((sk = sk_X509_NAME_dup(s->internal->client_CA)) == NULL) goto err; |
||
2549 |
ret->internal->client_CA = sk; |
||
2550 |
for (i = 0; i < sk_X509_NAME_num(sk); i++) { |
||
2551 |
xn = sk_X509_NAME_value(sk, i); |
||
2552 |
if (sk_X509_NAME_set(sk, i, |
||
2553 |
X509_NAME_dup(xn)) == NULL) { |
||
2554 |
X509_NAME_free(xn); |
||
2555 |
goto err; |
||
2556 |
} |
||
2557 |
} |
||
2558 |
} |
||
2559 |
|||
2560 |
if (0) { |
||
2561 |
err: |
||
2562 |
if (ret != NULL) |
||
2563 |
SSL_free(ret); |
||
2564 |
ret = NULL; |
||
2565 |
} |
||
2566 |
return (ret); |
||
2567 |
} |
||
2568 |
|||
2569 |
void |
||
2570 |
ssl_clear_cipher_ctx(SSL *s) |
||
2571 |
{ |
||
2572 |
71230 |
EVP_CIPHER_CTX_free(s->enc_read_ctx); |
|
2573 |
35615 |
s->enc_read_ctx = NULL; |
|
2574 |
35615 |
EVP_CIPHER_CTX_free(s->internal->enc_write_ctx); |
|
2575 |
35615 |
s->internal->enc_write_ctx = NULL; |
|
2576 |
|||
2577 |
✓✓ | 35615 |
if (s->internal->aead_read_ctx != NULL) { |
2578 |
15817 |
EVP_AEAD_CTX_cleanup(&s->internal->aead_read_ctx->ctx); |
|
2579 |
15817 |
free(s->internal->aead_read_ctx); |
|
2580 |
15817 |
s->internal->aead_read_ctx = NULL; |
|
2581 |
15817 |
} |
|
2582 |
✓✓ | 35615 |
if (s->internal->aead_write_ctx != NULL) { |
2583 |
15817 |
EVP_AEAD_CTX_cleanup(&s->internal->aead_write_ctx->ctx); |
|
2584 |
15817 |
free(s->internal->aead_write_ctx); |
|
2585 |
15817 |
s->internal->aead_write_ctx = NULL; |
|
2586 |
15817 |
} |
|
2587 |
|||
2588 |
35615 |
} |
|
2589 |
|||
2590 |
/* Fix this function so that it takes an optional type parameter */ |
||
2591 |
X509 * |
||
2592 |
SSL_get_certificate(const SSL *s) |
||
2593 |
{ |
||
2594 |
if (s->cert != NULL) |
||
2595 |
return (s->cert->key->x509); |
||
2596 |
else |
||
2597 |
return (NULL); |
||
2598 |
} |
||
2599 |
|||
2600 |
/* Fix this function so that it takes an optional type parameter */ |
||
2601 |
EVP_PKEY * |
||
2602 |
SSL_get_privatekey(SSL *s) |
||
2603 |
{ |
||
2604 |
if (s->cert != NULL) |
||
2605 |
return (s->cert->key->privatekey); |
||
2606 |
else |
||
2607 |
return (NULL); |
||
2608 |
} |
||
2609 |
|||
2610 |
const SSL_CIPHER * |
||
2611 |
SSL_get_current_cipher(const SSL *s) |
||
2612 |
{ |
||
2613 |
✓✗✓✗ |
624 |
if ((s->session != NULL) && (s->session->cipher != NULL)) |
2614 |
208 |
return (s->session->cipher); |
|
2615 |
return (NULL); |
||
2616 |
208 |
} |
|
2617 |
const void * |
||
2618 |
SSL_get_current_compression(SSL *s) |
||
2619 |
{ |
||
2620 |
return (NULL); |
||
2621 |
} |
||
2622 |
|||
2623 |
const void * |
||
2624 |
SSL_get_current_expansion(SSL *s) |
||
2625 |
{ |
||
2626 |
return (NULL); |
||
2627 |
} |
||
2628 |
|||
2629 |
int |
||
2630 |
ssl_init_wbio_buffer(SSL *s, int push) |
||
2631 |
{ |
||
2632 |
BIO *bbio; |
||
2633 |
|||
2634 |
✓✗ | 32204 |
if (s->bbio == NULL) { |
2635 |
16102 |
bbio = BIO_new(BIO_f_buffer()); |
|
2636 |
✗✓ | 16102 |
if (bbio == NULL) |
2637 |
return (0); |
||
2638 |
16102 |
s->bbio = bbio; |
|
2639 |
16102 |
} else { |
|
2640 |
bbio = s->bbio; |
||
2641 |
if (s->bbio == s->wbio) |
||
2642 |
s->wbio = BIO_pop(s->wbio); |
||
2643 |
} |
||
2644 |
16102 |
(void)BIO_reset(bbio); |
|
2645 |
/* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ |
||
2646 |
✗✓ | 16102 |
if (!BIO_set_read_buffer_size(bbio, 1)) { |
2647 |
SSLerror(s, ERR_R_BUF_LIB); |
||
2648 |
return (0); |
||
2649 |
} |
||
2650 |
✓✓ | 16102 |
if (push) { |
2651 |
✓✗ | 198 |
if (s->wbio != bbio) |
2652 |
198 |
s->wbio = BIO_push(bbio, s->wbio); |
|
2653 |
} else { |
||
2654 |
✗✓ | 15904 |
if (s->wbio == bbio) |
2655 |
s->wbio = BIO_pop(bbio); |
||
2656 |
} |
||
2657 |
16102 |
return (1); |
|
2658 |
16102 |
} |
|
2659 |
|||
2660 |
void |
||
2661 |
ssl_free_wbio_buffer(SSL *s) |
||
2662 |
{ |
||
2663 |
✓✗ | 74626 |
if (s == NULL) |
2664 |
return; |
||
2665 |
|||
2666 |
✓✓ | 37313 |
if (s->bbio == NULL) |
2667 |
return; |
||
2668 |
|||
2669 |
✓✗ | 16063 |
if (s->bbio == s->wbio) { |
2670 |
/* remove buffering */ |
||
2671 |
16063 |
s->wbio = BIO_pop(s->wbio); |
|
2672 |
16063 |
} |
|
2673 |
16063 |
BIO_free(s->bbio); |
|
2674 |
16063 |
s->bbio = NULL; |
|
2675 |
53376 |
} |
|
2676 |
|||
2677 |
void |
||
2678 |
SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode) |
||
2679 |
{ |
||
2680 |
4 |
ctx->internal->quiet_shutdown = mode; |
|
2681 |
2 |
} |
|
2682 |
|||
2683 |
int |
||
2684 |
SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx) |
||
2685 |
{ |
||
2686 |
return (ctx->internal->quiet_shutdown); |
||
2687 |
} |
||
2688 |
|||
2689 |
void |
||
2690 |
SSL_set_quiet_shutdown(SSL *s, int mode) |
||
2691 |
{ |
||
2692 |
s->internal->quiet_shutdown = mode; |
||
2693 |
} |
||
2694 |
|||
2695 |
int |
||
2696 |
SSL_get_quiet_shutdown(const SSL *s) |
||
2697 |
{ |
||
2698 |
return (s->internal->quiet_shutdown); |
||
2699 |
} |
||
2700 |
|||
2701 |
void |
||
2702 |
SSL_set_shutdown(SSL *s, int mode) |
||
2703 |
{ |
||
2704 |
s->internal->shutdown = mode; |
||
2705 |
} |
||
2706 |
|||
2707 |
int |
||
2708 |
SSL_get_shutdown(const SSL *s) |
||
2709 |
{ |
||
2710 |
return (s->internal->shutdown); |
||
2711 |
} |
||
2712 |
|||
2713 |
int |
||
2714 |
SSL_version(const SSL *s) |
||
2715 |
{ |
||
2716 |
2228 |
return (s->version); |
|
2717 |
} |
||
2718 |
|||
2719 |
SSL_CTX * |
||
2720 |
SSL_get_SSL_CTX(const SSL *ssl) |
||
2721 |
{ |
||
2722 |
return (ssl->ctx); |
||
2723 |
} |
||
2724 |
|||
2725 |
SSL_CTX * |
||
2726 |
SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx) |
||
2727 |
{ |
||
2728 |
CERT *ocert = ssl->cert; |
||
2729 |
|||
2730 |
if (ssl->ctx == ctx) |
||
2731 |
return (ssl->ctx); |
||
2732 |
if (ctx == NULL) |
||
2733 |
ctx = ssl->initial_ctx; |
||
2734 |
ssl->cert = ssl_cert_dup(ctx->internal->cert); |
||
2735 |
if (ocert != NULL) { |
||
2736 |
int i; |
||
2737 |
/* Copy negotiated digests from original certificate. */ |
||
2738 |
for (i = 0; i < SSL_PKEY_NUM; i++) |
||
2739 |
ssl->cert->pkeys[i].digest = ocert->pkeys[i].digest; |
||
2740 |
ssl_cert_free(ocert); |
||
2741 |
} |
||
2742 |
CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
||
2743 |
SSL_CTX_free(ssl->ctx); /* decrement reference count */ |
||
2744 |
ssl->ctx = ctx; |
||
2745 |
return (ssl->ctx); |
||
2746 |
} |
||
2747 |
|||
2748 |
int |
||
2749 |
SSL_CTX_set_default_verify_paths(SSL_CTX *ctx) |
||
2750 |
{ |
||
2751 |
128 |
return (X509_STORE_set_default_paths(ctx->cert_store)); |
|
2752 |
} |
||
2753 |
|||
2754 |
int |
||
2755 |
SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, |
||
2756 |
const char *CApath) |
||
2757 |
{ |
||
2758 |
578 |
return (X509_STORE_load_locations(ctx->cert_store, CAfile, CApath)); |
|
2759 |
} |
||
2760 |
|||
2761 |
int |
||
2762 |
SSL_CTX_load_verify_mem(SSL_CTX *ctx, void *buf, int len) |
||
2763 |
{ |
||
2764 |
24 |
return (X509_STORE_load_mem(ctx->cert_store, buf, len)); |
|
2765 |
} |
||
2766 |
|||
2767 |
void |
||
2768 |
SSL_set_info_callback(SSL *ssl, void (*cb)(const SSL *ssl, int type, int val)) |
||
2769 |
{ |
||
2770 |
ssl->internal->info_callback = cb; |
||
2771 |
} |
||
2772 |
|||
2773 |
void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl, int type, int val) |
||
2774 |
{ |
||
2775 |
return (ssl->internal->info_callback); |
||
2776 |
} |
||
2777 |
|||
2778 |
int |
||
2779 |
SSL_state(const SSL *ssl) |
||
2780 |
{ |
||
2781 |
422508 |
return (S3I(ssl)->hs.state); |
|
2782 |
} |
||
2783 |
|||
2784 |
void |
||
2785 |
SSL_set_state(SSL *ssl, int state) |
||
2786 |
{ |
||
2787 |
S3I(ssl)->hs.state = state; |
||
2788 |
} |
||
2789 |
|||
2790 |
void |
||
2791 |
SSL_set_verify_result(SSL *ssl, long arg) |
||
2792 |
{ |
||
2793 |
ssl->verify_result = arg; |
||
2794 |
} |
||
2795 |
|||
2796 |
long |
||
2797 |
SSL_get_verify_result(const SSL *ssl) |
||
2798 |
{ |
||
2799 |
return (ssl->verify_result); |
||
2800 |
} |
||
2801 |
|||
2802 |
int |
||
2803 |
SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
||
2804 |
CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
||
2805 |
{ |
||
2806 |
return (CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp, |
||
2807 |
new_func, dup_func, free_func)); |
||
2808 |
} |
||
2809 |
|||
2810 |
int |
||
2811 |
SSL_set_ex_data(SSL *s, int idx, void *arg) |
||
2812 |
{ |
||
2813 |
48 |
return (CRYPTO_set_ex_data(&s->internal->ex_data, idx, arg)); |
|
2814 |
} |
||
2815 |
|||
2816 |
void * |
||
2817 |
SSL_get_ex_data(const SSL *s, int idx) |
||
2818 |
{ |
||
2819 |
72 |
return (CRYPTO_get_ex_data(&s->internal->ex_data, idx)); |
|
2820 |
} |
||
2821 |
|||
2822 |
int |
||
2823 |
SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
||
2824 |
CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
||
2825 |
{ |
||
2826 |
return (CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp, |
||
2827 |
new_func, dup_func, free_func)); |
||
2828 |
} |
||
2829 |
|||
2830 |
int |
||
2831 |
SSL_CTX_set_ex_data(SSL_CTX *s, int idx, void *arg) |
||
2832 |
{ |
||
2833 |
return (CRYPTO_set_ex_data(&s->internal->ex_data, idx, arg)); |
||
2834 |
} |
||
2835 |
|||
2836 |
void * |
||
2837 |
SSL_CTX_get_ex_data(const SSL_CTX *s, int idx) |
||
2838 |
{ |
||
2839 |
return (CRYPTO_get_ex_data(&s->internal->ex_data, idx)); |
||
2840 |
} |
||
2841 |
|||
2842 |
int |
||
2843 |
ssl_ok(SSL *s) |
||
2844 |
{ |
||
2845 |
return (1); |
||
2846 |
} |
||
2847 |
|||
2848 |
X509_STORE * |
||
2849 |
SSL_CTX_get_cert_store(const SSL_CTX *ctx) |
||
2850 |
{ |
||
2851 |
204 |
return (ctx->cert_store); |
|
2852 |
} |
||
2853 |
|||
2854 |
void |
||
2855 |
SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store) |
||
2856 |
{ |
||
2857 |
X509_STORE_free(ctx->cert_store); |
||
2858 |
ctx->cert_store = store; |
||
2859 |
} |
||
2860 |
|||
2861 |
int |
||
2862 |
SSL_want(const SSL *s) |
||
2863 |
{ |
||
2864 |
20844 |
return (s->internal->rwstate); |
|
2865 |
} |
||
2866 |
|||
2867 |
void |
||
2868 |
SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, RSA *(*cb)(SSL *ssl, int is_export, |
||
2869 |
int keylength)) |
||
2870 |
{ |
||
2871 |
306 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb); |
|
2872 |
153 |
} |
|
2873 |
|||
2874 |
void |
||
2875 |
SSL_set_tmp_rsa_callback(SSL *ssl, RSA *(*cb)(SSL *ssl, int is_export, |
||
2876 |
int keylength)) |
||
2877 |
{ |
||
2878 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb); |
||
2879 |
} |
||
2880 |
|||
2881 |
void |
||
2882 |
SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, DH *(*dh)(SSL *ssl, int is_export, |
||
2883 |
int keylength)) |
||
2884 |
{ |
||
2885 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh); |
||
2886 |
} |
||
2887 |
|||
2888 |
void |
||
2889 |
SSL_set_tmp_dh_callback(SSL *ssl, DH *(*dh)(SSL *ssl, int is_export, |
||
2890 |
int keylength)) |
||
2891 |
{ |
||
2892 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh); |
||
2893 |
} |
||
2894 |
|||
2895 |
void |
||
2896 |
SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, EC_KEY *(*ecdh)(SSL *ssl, |
||
2897 |
int is_export, int keylength)) |
||
2898 |
{ |
||
2899 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH_CB, |
||
2900 |
(void (*)(void))ecdh); |
||
2901 |
} |
||
2902 |
|||
2903 |
void |
||
2904 |
SSL_set_tmp_ecdh_callback(SSL *ssl, EC_KEY *(*ecdh)(SSL *ssl, int is_export, |
||
2905 |
int keylength)) |
||
2906 |
{ |
||
2907 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh); |
||
2908 |
} |
||
2909 |
|||
2910 |
|||
2911 |
void |
||
2912 |
SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, |
||
2913 |
int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) |
||
2914 |
{ |
||
2915 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, |
||
2916 |
(void (*)(void))cb); |
||
2917 |
} |
||
2918 |
|||
2919 |
void |
||
2920 |
SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, |
||
2921 |
int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) |
||
2922 |
{ |
||
2923 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); |
||
2924 |
} |
||
2925 |
|||
2926 |
void |
||
2927 |
ssl_clear_hash_ctx(EVP_MD_CTX **hash) |
||
2928 |
{ |
||
2929 |
✓✓ | 142460 |
if (*hash) |
2930 |
492 |
EVP_MD_CTX_destroy(*hash); |
|
2931 |
71230 |
*hash = NULL; |
|
2932 |
71230 |
} |
|
2933 |
|||
2934 |
void |
||
2935 |
SSL_set_debug(SSL *s, int debug) |
||
2936 |
{ |
||
2937 |
4 |
s->internal->debug = debug; |
|
2938 |
2 |
} |
|
2939 |
|||
2940 |
int |
||
2941 |
SSL_cache_hit(SSL *s) |
||
2942 |
{ |
||
2943 |
8 |
return (s->internal->hit); |
|
2944 |
} |
||
2945 |
|||
2946 |
int |
||
2947 |
SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) |
||
2948 |
{ |
||
2949 |
180 |
return ssl_version_set_min(ctx->method, version, |
|
2950 |
60 |
ctx->internal->max_version, &ctx->internal->min_version); |
|
2951 |
} |
||
2952 |
|||
2953 |
int |
||
2954 |
SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) |
||
2955 |
{ |
||
2956 |
162 |
return ssl_version_set_max(ctx->method, version, |
|
2957 |
54 |
ctx->internal->min_version, &ctx->internal->max_version); |
|
2958 |
} |
||
2959 |
|||
2960 |
int |
||
2961 |
SSL_set_min_proto_version(SSL *ssl, uint16_t version) |
||
2962 |
{ |
||
2963 |
135 |
return ssl_version_set_min(ssl->method, version, |
|
2964 |
45 |
ssl->internal->max_version, &ssl->internal->min_version); |
|
2965 |
} |
||
2966 |
|||
2967 |
int |
||
2968 |
SSL_set_max_proto_version(SSL *ssl, uint16_t version) |
||
2969 |
{ |
||
2970 |
135 |
return ssl_version_set_max(ssl->method, version, |
|
2971 |
45 |
ssl->internal->min_version, &ssl->internal->max_version); |
|
2972 |
} |
||
2973 |
|||
2974 |
static int |
||
2975 |
ssl_cipher_id_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) |
||
2976 |
{ |
||
2977 |
216046 |
SSL_CIPHER const *a = a_; |
|
2978 |
108023 |
SSL_CIPHER const *b = b_; |
|
2979 |
108023 |
return ssl_cipher_id_cmp(a, b); |
|
2980 |
} |
||
2981 |
|||
2982 |
SSL_CIPHER * |
||
2983 |
OBJ_bsearch_ssl_cipher_id(SSL_CIPHER *key, SSL_CIPHER const *base, int num) |
||
2984 |
{ |
||
2985 |
42578 |
return (SSL_CIPHER *)OBJ_bsearch_(key, base, num, sizeof(SSL_CIPHER), |
|
2986 |
ssl_cipher_id_cmp_BSEARCH_CMP_FN); |
||
2987 |
} |
Generated by: GCOVR (Version 3.3) |