GCC Code Coverage Report | |||||||||||||||||||||
|
|||||||||||||||||||||
Line | Branch | Exec | Source |
1 |
/* $OpenBSD: ssl_lib.c,v 1.170 2017/08/30 16:24:21 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 |
✗✓ | 20090 |
if (s->method == NULL) { |
166 |
SSLerror(s, SSL_R_NO_METHOD_SPECIFIED); |
||
167 |
return (0); |
||
168 |
} |
||
169 |
|||
170 |
✗✓ | 10045 |
if (ssl_clear_bad_session(s)) { |
171 |
SSL_SESSION_free(s->session); |
||
172 |
s->session = NULL; |
||
173 |
} |
||
174 |
|||
175 |
10045 |
s->error = 0; |
|
176 |
10045 |
s->internal->hit = 0; |
|
177 |
10045 |
s->internal->shutdown = 0; |
|
178 |
|||
179 |
✗✓ | 10045 |
if (s->internal->renegotiate) { |
180 |
SSLerror(s, ERR_R_INTERNAL_ERROR); |
||
181 |
return (0); |
||
182 |
} |
||
183 |
|||
184 |
10045 |
s->internal->type = 0; |
|
185 |
|||
186 |
10045 |
s->version = s->method->internal->version; |
|
187 |
10045 |
s->client_version = s->version; |
|
188 |
10045 |
s->internal->rwstate = SSL_NOTHING; |
|
189 |
10045 |
s->internal->rstate = SSL_ST_READ_HEADER; |
|
190 |
|||
191 |
10045 |
BUF_MEM_free(s->internal->init_buf); |
|
192 |
10045 |
s->internal->init_buf = NULL; |
|
193 |
|||
194 |
10045 |
ssl_clear_cipher_ctx(s); |
|
195 |
10045 |
ssl_clear_hash_ctx(&s->read_hash); |
|
196 |
10045 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
197 |
|||
198 |
10045 |
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 |
✓✓✓✗ ✗✓ |
13165 |
if (!s->internal->in_handshake && (s->session == NULL) && |
205 |
1560 |
(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 |
10045 |
s->method->internal->ssl_clear(s); |
|
212 |
|||
213 |
10045 |
S3I(s)->hs.state = SSL_ST_BEFORE|((s->server) ? SSL_ST_ACCEPT : SSL_ST_CONNECT); |
|
214 |
|||
215 |
10045 |
return (1); |
|
216 |
10045 |
} |
|
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 |
✗✓ | 3120 |
if (ctx == NULL) { |
241 |
SSLerrorx(SSL_R_NULL_SSL_CTX); |
||
242 |
return (NULL); |
||
243 |
} |
||
244 |
✗✓ | 1560 |
if (ctx->method == NULL) { |
245 |
SSLerrorx(SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION); |
||
246 |
return (NULL); |
||
247 |
} |
||
248 |
|||
249 |
✗✓ | 1560 |
if ((s = calloc(1, sizeof(*s))) == NULL) { |
250 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
251 |
return (NULL); |
||
252 |
} |
||
253 |
✗✓ | 1560 |
if ((s->internal = calloc(1, sizeof(*s->internal))) == NULL) { |
254 |
free(s); |
||
255 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
256 |
return (NULL); |
||
257 |
} |
||
258 |
|||
259 |
1560 |
s->internal->min_version = ctx->internal->min_version; |
|
260 |
1560 |
s->internal->max_version = ctx->internal->max_version; |
|
261 |
|||
262 |
1560 |
s->internal->options = ctx->internal->options; |
|
263 |
1560 |
s->internal->mode = ctx->internal->mode; |
|
264 |
1560 |
s->internal->max_cert_list = ctx->internal->max_cert_list; |
|
265 |
|||
266 |
✓✗ | 1560 |
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 |
1560 |
s->cert = ssl_cert_dup(ctx->internal->cert); |
|
279 |
✓✗ | 1560 |
if (s->cert == NULL) |
280 |
goto err; |
||
281 |
} else |
||
282 |
s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */ |
||
283 |
|||
284 |
1560 |
s->internal->read_ahead = ctx->internal->read_ahead; |
|
285 |
1560 |
s->internal->msg_callback = ctx->internal->msg_callback; |
|
286 |
1560 |
s->internal->msg_callback_arg = ctx->internal->msg_callback_arg; |
|
287 |
1560 |
s->verify_mode = ctx->verify_mode; |
|
288 |
1560 |
s->sid_ctx_length = ctx->sid_ctx_length; |
|
289 |
✗✓ | 1560 |
OPENSSL_assert(s->sid_ctx_length <= sizeof s->sid_ctx); |
290 |
1560 |
memcpy(&s->sid_ctx, &ctx->sid_ctx, sizeof(s->sid_ctx)); |
|
291 |
1560 |
s->internal->verify_callback = ctx->internal->default_verify_callback; |
|
292 |
1560 |
s->internal->generate_session_id = ctx->internal->generate_session_id; |
|
293 |
|||
294 |
1560 |
s->param = X509_VERIFY_PARAM_new(); |
|
295 |
✓✗ | 1560 |
if (!s->param) |
296 |
goto err; |
||
297 |
1560 |
X509_VERIFY_PARAM_inherit(s->param, ctx->param); |
|
298 |
1560 |
s->internal->quiet_shutdown = ctx->internal->quiet_shutdown; |
|
299 |
1560 |
s->max_send_fragment = ctx->internal->max_send_fragment; |
|
300 |
|||
301 |
1560 |
CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
|
302 |
1560 |
s->ctx = ctx; |
|
303 |
1560 |
s->internal->tlsext_debug_cb = 0; |
|
304 |
1560 |
s->internal->tlsext_debug_arg = NULL; |
|
305 |
1560 |
s->internal->tlsext_ticket_expected = 0; |
|
306 |
1560 |
s->tlsext_status_type = -1; |
|
307 |
1560 |
s->internal->tlsext_status_expected = 0; |
|
308 |
1560 |
s->internal->tlsext_ocsp_ids = NULL; |
|
309 |
1560 |
s->internal->tlsext_ocsp_exts = NULL; |
|
310 |
1560 |
s->internal->tlsext_ocsp_resp = NULL; |
|
311 |
1560 |
s->internal->tlsext_ocsp_resplen = -1; |
|
312 |
1560 |
CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
|
313 |
1560 |
s->initial_ctx = ctx; |
|
314 |
|||
315 |
✗✓ | 1560 |
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 |
✓✓ | 1560 |
if (ctx->internal->tlsext_supportedgroups != NULL) { |
329 |
232 |
s->internal->tlsext_supportedgroups = |
|
330 |
232 |
calloc(ctx->internal->tlsext_supportedgroups_length, |
|
331 |
sizeof(ctx->internal->tlsext_supportedgroups)); |
||
332 |
✓✗ | 232 |
if (s->internal->tlsext_supportedgroups == NULL) |
333 |
goto err; |
||
334 |
696 |
memcpy(s->internal->tlsext_supportedgroups, |
|
335 |
232 |
ctx->internal->tlsext_supportedgroups, |
|
336 |
232 |
ctx->internal->tlsext_supportedgroups_length * |
|
337 |
sizeof(ctx->internal->tlsext_supportedgroups[0])); |
||
338 |
232 |
s->internal->tlsext_supportedgroups_length = |
|
339 |
232 |
ctx->internal->tlsext_supportedgroups_length; |
|
340 |
232 |
} |
|
341 |
|||
342 |
✓✓ | 1560 |
if (s->ctx->internal->alpn_client_proto_list != NULL) { |
343 |
34 |
s->internal->alpn_client_proto_list = |
|
344 |
34 |
malloc(s->ctx->internal->alpn_client_proto_list_len); |
|
345 |
✓✗ | 34 |
if (s->internal->alpn_client_proto_list == NULL) |
346 |
goto err; |
||
347 |
34 |
memcpy(s->internal->alpn_client_proto_list, |
|
348 |
34 |
s->ctx->internal->alpn_client_proto_list, |
|
349 |
34 |
s->ctx->internal->alpn_client_proto_list_len); |
|
350 |
34 |
s->internal->alpn_client_proto_list_len = |
|
351 |
34 |
s->ctx->internal->alpn_client_proto_list_len; |
|
352 |
34 |
} |
|
353 |
|||
354 |
1560 |
s->verify_result = X509_V_OK; |
|
355 |
|||
356 |
1560 |
s->method = ctx->method; |
|
357 |
|||
358 |
✓✗ | 1560 |
if (!s->method->internal->ssl_new(s)) |
359 |
goto err; |
||
360 |
|||
361 |
1560 |
s->references = 1; |
|
362 |
1560 |
s->server = (ctx->method->internal->ssl_accept == ssl_undefined_function) ? 0 : 1; |
|
363 |
|||
364 |
1560 |
SSL_clear(s); |
|
365 |
|||
366 |
1560 |
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->internal->ex_data); |
|
367 |
|||
368 |
1560 |
return (s); |
|
369 |
|||
370 |
err: |
||
371 |
SSL_free(s); |
||
372 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
373 |
return (NULL); |
||
374 |
1560 |
} |
|
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 |
✗✓ | 448 |
if (sid_ctx_len > sizeof ctx->sid_ctx) { |
381 |
SSLerrorx(SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); |
||
382 |
return (0); |
||
383 |
} |
||
384 |
224 |
ctx->sid_ctx_length = sid_ctx_len; |
|
385 |
224 |
memcpy(ctx->sid_ctx, sid_ctx, sid_ctx_len); |
|
386 |
|||
387 |
224 |
return (1); |
|
388 |
224 |
} |
|
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 |
96 |
SSL_SESSION r, *p; |
|
434 |
|||
435 |
✗✓ | 48 |
if (id_len > sizeof r.session_id) |
436 |
return (0); |
||
437 |
|||
438 |
48 |
r.ssl_version = ssl->version; |
|
439 |
48 |
r.session_id_length = id_len; |
|
440 |
48 |
memcpy(r.session_id, id, id_len); |
|
441 |
|||
442 |
48 |
CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); |
|
443 |
48 |
p = lh_SSL_SESSION_retrieve(ssl->ctx->internal->sessions, &r); |
|
444 |
48 |
CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); |
|
445 |
48 |
return (p != NULL); |
|
446 |
48 |
} |
|
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 |
✓✓ | 3676 |
if (s == NULL) |
490 |
285 |
return; |
|
491 |
|||
492 |
1553 |
i = CRYPTO_add(&s->references, -1, CRYPTO_LOCK_SSL); |
|
493 |
✗✓ | 1553 |
if (i > 0) |
494 |
return; |
||
495 |
|||
496 |
1553 |
X509_VERIFY_PARAM_free(s->param); |
|
497 |
|||
498 |
1553 |
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->internal->ex_data); |
|
499 |
|||
500 |
✓✓ | 1553 |
if (s->bbio != NULL) { |
501 |
/* If the buffering BIO is in place, pop it off */ |
||
502 |
✓✗ | 52 |
if (s->bbio == s->wbio) { |
503 |
52 |
s->wbio = BIO_pop(s->wbio); |
|
504 |
52 |
} |
|
505 |
52 |
BIO_free(s->bbio); |
|
506 |
52 |
s->bbio = NULL; |
|
507 |
52 |
} |
|
508 |
|||
509 |
✓✓ | 1553 |
if (s->rbio != s->wbio) |
510 |
60 |
BIO_free_all(s->rbio); |
|
511 |
1553 |
BIO_free_all(s->wbio); |
|
512 |
|||
513 |
1553 |
BUF_MEM_free(s->internal->init_buf); |
|
514 |
|||
515 |
/* add extra stuff */ |
||
516 |
1553 |
sk_SSL_CIPHER_free(s->cipher_list); |
|
517 |
1553 |
sk_SSL_CIPHER_free(s->internal->cipher_list_by_id); |
|
518 |
|||
519 |
/* Make the next call work :-) */ |
||
520 |
✓✓ | 1553 |
if (s->session != NULL) { |
521 |
1399 |
ssl_clear_bad_session(s); |
|
522 |
1399 |
SSL_SESSION_free(s->session); |
|
523 |
1399 |
} |
|
524 |
|||
525 |
1553 |
ssl_clear_cipher_ctx(s); |
|
526 |
1553 |
ssl_clear_hash_ctx(&s->read_hash); |
|
527 |
1553 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
528 |
|||
529 |
1553 |
ssl_cert_free(s->cert); |
|
530 |
|||
531 |
1553 |
free(s->tlsext_hostname); |
|
532 |
1553 |
SSL_CTX_free(s->initial_ctx); |
|
533 |
|||
534 |
1553 |
free(s->internal->tlsext_ecpointformatlist); |
|
535 |
1553 |
free(s->internal->tlsext_supportedgroups); |
|
536 |
|||
537 |
1553 |
sk_X509_EXTENSION_pop_free(s->internal->tlsext_ocsp_exts, |
|
538 |
X509_EXTENSION_free); |
||
539 |
1553 |
sk_OCSP_RESPID_pop_free(s->internal->tlsext_ocsp_ids, OCSP_RESPID_free); |
|
540 |
1553 |
free(s->internal->tlsext_ocsp_resp); |
|
541 |
|||
542 |
1553 |
sk_X509_NAME_pop_free(s->internal->client_CA, X509_NAME_free); |
|
543 |
|||
544 |
✓✗ | 1553 |
if (s->method != NULL) |
545 |
1553 |
s->method->internal->ssl_free(s); |
|
546 |
|||
547 |
1553 |
SSL_CTX_free(s->ctx); |
|
548 |
|||
549 |
1553 |
free(s->internal->alpn_client_proto_list); |
|
550 |
|||
551 |
#ifndef OPENSSL_NO_SRTP |
||
552 |
1553 |
sk_SRTP_PROTECTION_PROFILE_free(s->internal->srtp_profiles); |
|
553 |
#endif |
||
554 |
|||
555 |
1553 |
free(s->internal); |
|
556 |
1553 |
free(s); |
|
557 |
3391 |
} |
|
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 |
✗✓ | 17002 |
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 |
✓✓✗✓ |
16986 |
if (s->rbio != rbio && s->rbio != s->wbio) |
571 |
BIO_free_all(s->rbio); |
||
572 |
✓✓ | 8501 |
if (s->wbio != wbio) |
573 |
8485 |
BIO_free_all(s->wbio); |
|
574 |
8501 |
s->rbio = rbio; |
|
575 |
8501 |
s->wbio = wbio; |
|
576 |
8501 |
} |
|
577 |
|||
578 |
BIO * |
||
579 |
SSL_get_rbio(const SSL *s) |
||
580 |
{ |
||
581 |
52748 |
return (s->rbio); |
|
582 |
} |
||
583 |
|||
584 |
BIO * |
||
585 |
SSL_get_wbio(const SSL *s) |
||
586 |
{ |
||
587 |
6160 |
return (s->wbio); |
|
588 |
} |
||
589 |
|||
590 |
int |
||
591 |
SSL_get_fd(const SSL *s) |
||
592 |
{ |
||
593 |
31692 |
return (SSL_get_rfd(s)); |
|
594 |
} |
||
595 |
|||
596 |
int |
||
597 |
SSL_get_rfd(const SSL *s) |
||
598 |
{ |
||
599 |
31692 |
int ret = -1; |
|
600 |
BIO *b, *r; |
||
601 |
|||
602 |
15846 |
b = SSL_get_rbio(s); |
|
603 |
15846 |
r = BIO_find_type(b, BIO_TYPE_DESCRIPTOR); |
|
604 |
✓✗ | 15846 |
if (r != NULL) |
605 |
15846 |
BIO_get_fd(r, &ret); |
|
606 |
31692 |
return (ret); |
|
607 |
15846 |
} |
|
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 |
✓✗✓✓ |
64 |
if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) |
648 |
✓✗ | 32 |
|| ((int)BIO_get_fd(s->rbio, NULL) != fd)) { |
649 |
8 |
bio = BIO_new(BIO_s_socket()); |
|
650 |
|||
651 |
✗✓ | 8 |
if (bio == NULL) { |
652 |
SSLerror(s, ERR_R_BUF_LIB); |
||
653 |
goto err; |
||
654 |
} |
||
655 |
8 |
BIO_set_fd(bio, fd, BIO_NOCLOSE); |
|
656 |
8 |
SSL_set_bio(s, SSL_get_rbio(s), bio); |
|
657 |
8 |
} else |
|
658 |
8 |
SSL_set_bio(s, SSL_get_rbio(s), SSL_get_rbio(s)); |
|
659 |
16 |
ret = 1; |
|
660 |
err: |
||
661 |
16 |
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 |
✗✓✗✗ |
32 |
if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) |
671 |
|| ((int)BIO_get_fd(s->wbio, NULL) != fd)) { |
||
672 |
16 |
bio = BIO_new(BIO_s_socket()); |
|
673 |
|||
674 |
✗✓ | 16 |
if (bio == NULL) { |
675 |
SSLerror(s, ERR_R_BUF_LIB); |
||
676 |
goto err; |
||
677 |
} |
||
678 |
16 |
BIO_set_fd(bio, fd, BIO_NOCLOSE); |
|
679 |
16 |
SSL_set_bio(s, bio, SSL_get_wbio(s)); |
|
680 |
16 |
} else |
|
681 |
SSL_set_bio(s, SSL_get_wbio(s), SSL_get_wbio(s)); |
||
682 |
16 |
ret = 1; |
|
683 |
err: |
||
684 |
16 |
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 |
4616 |
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 |
✓✗✗✓ |
924 |
if ((s == NULL) || (s->session == NULL)) |
801 |
r = NULL; |
||
802 |
else |
||
803 |
308 |
r = s->session->peer; |
|
804 |
|||
805 |
✓✓ | 308 |
if (r == NULL) |
806 |
72 |
return (r); |
|
807 |
|||
808 |
236 |
CRYPTO_add(&r->references, 1, CRYPTO_LOCK_X509); |
|
809 |
|||
810 |
236 |
return (r); |
|
811 |
308 |
} |
|
812 |
|||
813 |
STACK_OF(X509) * |
||
814 |
SSL_get_peer_cert_chain(const SSL *s) |
||
815 |
{ |
||
816 |
STACK_OF(X509) *r; |
||
817 |
|||
818 |
✓✗✓✗ ✓✓ |
272 |
if ((s == NULL) || (s->session == NULL) || |
819 |
68 |
(SSI(s)->sess_cert == NULL)) |
|
820 |
32 |
r = NULL; |
|
821 |
else |
||
822 |
36 |
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 |
68 |
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 |
✓✗✓✗ ✗✓ |
64 |
if ((ctx == NULL) || (ctx->internal->cert == NULL) || |
869 |
16 |
(ctx->internal->cert->key->x509 == NULL)) { |
|
870 |
SSLerrorx(SSL_R_NO_CERTIFICATE_ASSIGNED); |
||
871 |
return (0); |
||
872 |
} |
||
873 |
✗✓ | 16 |
if (ctx->internal->cert->key->privatekey == NULL) { |
874 |
SSLerrorx(SSL_R_NO_PRIVATE_KEY_ASSIGNED); |
||
875 |
return (0); |
||
876 |
} |
||
877 |
16 |
return (X509_check_private_key(ctx->internal->cert->key->x509, |
|
878 |
ctx->internal->cert->key->privatekey)); |
||
879 |
16 |
} |
|
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 |
✓✓ | 112 |
if (s->internal->handshake_func == NULL) |
909 |
24 |
SSL_set_accept_state(s); /* Not properly initialized yet */ |
|
910 |
|||
911 |
56 |
return (s->method->internal->ssl_accept(s)); |
|
912 |
} |
||
913 |
|||
914 |
int |
||
915 |
SSL_connect(SSL *s) |
||
916 |
{ |
||
917 |
✓✓ | 16054 |
if (s->internal->handshake_func == NULL) |
918 |
937 |
SSL_set_connect_state(s); /* Not properly initialized yet */ |
|
919 |
|||
920 |
8027 |
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 |
✗✓ | 12816 |
if (s->internal->handshake_func == NULL) { |
933 |
SSLerror(s, SSL_R_UNINITIALIZED); |
||
934 |
return (-1); |
||
935 |
} |
||
936 |
|||
937 |
✗✓ | 6408 |
if (s->internal->shutdown & SSL_RECEIVED_SHUTDOWN) { |
938 |
s->internal->rwstate = SSL_NOTHING; |
||
939 |
return (0); |
||
940 |
} |
||
941 |
6408 |
return (s->method->internal->ssl_read(s, buf, num)); |
|
942 |
6408 |
} |
|
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 |
✗✓ | 12244 |
if (s->internal->handshake_func == NULL) { |
962 |
SSLerror(s, SSL_R_UNINITIALIZED); |
||
963 |
return (-1); |
||
964 |
} |
||
965 |
|||
966 |
✗✓ | 6122 |
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 |
6122 |
return (s->method->internal->ssl_write(s, buf, num)); |
|
972 |
6122 |
} |
|
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 |
✗✓ | 16866 |
if (s->internal->handshake_func == NULL) { |
985 |
SSLerror(s, SSL_R_UNINITIALIZED); |
||
986 |
return (-1); |
||
987 |
} |
||
988 |
|||
989 |
✓✗✓✗ |
16866 |
if ((s != NULL) && !SSL_in_init(s)) |
990 |
8433 |
return (s->method->internal->ssl_shutdown(s)); |
|
991 |
else |
||
992 |
return (1); |
||
993 |
8433 |
} |
|
994 |
|||
995 |
int |
||
996 |
SSL_renegotiate(SSL *s) |
||
997 |
{ |
||
998 |
✓✗ | 8 |
if (s->internal->renegotiate == 0) |
999 |
4 |
s->internal->renegotiate = 1; |
|
1000 |
|||
1001 |
4 |
s->internal->new_session = 1; |
|
1002 |
|||
1003 |
4 |
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 |
✗✗✗✓ ✓✗✗✗ ✗✗✗✓ ✓ |
37086 |
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 |
10515 |
return (s->internal->options|=larg); |
|
1046 |
case SSL_CTRL_CLEAR_OPTIONS: |
||
1047 |
41 |
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 |
✗✓ | 7983 |
if (SSL_IS_DTLS(s)) |
1079 |
return dtls1_ctrl(s, cmd, larg, parg); |
||
1080 |
7983 |
return ssl3_ctrl(s, cmd, larg, parg); |
|
1081 |
} |
||
1082 |
18543 |
} |
|
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 |
✗✗✗✗ ✗✗✗✓ ✗✗✗✗ ✗✗✗✗ ✗✗✗✗ ✗✓✓✓ ✗✗✓ |
3240 |
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 |
32 |
l = ctx->internal->session_cache_mode; |
|
1137 |
32 |
ctx->internal->session_cache_mode = larg; |
|
1138 |
32 |
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 |
560 |
return (ctx->internal->options|=larg); |
|
1168 |
case SSL_CTRL_CLEAR_OPTIONS: |
||
1169 |
198 |
return (ctx->internal->options&=~larg); |
|
1170 |
case SSL_CTRL_MODE: |
||
1171 |
170 |
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 |
660 |
return (ssl3_ctx_ctrl(ctx, cmd, larg, parg)); |
|
1181 |
} |
||
1182 |
1620 |
} |
|
1183 |
|||
1184 |
long |
||
1185 |
SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) |
||
1186 |
{ |
||
1187 |
✗✓ | 504 |
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 |
252 |
return (ssl3_ctx_callback_ctrl(ctx, cmd, fp)); |
|
1196 |
} |
||
1197 |
252 |
} |
|
1198 |
|||
1199 |
int |
||
1200 |
ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) |
||
1201 |
{ |
||
1202 |
long l; |
||
1203 |
|||
1204 |
157720 |
l = a->id - b->id; |
|
1205 |
✓✓ | 78860 |
if (l == 0L) |
1206 |
15153 |
return (0); |
|
1207 |
else |
||
1208 |
63707 |
return ((l > 0) ? 1:-1); |
|
1209 |
78860 |
} |
|
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 |
585804 |
l = (*ap)->id - (*bp)->id; |
|
1218 |
✓✓ | 292902 |
if (l == 0L) |
1219 |
8177 |
return (0); |
|
1220 |
else |
||
1221 |
284725 |
return ((l > 0) ? 1:-1); |
|
1222 |
292902 |
} |
|
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 |
✓✗ | 49866 |
if (s != NULL) { |
1232 |
✓✓ | 24933 |
if (s->cipher_list != NULL) { |
1233 |
28 |
return (s->cipher_list); |
|
1234 |
✓✗✓✗ |
49810 |
} else if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL)) { |
1235 |
24905 |
return (s->ctx->cipher_list); |
|
1236 |
} |
||
1237 |
} |
||
1238 |
return (NULL); |
||
1239 |
24933 |
} |
|
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 |
✓✗ | 16354 |
if (s != NULL) { |
1249 |
✗✓ | 8177 |
if (s->internal->cipher_list_by_id != NULL) { |
1250 |
return (s->internal->cipher_list_by_id); |
||
1251 |
✓✗✓✗ |
16354 |
} else if ((s->ctx != NULL) && |
1252 |
8177 |
(s->ctx->internal->cipher_list_by_id != NULL)) { |
|
1253 |
8177 |
return (s->ctx->internal->cipher_list_by_id); |
|
1254 |
} |
||
1255 |
} |
||
1256 |
return (NULL); |
||
1257 |
8177 |
} |
|
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 |
✓✓ | 32956 |
if (s->version == DTLS1_VERSION) |
1269 |
104 |
return 0; |
|
1270 |
✗✓ | 16374 |
if ((ciphers = SSL_get_ciphers(s)) == NULL) |
1271 |
return 0; |
||
1272 |
|||
1273 |
✓✓ | 35548 |
for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { |
1274 |
17574 |
cipher = sk_SSL_CIPHER_value(ciphers, i); |
|
1275 |
|||
1276 |
17574 |
alg_k = cipher->algorithm_mkey; |
|
1277 |
17574 |
alg_a = cipher->algorithm_auth; |
|
1278 |
|||
1279 |
✓✓✗✓ |
18974 |
if ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA)) |
1280 |
16174 |
return 1; |
|
1281 |
} |
||
1282 |
|||
1283 |
200 |
return 0; |
|
1284 |
16478 |
} |
|
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 |
1230 |
sk = ssl_create_cipher_list(ctx->method, &ctx->cipher_list, |
|
1311 |
410 |
&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 |
✗✓ | 410 |
if (sk == NULL) |
1322 |
return (0); |
||
1323 |
✗✓ | 410 |
else if (sk_SSL_CIPHER_num(sk) == 0) { |
1324 |
SSLerrorx(SSL_R_NO_CIPHER_MATCH); |
||
1325 |
return (0); |
||
1326 |
} |
||
1327 |
410 |
return (1); |
|
1328 |
410 |
} |
|
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 |
48 |
sk = ssl_create_cipher_list(s->ctx->method, &s->cipher_list, |
|
1337 |
16 |
&s->internal->cipher_list_by_id, str); |
|
1338 |
/* see comment in SSL_CTX_set_cipher_list */ |
||
1339 |
✗✓ | 16 |
if (sk == NULL) |
1340 |
return (0); |
||
1341 |
✗✓ | 16 |
else if (sk_SSL_CIPHER_num(sk) == 0) { |
1342 |
SSLerror(s, SSL_R_NO_CIPHER_MATCH); |
||
1343 |
return (0); |
||
1344 |
} |
||
1345 |
16 |
return (1); |
|
1346 |
16 |
} |
|
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) *sk, unsigned char *p, |
||
1384 |
size_t maxlen, size_t *outlen) |
||
1385 |
{ |
||
1386 |
SSL_CIPHER *cipher; |
||
1387 |
int ciphers = 0; |
||
1388 |
16446 |
CBB cbb; |
|
1389 |
int i; |
||
1390 |
|||
1391 |
8223 |
*outlen = 0; |
|
1392 |
|||
1393 |
✗✓ | 8223 |
if (sk == NULL) |
1394 |
return (0); |
||
1395 |
|||
1396 |
✓✗ | 8223 |
if (!CBB_init_fixed(&cbb, p, maxlen)) |
1397 |
goto err; |
||
1398 |
|||
1399 |
✓✓ | 775212 |
for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { |
1400 |
379383 |
cipher = sk_SSL_CIPHER_value(sk, i); |
|
1401 |
|||
1402 |
/* Skip TLS v1.2 only ciphersuites if lower than v1.2 */ |
||
1403 |
✓✓✓✓ |
565164 |
if ((cipher->algorithm_ssl & SSL_TLSV1_2) && |
1404 |
✓✓ | 556883 |
(TLS1_get_client_version(s) < TLS1_2_VERSION)) |
1405 |
continue; |
||
1406 |
|||
1407 |
✓✗ | 377395 |
if (!CBB_add_u16(&cbb, ssl3_cipher_get_value(cipher))) |
1408 |
goto err; |
||
1409 |
|||
1410 |
377395 |
ciphers++; |
|
1411 |
377395 |
} |
|
1412 |
|||
1413 |
/* Add SCSV if there are other ciphers and we're not renegotiating. */ |
||
1414 |
✓✗✓✓ |
16446 |
if (ciphers > 0 && !s->internal->renegotiate) { |
1415 |
✓✗ | 8222 |
if (!CBB_add_u16(&cbb, SSL3_CK_SCSV & SSL3_CK_VALUE_MASK)) |
1416 |
goto err; |
||
1417 |
} |
||
1418 |
|||
1419 |
✓✗ | 8223 |
if (!CBB_finish(&cbb, NULL, outlen)) |
1420 |
goto err; |
||
1421 |
|||
1422 |
8223 |
return 1; |
|
1423 |
|||
1424 |
err: |
||
1425 |
CBB_cleanup(&cbb); |
||
1426 |
|||
1427 |
return 0; |
||
1428 |
8223 |
} |
|
1429 |
|||
1430 |
STACK_OF(SSL_CIPHER) * |
||
1431 |
ssl_bytes_to_cipher_list(SSL *s, const unsigned char *p, int num) |
||
1432 |
{ |
||
1433 |
538 |
CBS cbs; |
|
1434 |
const SSL_CIPHER *c; |
||
1435 |
STACK_OF(SSL_CIPHER) *sk = NULL; |
||
1436 |
unsigned long cipher_id; |
||
1437 |
269 |
uint16_t cipher_value, max_version; |
|
1438 |
|||
1439 |
✓✗ | 269 |
if (s->s3) |
1440 |
269 |
S3I(s)->send_connection_binding = 0; |
|
1441 |
|||
1442 |
/* |
||
1443 |
* RFC 5246 section 7.4.1.2 defines the interval as [2,2^16-2]. |
||
1444 |
*/ |
||
1445 |
✓✓ | 269 |
if (num < 2 || num > 0x10000 - 2) { |
1446 |
3 |
SSLerror(s, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); |
|
1447 |
3 |
return (NULL); |
|
1448 |
} |
||
1449 |
|||
1450 |
✗✓ | 266 |
if ((sk = sk_SSL_CIPHER_new_null()) == NULL) { |
1451 |
SSLerror(s, ERR_R_MALLOC_FAILURE); |
||
1452 |
goto err; |
||
1453 |
} |
||
1454 |
|||
1455 |
266 |
CBS_init(&cbs, p, num); |
|
1456 |
✓✓ | 4811 |
while (CBS_len(&cbs) > 0) { |
1457 |
✓✓ | 4280 |
if (!CBS_get_u16(&cbs, &cipher_value)) { |
1458 |
1 |
SSLerror(s, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); |
|
1459 |
1 |
goto err; |
|
1460 |
} |
||
1461 |
|||
1462 |
4279 |
cipher_id = SSL3_CK_ID | cipher_value; |
|
1463 |
|||
1464 |
✓✓ | 4279 |
if (s->s3 != NULL && cipher_id == SSL3_CK_SCSV) { |
1465 |
/* |
||
1466 |
* TLS_EMPTY_RENEGOTIATION_INFO_SCSV is fatal if |
||
1467 |
* renegotiating. |
||
1468 |
*/ |
||
1469 |
✗✓ | 260 |
if (s->internal->renegotiate) { |
1470 |
SSLerror(s, SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING); |
||
1471 |
ssl3_send_alert(s, SSL3_AL_FATAL, |
||
1472 |
SSL_AD_HANDSHAKE_FAILURE); |
||
1473 |
|||
1474 |
goto err; |
||
1475 |
} |
||
1476 |
260 |
S3I(s)->send_connection_binding = 1; |
|
1477 |
260 |
continue; |
|
1478 |
} |
||
1479 |
|||
1480 |
✗✓ | 4019 |
if (cipher_id == SSL3_CK_FALLBACK_SCSV) { |
1481 |
/* |
||
1482 |
* TLS_FALLBACK_SCSV indicates that the client |
||
1483 |
* previously tried a higher protocol version. |
||
1484 |
* Fail if the current version is an unexpected |
||
1485 |
* downgrade. |
||
1486 |
*/ |
||
1487 |
max_version = ssl_max_server_version(s); |
||
1488 |
if (max_version == 0 || s->version < max_version) { |
||
1489 |
SSLerror(s, SSL_R_INAPPROPRIATE_FALLBACK); |
||
1490 |
if (s->s3 != NULL) |
||
1491 |
ssl3_send_alert(s, SSL3_AL_FATAL, |
||
1492 |
SSL_AD_INAPPROPRIATE_FALLBACK); |
||
1493 |
goto err; |
||
1494 |
} |
||
1495 |
continue; |
||
1496 |
} |
||
1497 |
|||
1498 |
✓✓ | 4019 |
if ((c = ssl3_get_cipher_by_value(cipher_value)) != NULL) { |
1499 |
✓✗ | 3819 |
if (!sk_SSL_CIPHER_push(sk, c)) { |
1500 |
SSLerror(s, ERR_R_MALLOC_FAILURE); |
||
1501 |
goto err; |
||
1502 |
} |
||
1503 |
} |
||
1504 |
} |
||
1505 |
|||
1506 |
265 |
return (sk); |
|
1507 |
|||
1508 |
err: |
||
1509 |
1 |
sk_SSL_CIPHER_free(sk); |
|
1510 |
|||
1511 |
1 |
return (NULL); |
|
1512 |
269 |
} |
|
1513 |
|||
1514 |
|||
1515 |
/* |
||
1516 |
* Return a servername extension value if provided in Client Hello, or NULL. |
||
1517 |
* So far, only host_name types are defined (RFC 3546). |
||
1518 |
*/ |
||
1519 |
const char * |
||
1520 |
SSL_get_servername(const SSL *s, const int type) |
||
1521 |
{ |
||
1522 |
✗✓ | 32 |
if (type != TLSEXT_NAMETYPE_host_name) |
1523 |
return (NULL); |
||
1524 |
|||
1525 |
✓✗✓✗ |
64 |
return (s->session && !s->tlsext_hostname ? |
1526 |
16 |
s->session->tlsext_hostname : |
|
1527 |
s->tlsext_hostname); |
||
1528 |
16 |
} |
|
1529 |
|||
1530 |
int |
||
1531 |
SSL_get_servername_type(const SSL *s) |
||
1532 |
{ |
||
1533 |
if (s->session && |
||
1534 |
(!s->tlsext_hostname ? |
||
1535 |
s->session->tlsext_hostname : s->tlsext_hostname)) |
||
1536 |
return (TLSEXT_NAMETYPE_host_name); |
||
1537 |
return (-1); |
||
1538 |
} |
||
1539 |
|||
1540 |
/* |
||
1541 |
* SSL_select_next_proto implements standard protocol selection. It is |
||
1542 |
* expected that this function is called from the callback set by |
||
1543 |
* SSL_CTX_set_alpn_select_cb. |
||
1544 |
* |
||
1545 |
* The protocol data is assumed to be a vector of 8-bit, length prefixed byte |
||
1546 |
* strings. The length byte itself is not included in the length. A byte |
||
1547 |
* string of length 0 is invalid. No byte string may be truncated. |
||
1548 |
* |
||
1549 |
* It returns either: |
||
1550 |
* OPENSSL_NPN_NEGOTIATED if a common protocol was found, or |
||
1551 |
* OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. |
||
1552 |
*/ |
||
1553 |
int |
||
1554 |
SSL_select_next_proto(unsigned char **out, unsigned char *outlen, |
||
1555 |
const unsigned char *server, unsigned int server_len, |
||
1556 |
const unsigned char *client, unsigned int client_len) |
||
1557 |
{ |
||
1558 |
unsigned int i, j; |
||
1559 |
const unsigned char *result; |
||
1560 |
int status = OPENSSL_NPN_UNSUPPORTED; |
||
1561 |
|||
1562 |
/* |
||
1563 |
* For each protocol in server preference order, |
||
1564 |
* see if we support it. |
||
1565 |
*/ |
||
1566 |
✓✓ | 120 |
for (i = 0; i < server_len; ) { |
1567 |
✓✓ | 120 |
for (j = 0; j < client_len; ) { |
1568 |
✓✗✓✓ |
96 |
if (server[i] == client[j] && |
1569 |
96 |
memcmp(&server[i + 1], |
|
1570 |
96 |
&client[j + 1], server[i]) == 0) { |
|
1571 |
/* We found a match */ |
||
1572 |
result = &server[i]; |
||
1573 |
status = OPENSSL_NPN_NEGOTIATED; |
||
1574 |
24 |
goto found; |
|
1575 |
} |
||
1576 |
24 |
j += client[j]; |
|
1577 |
24 |
j++; |
|
1578 |
} |
||
1579 |
12 |
i += server[i]; |
|
1580 |
12 |
i++; |
|
1581 |
} |
||
1582 |
|||
1583 |
/* There's no overlap between our protocols and the server's list. */ |
||
1584 |
result = client; |
||
1585 |
8 |
status = OPENSSL_NPN_NO_OVERLAP; |
|
1586 |
|||
1587 |
found: |
||
1588 |
32 |
*out = (unsigned char *) result + 1; |
|
1589 |
32 |
*outlen = result[0]; |
|
1590 |
32 |
return (status); |
|
1591 |
} |
||
1592 |
|||
1593 |
/* SSL_get0_next_proto_negotiated is deprecated. */ |
||
1594 |
void |
||
1595 |
SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, |
||
1596 |
unsigned *len) |
||
1597 |
{ |
||
1598 |
*data = NULL; |
||
1599 |
*len = 0; |
||
1600 |
} |
||
1601 |
|||
1602 |
/* SSL_CTX_set_next_protos_advertised_cb is deprecated. */ |
||
1603 |
void |
||
1604 |
SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, |
||
1605 |
const unsigned char **out, unsigned int *outlen, void *arg), void *arg) |
||
1606 |
{ |
||
1607 |
} |
||
1608 |
|||
1609 |
/* SSL_CTX_set_next_proto_select_cb is deprecated. */ |
||
1610 |
void |
||
1611 |
SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, |
||
1612 |
unsigned char **out, unsigned char *outlen, const unsigned char *in, |
||
1613 |
unsigned int inlen, void *arg), void *arg) |
||
1614 |
{ |
||
1615 |
} |
||
1616 |
|||
1617 |
/* |
||
1618 |
* SSL_CTX_set_alpn_protos sets the ALPN protocol list to the specified |
||
1619 |
* protocols, which must be in wire-format (i.e. a series of non-empty, |
||
1620 |
* 8-bit length-prefixed strings). Returns 0 on success. |
||
1621 |
*/ |
||
1622 |
int |
||
1623 |
SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, |
||
1624 |
unsigned int protos_len) |
||
1625 |
{ |
||
1626 |
int failed = 1; |
||
1627 |
|||
1628 |
✓✗ | 68 |
if (protos == NULL || protos_len == 0) |
1629 |
goto err; |
||
1630 |
|||
1631 |
34 |
free(ctx->internal->alpn_client_proto_list); |
|
1632 |
34 |
ctx->internal->alpn_client_proto_list = NULL; |
|
1633 |
34 |
ctx->internal->alpn_client_proto_list_len = 0; |
|
1634 |
|||
1635 |
✓✗ | 68 |
if ((ctx->internal->alpn_client_proto_list = malloc(protos_len)) |
1636 |
34 |
== NULL) |
|
1637 |
goto err; |
||
1638 |
34 |
ctx->internal->alpn_client_proto_list_len = protos_len; |
|
1639 |
|||
1640 |
34 |
memcpy(ctx->internal->alpn_client_proto_list, protos, protos_len); |
|
1641 |
|||
1642 |
34 |
failed = 0; |
|
1643 |
|||
1644 |
err: |
||
1645 |
/* NOTE: Return values are the reverse of what you expect. */ |
||
1646 |
34 |
return (failed); |
|
1647 |
} |
||
1648 |
|||
1649 |
/* |
||
1650 |
* SSL_set_alpn_protos sets the ALPN protocol list to the specified |
||
1651 |
* protocols, which must be in wire-format (i.e. a series of non-empty, |
||
1652 |
* 8-bit length-prefixed strings). Returns 0 on success. |
||
1653 |
*/ |
||
1654 |
int |
||
1655 |
SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, |
||
1656 |
unsigned int protos_len) |
||
1657 |
{ |
||
1658 |
int failed = 1; |
||
1659 |
|||
1660 |
✓✗ | 28 |
if (protos == NULL || protos_len == 0) |
1661 |
goto err; |
||
1662 |
|||
1663 |
14 |
free(ssl->internal->alpn_client_proto_list); |
|
1664 |
14 |
ssl->internal->alpn_client_proto_list = NULL; |
|
1665 |
14 |
ssl->internal->alpn_client_proto_list_len = 0; |
|
1666 |
|||
1667 |
✓✗ | 28 |
if ((ssl->internal->alpn_client_proto_list = malloc(protos_len)) |
1668 |
14 |
== NULL) |
|
1669 |
goto err; |
||
1670 |
14 |
ssl->internal->alpn_client_proto_list_len = protos_len; |
|
1671 |
|||
1672 |
14 |
memcpy(ssl->internal->alpn_client_proto_list, protos, protos_len); |
|
1673 |
|||
1674 |
14 |
failed = 0; |
|
1675 |
|||
1676 |
err: |
||
1677 |
/* NOTE: Return values are the reverse of what you expect. */ |
||
1678 |
14 |
return (failed); |
|
1679 |
} |
||
1680 |
|||
1681 |
/* |
||
1682 |
* SSL_CTX_set_alpn_select_cb sets a callback function that is called during |
||
1683 |
* ClientHello processing in order to select an ALPN protocol from the |
||
1684 |
* client's list of offered protocols. |
||
1685 |
*/ |
||
1686 |
void |
||
1687 |
SSL_CTX_set_alpn_select_cb(SSL_CTX* ctx, |
||
1688 |
int (*cb) (SSL *ssl, const unsigned char **out, unsigned char *outlen, |
||
1689 |
const unsigned char *in, unsigned int inlen, void *arg), void *arg) |
||
1690 |
{ |
||
1691 |
68 |
ctx->internal->alpn_select_cb = cb; |
|
1692 |
34 |
ctx->internal->alpn_select_cb_arg = arg; |
|
1693 |
34 |
} |
|
1694 |
|||
1695 |
/* |
||
1696 |
* SSL_get0_alpn_selected gets the selected ALPN protocol (if any). On return |
||
1697 |
* it sets data to point to len bytes of protocol name (not including the |
||
1698 |
* leading length-prefix byte). If the server didn't respond with* a negotiated |
||
1699 |
* protocol then len will be zero. |
||
1700 |
*/ |
||
1701 |
void |
||
1702 |
SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, |
||
1703 |
unsigned *len) |
||
1704 |
{ |
||
1705 |
1032 |
*data = NULL; |
|
1706 |
516 |
*len = 0; |
|
1707 |
|||
1708 |
✓✗ | 516 |
if (ssl->s3 != NULL) { |
1709 |
516 |
*data = ssl->s3->internal->alpn_selected; |
|
1710 |
516 |
*len = ssl->s3->internal->alpn_selected_len; |
|
1711 |
516 |
} |
|
1712 |
516 |
} |
|
1713 |
|||
1714 |
int |
||
1715 |
SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, |
||
1716 |
const char *label, size_t llen, const unsigned char *p, size_t plen, |
||
1717 |
int use_context) |
||
1718 |
{ |
||
1719 |
return (tls1_export_keying_material(s, out, olen, |
||
1720 |
label, llen, p, plen, use_context)); |
||
1721 |
} |
||
1722 |
|||
1723 |
static unsigned long |
||
1724 |
ssl_session_hash(const SSL_SESSION *a) |
||
1725 |
{ |
||
1726 |
unsigned long l; |
||
1727 |
|||
1728 |
48 |
l = (unsigned long) |
|
1729 |
144 |
((unsigned int) a->session_id[0] )| |
|
1730 |
96 |
((unsigned int) a->session_id[1]<< 8L)| |
|
1731 |
96 |
((unsigned long)a->session_id[2]<<16L)| |
|
1732 |
48 |
((unsigned long)a->session_id[3]<<24L); |
|
1733 |
48 |
return (l); |
|
1734 |
} |
||
1735 |
|||
1736 |
/* |
||
1737 |
* NB: If this function (or indeed the hash function which uses a sort of |
||
1738 |
* coarser function than this one) is changed, ensure |
||
1739 |
* SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being |
||
1740 |
* able to construct an SSL_SESSION that will collide with any existing session |
||
1741 |
* with a matching session ID. |
||
1742 |
*/ |
||
1743 |
static int |
||
1744 |
ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) |
||
1745 |
{ |
||
1746 |
if (a->ssl_version != b->ssl_version) |
||
1747 |
return (1); |
||
1748 |
if (a->session_id_length != b->session_id_length) |
||
1749 |
return (1); |
||
1750 |
if (timingsafe_memcmp(a->session_id, b->session_id, a->session_id_length) != 0) |
||
1751 |
return (1); |
||
1752 |
return (0); |
||
1753 |
} |
||
1754 |
|||
1755 |
/* |
||
1756 |
* These wrapper functions should remain rather than redeclaring |
||
1757 |
* SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each |
||
1758 |
* variable. The reason is that the functions aren't static, they're exposed via |
||
1759 |
* ssl.h. |
||
1760 |
*/ |
||
1761 |
static unsigned long |
||
1762 |
ssl_session_LHASH_HASH(const void *arg) |
||
1763 |
{ |
||
1764 |
96 |
const SSL_SESSION *a = arg; |
|
1765 |
|||
1766 |
48 |
return ssl_session_hash(a); |
|
1767 |
} |
||
1768 |
|||
1769 |
static int |
||
1770 |
ssl_session_LHASH_COMP(const void *arg1, const void *arg2) |
||
1771 |
{ |
||
1772 |
const SSL_SESSION *a = arg1; |
||
1773 |
const SSL_SESSION *b = arg2; |
||
1774 |
|||
1775 |
return ssl_session_cmp(a, b); |
||
1776 |
} |
||
1777 |
|||
1778 |
SSL_CTX * |
||
1779 |
SSL_CTX_new(const SSL_METHOD *meth) |
||
1780 |
{ |
||
1781 |
SSL_CTX *ret; |
||
1782 |
|||
1783 |
✗✓ | 1672 |
if (meth == NULL) { |
1784 |
SSLerrorx(SSL_R_NULL_SSL_METHOD_PASSED); |
||
1785 |
return (NULL); |
||
1786 |
} |
||
1787 |
|||
1788 |
✗✓ | 836 |
if ((ret = calloc(1, sizeof(*ret))) == NULL) { |
1789 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
1790 |
return (NULL); |
||
1791 |
} |
||
1792 |
✗✓ | 836 |
if ((ret->internal = calloc(1, sizeof(*ret->internal))) == NULL) { |
1793 |
free(ret); |
||
1794 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
1795 |
return (NULL); |
||
1796 |
} |
||
1797 |
|||
1798 |
✗✓ | 836 |
if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) { |
1799 |
SSLerrorx(SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); |
||
1800 |
goto err; |
||
1801 |
} |
||
1802 |
|||
1803 |
836 |
ret->method = meth; |
|
1804 |
836 |
ret->internal->min_version = meth->internal->min_version; |
|
1805 |
836 |
ret->internal->max_version = meth->internal->max_version; |
|
1806 |
|||
1807 |
836 |
ret->cert_store = NULL; |
|
1808 |
836 |
ret->internal->session_cache_mode = SSL_SESS_CACHE_SERVER; |
|
1809 |
836 |
ret->internal->session_cache_size = SSL_SESSION_CACHE_MAX_SIZE_DEFAULT; |
|
1810 |
836 |
ret->internal->session_cache_head = NULL; |
|
1811 |
836 |
ret->internal->session_cache_tail = NULL; |
|
1812 |
|||
1813 |
/* We take the system default */ |
||
1814 |
836 |
ret->session_timeout = meth->internal->get_timeout(); |
|
1815 |
|||
1816 |
836 |
ret->internal->new_session_cb = 0; |
|
1817 |
836 |
ret->internal->remove_session_cb = 0; |
|
1818 |
836 |
ret->internal->get_session_cb = 0; |
|
1819 |
836 |
ret->internal->generate_session_id = 0; |
|
1820 |
|||
1821 |
836 |
memset((char *)&ret->internal->stats, 0, sizeof(ret->internal->stats)); |
|
1822 |
|||
1823 |
836 |
ret->references = 1; |
|
1824 |
836 |
ret->internal->quiet_shutdown = 0; |
|
1825 |
|||
1826 |
836 |
ret->internal->info_callback = NULL; |
|
1827 |
|||
1828 |
836 |
ret->internal->app_verify_callback = 0; |
|
1829 |
836 |
ret->internal->app_verify_arg = NULL; |
|
1830 |
|||
1831 |
836 |
ret->internal->max_cert_list = SSL_MAX_CERT_LIST_DEFAULT; |
|
1832 |
836 |
ret->internal->read_ahead = 0; |
|
1833 |
836 |
ret->internal->msg_callback = 0; |
|
1834 |
836 |
ret->internal->msg_callback_arg = NULL; |
|
1835 |
836 |
ret->verify_mode = SSL_VERIFY_NONE; |
|
1836 |
836 |
ret->sid_ctx_length = 0; |
|
1837 |
836 |
ret->internal->default_verify_callback = NULL; |
|
1838 |
✓✗ | 836 |
if ((ret->internal->cert = ssl_cert_new()) == NULL) |
1839 |
goto err; |
||
1840 |
|||
1841 |
836 |
ret->default_passwd_callback = 0; |
|
1842 |
836 |
ret->default_passwd_callback_userdata = NULL; |
|
1843 |
836 |
ret->internal->client_cert_cb = 0; |
|
1844 |
836 |
ret->internal->app_gen_cookie_cb = 0; |
|
1845 |
836 |
ret->internal->app_verify_cookie_cb = 0; |
|
1846 |
|||
1847 |
836 |
ret->internal->sessions = lh_SSL_SESSION_new(); |
|
1848 |
✓✗ | 836 |
if (ret->internal->sessions == NULL) |
1849 |
goto err; |
||
1850 |
836 |
ret->cert_store = X509_STORE_new(); |
|
1851 |
✓✗ | 836 |
if (ret->cert_store == NULL) |
1852 |
goto err; |
||
1853 |
|||
1854 |
1672 |
ssl_create_cipher_list(ret->method, &ret->cipher_list, |
|
1855 |
836 |
&ret->internal->cipher_list_by_id, SSL_DEFAULT_CIPHER_LIST); |
|
1856 |
✓✗✗✓ |
1672 |
if (ret->cipher_list == NULL || |
1857 |
836 |
sk_SSL_CIPHER_num(ret->cipher_list) <= 0) { |
|
1858 |
SSLerrorx(SSL_R_LIBRARY_HAS_NO_CIPHERS); |
||
1859 |
goto err2; |
||
1860 |
} |
||
1861 |
|||
1862 |
836 |
ret->param = X509_VERIFY_PARAM_new(); |
|
1863 |
✓✗ | 836 |
if (!ret->param) |
1864 |
goto err; |
||
1865 |
|||
1866 |
✓✗ | 836 |
if ((ret->internal->client_CA = sk_X509_NAME_new_null()) == NULL) |
1867 |
goto err; |
||
1868 |
|||
1869 |
836 |
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->internal->ex_data); |
|
1870 |
|||
1871 |
836 |
ret->extra_certs = NULL; |
|
1872 |
|||
1873 |
836 |
ret->internal->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; |
|
1874 |
|||
1875 |
836 |
ret->internal->tlsext_servername_callback = 0; |
|
1876 |
836 |
ret->internal->tlsext_servername_arg = NULL; |
|
1877 |
|||
1878 |
/* Setup RFC4507 ticket keys */ |
||
1879 |
836 |
arc4random_buf(ret->internal->tlsext_tick_key_name, 16); |
|
1880 |
836 |
arc4random_buf(ret->internal->tlsext_tick_hmac_key, 16); |
|
1881 |
836 |
arc4random_buf(ret->internal->tlsext_tick_aes_key, 16); |
|
1882 |
|||
1883 |
836 |
ret->internal->tlsext_status_cb = 0; |
|
1884 |
836 |
ret->internal->tlsext_status_arg = NULL; |
|
1885 |
|||
1886 |
#ifndef OPENSSL_NO_ENGINE |
||
1887 |
836 |
ret->internal->client_cert_engine = NULL; |
|
1888 |
#ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO |
||
1889 |
#define eng_strx(x) #x |
||
1890 |
#define eng_str(x) eng_strx(x) |
||
1891 |
/* Use specific client engine automatically... ignore errors */ |
||
1892 |
{ |
||
1893 |
ENGINE *eng; |
||
1894 |
eng = ENGINE_by_id(eng_str(OPENSSL_SSL_CLIENT_ENGINE_AUTO)); |
||
1895 |
if (!eng) { |
||
1896 |
ERR_clear_error(); |
||
1897 |
ENGINE_load_builtin_engines(); |
||
1898 |
eng = ENGINE_by_id(eng_str( |
||
1899 |
OPENSSL_SSL_CLIENT_ENGINE_AUTO)); |
||
1900 |
} |
||
1901 |
if (!eng || !SSL_CTX_set_client_cert_engine(ret, eng)) |
||
1902 |
ERR_clear_error(); |
||
1903 |
} |
||
1904 |
#endif |
||
1905 |
#endif |
||
1906 |
/* |
||
1907 |
* Default is to connect to non-RI servers. When RI is more widely |
||
1908 |
* deployed might change this. |
||
1909 |
*/ |
||
1910 |
836 |
ret->internal->options |= SSL_OP_LEGACY_SERVER_CONNECT; |
|
1911 |
|||
1912 |
836 |
return (ret); |
|
1913 |
err: |
||
1914 |
SSLerrorx(ERR_R_MALLOC_FAILURE); |
||
1915 |
err2: |
||
1916 |
SSL_CTX_free(ret); |
||
1917 |
return (NULL); |
||
1918 |
836 |
} |
|
1919 |
|||
1920 |
void |
||
1921 |
SSL_CTX_free(SSL_CTX *ctx) |
||
1922 |
{ |
||
1923 |
int i; |
||
1924 |
|||
1925 |
✓✓ | 8462 |
if (ctx == NULL) |
1926 |
296 |
return; |
|
1927 |
|||
1928 |
3935 |
i = CRYPTO_add(&ctx->references, -1, CRYPTO_LOCK_SSL_CTX); |
|
1929 |
✓✓ | 3935 |
if (i > 0) |
1930 |
3106 |
return; |
|
1931 |
|||
1932 |
829 |
X509_VERIFY_PARAM_free(ctx->param); |
|
1933 |
|||
1934 |
/* |
||
1935 |
* Free internal session cache. However: the remove_cb() may reference |
||
1936 |
* the ex_data of SSL_CTX, thus the ex_data store can only be removed |
||
1937 |
* after the sessions were flushed. |
||
1938 |
* As the ex_data handling routines might also touch the session cache, |
||
1939 |
* the most secure solution seems to be: empty (flush) the cache, then |
||
1940 |
* free ex_data, then finally free the cache. |
||
1941 |
* (See ticket [openssl.org #212].) |
||
1942 |
*/ |
||
1943 |
✓✗ | 829 |
if (ctx->internal->sessions != NULL) |
1944 |
829 |
SSL_CTX_flush_sessions(ctx, 0); |
|
1945 |
|||
1946 |
829 |
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ctx, &ctx->internal->ex_data); |
|
1947 |
|||
1948 |
829 |
lh_SSL_SESSION_free(ctx->internal->sessions); |
|
1949 |
|||
1950 |
829 |
X509_STORE_free(ctx->cert_store); |
|
1951 |
829 |
sk_SSL_CIPHER_free(ctx->cipher_list); |
|
1952 |
829 |
sk_SSL_CIPHER_free(ctx->internal->cipher_list_by_id); |
|
1953 |
829 |
ssl_cert_free(ctx->internal->cert); |
|
1954 |
829 |
sk_X509_NAME_pop_free(ctx->internal->client_CA, X509_NAME_free); |
|
1955 |
829 |
sk_X509_pop_free(ctx->extra_certs, X509_free); |
|
1956 |
|||
1957 |
#ifndef OPENSSL_NO_SRTP |
||
1958 |
✗✓ | 829 |
if (ctx->internal->srtp_profiles) |
1959 |
sk_SRTP_PROTECTION_PROFILE_free(ctx->internal->srtp_profiles); |
||
1960 |
#endif |
||
1961 |
|||
1962 |
#ifndef OPENSSL_NO_ENGINE |
||
1963 |
✗✓ | 829 |
if (ctx->internal->client_cert_engine) |
1964 |
ENGINE_finish(ctx->internal->client_cert_engine); |
||
1965 |
#endif |
||
1966 |
|||
1967 |
829 |
free(ctx->internal->tlsext_ecpointformatlist); |
|
1968 |
829 |
free(ctx->internal->tlsext_supportedgroups); |
|
1969 |
|||
1970 |
829 |
free(ctx->internal->alpn_client_proto_list); |
|
1971 |
|||
1972 |
829 |
free(ctx->internal); |
|
1973 |
829 |
free(ctx); |
|
1974 |
5060 |
} |
|
1975 |
|||
1976 |
void |
||
1977 |
SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb) |
||
1978 |
{ |
||
1979 |
ctx->default_passwd_callback = cb; |
||
1980 |
} |
||
1981 |
|||
1982 |
void |
||
1983 |
SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) |
||
1984 |
{ |
||
1985 |
ctx->default_passwd_callback_userdata = u; |
||
1986 |
} |
||
1987 |
|||
1988 |
void |
||
1989 |
SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *, |
||
1990 |
void *), void *arg) |
||
1991 |
{ |
||
1992 |
144 |
ctx->internal->app_verify_callback = cb; |
|
1993 |
72 |
ctx->internal->app_verify_arg = arg; |
|
1994 |
72 |
} |
|
1995 |
|||
1996 |
void |
||
1997 |
SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int (*cb)(int, X509_STORE_CTX *)) |
||
1998 |
{ |
||
1999 |
372 |
ctx->verify_mode = mode; |
|
2000 |
186 |
ctx->internal->default_verify_callback = cb; |
|
2001 |
186 |
} |
|
2002 |
|||
2003 |
void |
||
2004 |
SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) |
||
2005 |
{ |
||
2006 |
32 |
X509_VERIFY_PARAM_set_depth(ctx->param, depth); |
|
2007 |
16 |
} |
|
2008 |
|||
2009 |
void |
||
2010 |
ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) |
||
2011 |
{ |
||
2012 |
int rsa_enc, rsa_sign, dh_tmp; |
||
2013 |
int have_ecc_cert; |
||
2014 |
unsigned long mask_k, mask_a; |
||
2015 |
X509 *x = NULL; |
||
2016 |
CERT_PKEY *cpk; |
||
2017 |
|||
2018 |
✗✓ | 1088 |
if (c == NULL) |
2019 |
return; |
||
2020 |
|||
2021 |
✓✓✓✗ |
1248 |
dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL || |
2022 |
80 |
c->dh_tmp_auto != 0); |
|
2023 |
|||
2024 |
544 |
cpk = &(c->pkeys[SSL_PKEY_RSA_ENC]); |
|
2025 |
✓✗ | 1632 |
rsa_enc = (cpk->x509 != NULL && cpk->privatekey != NULL); |
2026 |
544 |
cpk = &(c->pkeys[SSL_PKEY_RSA_SIGN]); |
|
2027 |
✗✓ | 1088 |
rsa_sign = (cpk->x509 != NULL && cpk->privatekey != NULL); |
2028 |
544 |
cpk = &(c->pkeys[SSL_PKEY_ECC]); |
|
2029 |
✗✓ | 1088 |
have_ecc_cert = (cpk->x509 != NULL && cpk->privatekey != NULL); |
2030 |
|||
2031 |
mask_k = 0; |
||
2032 |
mask_a = 0; |
||
2033 |
|||
2034 |
544 |
cpk = &(c->pkeys[SSL_PKEY_GOST01]); |
|
2035 |
✗✓✗✗ |
544 |
if (cpk->x509 != NULL && cpk->privatekey !=NULL) { |
2036 |
mask_k |= SSL_kGOST; |
||
2037 |
mask_a |= SSL_aGOST01; |
||
2038 |
} |
||
2039 |
|||
2040 |
✓✗ | 544 |
if (rsa_enc) |
2041 |
544 |
mask_k |= SSL_kRSA; |
|
2042 |
|||
2043 |
✓✓ | 544 |
if (dh_tmp) |
2044 |
488 |
mask_k |= SSL_kDHE; |
|
2045 |
|||
2046 |
✓✗ | 544 |
if (rsa_enc || rsa_sign) |
2047 |
544 |
mask_a |= SSL_aRSA; |
|
2048 |
|||
2049 |
544 |
mask_a |= SSL_aNULL; |
|
2050 |
|||
2051 |
/* |
||
2052 |
* An ECC certificate may be usable for ECDH and/or |
||
2053 |
* ECDSA cipher suites depending on the key usage extension. |
||
2054 |
*/ |
||
2055 |
✗✓ | 544 |
if (have_ecc_cert) { |
2056 |
x = (c->pkeys[SSL_PKEY_ECC]).x509; |
||
2057 |
|||
2058 |
/* This call populates extension flags (ex_flags). */ |
||
2059 |
X509_check_purpose(x, -1, 0); |
||
2060 |
|||
2061 |
/* Key usage, if present, must allow signing. */ |
||
2062 |
if ((x->ex_flags & EXFLAG_KUSAGE) == 0 || |
||
2063 |
(x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE)) |
||
2064 |
mask_a |= SSL_aECDSA; |
||
2065 |
} |
||
2066 |
|||
2067 |
544 |
mask_k |= SSL_kECDHE; |
|
2068 |
|||
2069 |
544 |
c->mask_k = mask_k; |
|
2070 |
544 |
c->mask_a = mask_a; |
|
2071 |
544 |
c->valid = 1; |
|
2072 |
1088 |
} |
|
2073 |
|||
2074 |
/* See if this handshake is using an ECC cipher suite. */ |
||
2075 |
int |
||
2076 |
ssl_using_ecc_cipher(SSL *s) |
||
2077 |
{ |
||
2078 |
unsigned long alg_a, alg_k; |
||
2079 |
|||
2080 |
448 |
alg_a = S3I(s)->hs.new_cipher->algorithm_auth; |
|
2081 |
224 |
alg_k = S3I(s)->hs.new_cipher->algorithm_mkey; |
|
2082 |
|||
2083 |
✓✓ | 448 |
return SSI(s)->tlsext_ecpointformatlist != NULL && |
2084 |
✓✗ | 344 |
SSI(s)->tlsext_ecpointformatlist_length > 0 && |
2085 |
✗✓ | 120 |
((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA)); |
2086 |
} |
||
2087 |
|||
2088 |
int |
||
2089 |
ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s) |
||
2090 |
{ |
||
2091 |
const SSL_CIPHER *cs = S3I(s)->hs.new_cipher; |
||
2092 |
unsigned long alg_a; |
||
2093 |
|||
2094 |
alg_a = cs->algorithm_auth; |
||
2095 |
|||
2096 |
if (alg_a & SSL_aECDSA) { |
||
2097 |
/* This call populates extension flags (ex_flags). */ |
||
2098 |
X509_check_purpose(x, -1, 0); |
||
2099 |
|||
2100 |
/* Key usage, if present, must allow signing. */ |
||
2101 |
if ((x->ex_flags & EXFLAG_KUSAGE) && |
||
2102 |
((x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE) == 0)) { |
||
2103 |
SSLerror(s, SSL_R_ECC_CERT_NOT_FOR_SIGNING); |
||
2104 |
return (0); |
||
2105 |
} |
||
2106 |
} |
||
2107 |
|||
2108 |
return (1); |
||
2109 |
} |
||
2110 |
|||
2111 |
CERT_PKEY * |
||
2112 |
ssl_get_server_send_pkey(const SSL *s) |
||
2113 |
{ |
||
2114 |
unsigned long alg_a; |
||
2115 |
CERT *c; |
||
2116 |
int i; |
||
2117 |
|||
2118 |
496 |
c = s->cert; |
|
2119 |
248 |
ssl_set_cert_masks(c, S3I(s)->hs.new_cipher); |
|
2120 |
|||
2121 |
248 |
alg_a = S3I(s)->hs.new_cipher->algorithm_auth; |
|
2122 |
|||
2123 |
✗✓ | 248 |
if (alg_a & SSL_aECDSA) { |
2124 |
i = SSL_PKEY_ECC; |
||
2125 |
✓✗ | 248 |
} else if (alg_a & SSL_aRSA) { |
2126 |
✗✓ | 248 |
if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL) |
2127 |
i = SSL_PKEY_RSA_SIGN; |
||
2128 |
else |
||
2129 |
i = SSL_PKEY_RSA_ENC; |
||
2130 |
} else if (alg_a & SSL_aGOST01) { |
||
2131 |
i = SSL_PKEY_GOST01; |
||
2132 |
} else { /* if (alg_a & SSL_aNULL) */ |
||
2133 |
SSLerror(s, ERR_R_INTERNAL_ERROR); |
||
2134 |
return (NULL); |
||
2135 |
} |
||
2136 |
|||
2137 |
248 |
return (c->pkeys + i); |
|
2138 |
248 |
} |
|
2139 |
|||
2140 |
X509 * |
||
2141 |
ssl_get_server_send_cert(const SSL *s) |
||
2142 |
{ |
||
2143 |
CERT_PKEY *cpk; |
||
2144 |
|||
2145 |
448 |
cpk = ssl_get_server_send_pkey(s); |
|
2146 |
✗✓ | 224 |
if (!cpk) |
2147 |
return (NULL); |
||
2148 |
224 |
return (cpk->x509); |
|
2149 |
224 |
} |
|
2150 |
|||
2151 |
EVP_PKEY * |
||
2152 |
ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) |
||
2153 |
{ |
||
2154 |
unsigned long alg_a; |
||
2155 |
CERT *c; |
||
2156 |
int idx = -1; |
||
2157 |
|||
2158 |
328 |
alg_a = cipher->algorithm_auth; |
|
2159 |
164 |
c = s->cert; |
|
2160 |
|||
2161 |
✓✗ | 164 |
if (alg_a & SSL_aRSA) { |
2162 |
✗✓ | 164 |
if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL) |
2163 |
idx = SSL_PKEY_RSA_SIGN; |
||
2164 |
✓✗ | 164 |
else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL) |
2165 |
164 |
idx = SSL_PKEY_RSA_ENC; |
|
2166 |
} else if ((alg_a & SSL_aECDSA) && |
||
2167 |
(c->pkeys[SSL_PKEY_ECC].privatekey != NULL)) |
||
2168 |
idx = SSL_PKEY_ECC; |
||
2169 |
✗✓ | 164 |
if (idx == -1) { |
2170 |
SSLerror(s, ERR_R_INTERNAL_ERROR); |
||
2171 |
return (NULL); |
||
2172 |
} |
||
2173 |
✓✗ | 164 |
if (pmd) |
2174 |
164 |
*pmd = c->pkeys[idx].digest; |
|
2175 |
164 |
return (c->pkeys[idx].privatekey); |
|
2176 |
164 |
} |
|
2177 |
|||
2178 |
DH * |
||
2179 |
ssl_get_auto_dh(SSL *s) |
||
2180 |
{ |
||
2181 |
CERT_PKEY *cpk; |
||
2182 |
int keylen; |
||
2183 |
DH *dhp; |
||
2184 |
|||
2185 |
✗✓ | 16 |
if (s->cert->dh_tmp_auto == 2) { |
2186 |
keylen = 1024; |
||
2187 |
✗✓ | 8 |
} else if (S3I(s)->hs.new_cipher->algorithm_auth & SSL_aNULL) { |
2188 |
keylen = 1024; |
||
2189 |
if (S3I(s)->hs.new_cipher->strength_bits == 256) |
||
2190 |
keylen = 3072; |
||
2191 |
} else { |
||
2192 |
✗✓ | 8 |
if ((cpk = ssl_get_server_send_pkey(s)) == NULL) |
2193 |
return (NULL); |
||
2194 |
✓✗✗✓ |
16 |
if (cpk->privatekey == NULL || cpk->privatekey->pkey.dh == NULL) |
2195 |
return (NULL); |
||
2196 |
8 |
keylen = EVP_PKEY_bits(cpk->privatekey); |
|
2197 |
} |
||
2198 |
|||
2199 |
✗✓ | 8 |
if ((dhp = DH_new()) == NULL) |
2200 |
return (NULL); |
||
2201 |
|||
2202 |
8 |
dhp->g = BN_new(); |
|
2203 |
✓✗ | 8 |
if (dhp->g != NULL) |
2204 |
8 |
BN_set_word(dhp->g, 2); |
|
2205 |
|||
2206 |
✗✓ | 8 |
if (keylen >= 8192) |
2207 |
dhp->p = get_rfc3526_prime_8192(NULL); |
||
2208 |
✗✓ | 8 |
else if (keylen >= 4096) |
2209 |
dhp->p = get_rfc3526_prime_4096(NULL); |
||
2210 |
✗✓ | 8 |
else if (keylen >= 3072) |
2211 |
dhp->p = get_rfc3526_prime_3072(NULL); |
||
2212 |
✓✗ | 8 |
else if (keylen >= 2048) |
2213 |
8 |
dhp->p = get_rfc3526_prime_2048(NULL); |
|
2214 |
else if (keylen >= 1536) |
||
2215 |
dhp->p = get_rfc3526_prime_1536(NULL); |
||
2216 |
else |
||
2217 |
dhp->p = get_rfc2409_prime_1024(NULL); |
||
2218 |
|||
2219 |
✓✗✗✓ |
16 |
if (dhp->p == NULL || dhp->g == NULL) { |
2220 |
DH_free(dhp); |
||
2221 |
return (NULL); |
||
2222 |
} |
||
2223 |
8 |
return (dhp); |
|
2224 |
8 |
} |
|
2225 |
|||
2226 |
void |
||
2227 |
ssl_update_cache(SSL *s, int mode) |
||
2228 |
{ |
||
2229 |
int i; |
||
2230 |
|||
2231 |
/* |
||
2232 |
* If the session_id_length is 0, we are not supposed to cache it, |
||
2233 |
* and it would be rather hard to do anyway :-) |
||
2234 |
*/ |
||
2235 |
✓✓ | 16866 |
if (s->session->session_id_length == 0) |
2236 |
272 |
return; |
|
2237 |
|||
2238 |
8161 |
i = s->session_ctx->internal->session_cache_mode; |
|
2239 |
✗✓✗✗ ✗✗ |
8161 |
if ((i & mode) && (!s->internal->hit) && ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) |
2240 |
|| SSL_CTX_add_session(s->session_ctx, s->session)) |
||
2241 |
&& (s->session_ctx->internal->new_session_cb != NULL)) { |
||
2242 |
CRYPTO_add(&s->session->references, 1, CRYPTO_LOCK_SSL_SESSION); |
||
2243 |
if (!s->session_ctx->internal->new_session_cb(s, s->session)) |
||
2244 |
SSL_SESSION_free(s->session); |
||
2245 |
} |
||
2246 |
|||
2247 |
/* auto flush every 255 connections */ |
||
2248 |
✓✗✗✓ |
16322 |
if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && |
2249 |
8161 |
((i & mode) == mode)) { |
|
2250 |
if ((((mode & SSL_SESS_CACHE_CLIENT) ? |
||
2251 |
s->session_ctx->internal->stats.sess_connect_good : |
||
2252 |
s->session_ctx->internal->stats.sess_accept_good) & 0xff) == 0xff) { |
||
2253 |
SSL_CTX_flush_sessions(s->session_ctx, time(NULL)); |
||
2254 |
} |
||
2255 |
} |
||
2256 |
16594 |
} |
|
2257 |
|||
2258 |
const SSL_METHOD * |
||
2259 |
SSL_get_ssl_method(SSL *s) |
||
2260 |
{ |
||
2261 |
return (s->method); |
||
2262 |
} |
||
2263 |
|||
2264 |
int |
||
2265 |
SSL_set_ssl_method(SSL *s, const SSL_METHOD *meth) |
||
2266 |
{ |
||
2267 |
int conn = -1; |
||
2268 |
int ret = 1; |
||
2269 |
|||
2270 |
✓✗ | 72 |
if (s->method != meth) { |
2271 |
✓✗ | 36 |
if (s->internal->handshake_func != NULL) |
2272 |
36 |
conn = (s->internal->handshake_func == s->method->internal->ssl_connect); |
|
2273 |
|||
2274 |
✓✗ | 36 |
if (s->method->internal->version == meth->internal->version) |
2275 |
36 |
s->method = meth; |
|
2276 |
else { |
||
2277 |
s->method->internal->ssl_free(s); |
||
2278 |
s->method = meth; |
||
2279 |
ret = s->method->internal->ssl_new(s); |
||
2280 |
} |
||
2281 |
|||
2282 |
✓✗ | 36 |
if (conn == 1) |
2283 |
36 |
s->internal->handshake_func = meth->internal->ssl_connect; |
|
2284 |
else if (conn == 0) |
||
2285 |
s->internal->handshake_func = meth->internal->ssl_accept; |
||
2286 |
} |
||
2287 |
36 |
return (ret); |
|
2288 |
} |
||
2289 |
|||
2290 |
int |
||
2291 |
SSL_get_error(const SSL *s, int i) |
||
2292 |
{ |
||
2293 |
int reason; |
||
2294 |
unsigned long l; |
||
2295 |
BIO *bio; |
||
2296 |
|||
2297 |
✓✓ | 25220 |
if (i > 0) |
2298 |
960 |
return (SSL_ERROR_NONE); |
|
2299 |
|||
2300 |
/* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake |
||
2301 |
* etc, where we do encode the error */ |
||
2302 |
✗✓ | 11650 |
if ((l = ERR_peek_error()) != 0) { |
2303 |
if (ERR_GET_LIB(l) == ERR_LIB_SYS) |
||
2304 |
return (SSL_ERROR_SYSCALL); |
||
2305 |
else |
||
2306 |
return (SSL_ERROR_SSL); |
||
2307 |
} |
||
2308 |
|||
2309 |
✓✓✓✓ |
23298 |
if ((i < 0) && SSL_want_read(s)) { |
2310 |
9400 |
bio = SSL_get_rbio(s); |
|
2311 |
✓✗ | 9400 |
if (BIO_should_read(bio)) { |
2312 |
9400 |
return (SSL_ERROR_WANT_READ); |
|
2313 |
} else if (BIO_should_write(bio)) { |
||
2314 |
/* |
||
2315 |
* This one doesn't make too much sense... We never |
||
2316 |
* try to write to the rbio, and an application |
||
2317 |
* program where rbio and wbio are separate couldn't |
||
2318 |
* even know what it should wait for. However if we |
||
2319 |
* ever set s->internal->rwstate incorrectly (so that we have |
||
2320 |
* SSL_want_read(s) instead of SSL_want_write(s)) |
||
2321 |
* and rbio and wbio *are* the same, this test works |
||
2322 |
* around that bug; so it might be safer to keep it. |
||
2323 |
*/ |
||
2324 |
return (SSL_ERROR_WANT_WRITE); |
||
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); /* unknown */ |
||
2333 |
} |
||
2334 |
} |
||
2335 |
|||
2336 |
✓✓✓✗ |
4498 |
if ((i < 0) && SSL_want_write(s)) { |
2337 |
2248 |
bio = SSL_get_wbio(s); |
|
2338 |
✓✗ | 2248 |
if (BIO_should_write(bio)) { |
2339 |
2248 |
return (SSL_ERROR_WANT_WRITE); |
|
2340 |
} else if (BIO_should_read(bio)) { |
||
2341 |
/* |
||
2342 |
* See above (SSL_want_read(s) with |
||
2343 |
* BIO_should_write(bio)) |
||
2344 |
*/ |
||
2345 |
return (SSL_ERROR_WANT_READ); |
||
2346 |
} else if (BIO_should_io_special(bio)) { |
||
2347 |
reason = BIO_get_retry_reason(bio); |
||
2348 |
if (reason == BIO_RR_CONNECT) |
||
2349 |
return (SSL_ERROR_WANT_CONNECT); |
||
2350 |
else if (reason == BIO_RR_ACCEPT) |
||
2351 |
return (SSL_ERROR_WANT_ACCEPT); |
||
2352 |
else |
||
2353 |
return (SSL_ERROR_SYSCALL); |
||
2354 |
} |
||
2355 |
} |
||
2356 |
✗✓✗✗ |
2 |
if ((i < 0) && SSL_want_x509_lookup(s)) { |
2357 |
return (SSL_ERROR_WANT_X509_LOOKUP); |
||
2358 |
} |
||
2359 |
|||
2360 |
✓✗ | 2 |
if (i == 0) { |
2361 |
✗✓✗✗ |
2 |
if ((s->internal->shutdown & SSL_RECEIVED_SHUTDOWN) && |
2362 |
(S3I(s)->warn_alert == SSL_AD_CLOSE_NOTIFY)) |
||
2363 |
return (SSL_ERROR_ZERO_RETURN); |
||
2364 |
} |
||
2365 |
2 |
return (SSL_ERROR_SYSCALL); |
|
2366 |
12610 |
} |
|
2367 |
|||
2368 |
int |
||
2369 |
SSL_do_handshake(SSL *s) |
||
2370 |
{ |
||
2371 |
int ret = 1; |
||
2372 |
|||
2373 |
if (s->internal->handshake_func == NULL) { |
||
2374 |
SSLerror(s, SSL_R_CONNECTION_TYPE_NOT_SET); |
||
2375 |
return (-1); |
||
2376 |
} |
||
2377 |
|||
2378 |
s->method->internal->ssl_renegotiate_check(s); |
||
2379 |
|||
2380 |
if (SSL_in_init(s) || SSL_in_before(s)) { |
||
2381 |
ret = s->internal->handshake_func(s); |
||
2382 |
} |
||
2383 |
return (ret); |
||
2384 |
} |
||
2385 |
|||
2386 |
/* |
||
2387 |
* For the next 2 functions, SSL_clear() sets shutdown and so |
||
2388 |
* one of these calls will reset it |
||
2389 |
*/ |
||
2390 |
void |
||
2391 |
SSL_set_accept_state(SSL *s) |
||
2392 |
{ |
||
2393 |
528 |
s->server = 1; |
|
2394 |
264 |
s->internal->shutdown = 0; |
|
2395 |
264 |
S3I(s)->hs.state = SSL_ST_ACCEPT|SSL_ST_BEFORE; |
|
2396 |
264 |
s->internal->handshake_func = s->method->internal->ssl_accept; |
|
2397 |
/* clear the current cipher */ |
||
2398 |
264 |
ssl_clear_cipher_ctx(s); |
|
2399 |
264 |
ssl_clear_hash_ctx(&s->read_hash); |
|
2400 |
264 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
2401 |
264 |
} |
|
2402 |
|||
2403 |
void |
||
2404 |
SSL_set_connect_state(SSL *s) |
||
2405 |
{ |
||
2406 |
16442 |
s->server = 0; |
|
2407 |
8221 |
s->internal->shutdown = 0; |
|
2408 |
8221 |
S3I(s)->hs.state = SSL_ST_CONNECT|SSL_ST_BEFORE; |
|
2409 |
8221 |
s->internal->handshake_func = s->method->internal->ssl_connect; |
|
2410 |
/* clear the current cipher */ |
||
2411 |
8221 |
ssl_clear_cipher_ctx(s); |
|
2412 |
8221 |
ssl_clear_hash_ctx(&s->read_hash); |
|
2413 |
8221 |
ssl_clear_hash_ctx(&s->internal->write_hash); |
|
2414 |
8221 |
} |
|
2415 |
|||
2416 |
int |
||
2417 |
ssl_undefined_function(SSL *s) |
||
2418 |
{ |
||
2419 |
SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
||
2420 |
return (0); |
||
2421 |
} |
||
2422 |
|||
2423 |
int |
||
2424 |
ssl_undefined_void_function(void) |
||
2425 |
{ |
||
2426 |
SSLerrorx(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
||
2427 |
return (0); |
||
2428 |
} |
||
2429 |
|||
2430 |
int |
||
2431 |
ssl_undefined_const_function(const SSL *s) |
||
2432 |
{ |
||
2433 |
SSLerror(s, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
||
2434 |
return (0); |
||
2435 |
} |
||
2436 |
|||
2437 |
const char * |
||
2438 |
ssl_version_string(int ver) |
||
2439 |
{ |
||
2440 |
✓✓✗✓ ✗ |
556 |
switch (ver) { |
2441 |
case DTLS1_VERSION: |
||
2442 |
48 |
return (SSL_TXT_DTLS1); |
|
2443 |
case TLS1_VERSION: |
||
2444 |
72 |
return (SSL_TXT_TLSV1); |
|
2445 |
case TLS1_1_VERSION: |
||
2446 |
return (SSL_TXT_TLSV1_1); |
||
2447 |
case TLS1_2_VERSION: |
||
2448 |
158 |
return (SSL_TXT_TLSV1_2); |
|
2449 |
default: |
||
2450 |
return ("unknown"); |
||
2451 |
} |
||
2452 |
278 |
} |
|
2453 |
|||
2454 |
const char * |
||
2455 |
SSL_get_version(const SSL *s) |
||
2456 |
{ |
||
2457 |
544 |
return ssl_version_string(s->version); |
|
2458 |
} |
||
2459 |
|||
2460 |
SSL * |
||
2461 |
SSL_dup(SSL *s) |
||
2462 |
{ |
||
2463 |
STACK_OF(X509_NAME) *sk; |
||
2464 |
X509_NAME *xn; |
||
2465 |
SSL *ret; |
||
2466 |
int i; |
||
2467 |
|||
2468 |
if ((ret = SSL_new(SSL_get_SSL_CTX(s))) == NULL) |
||
2469 |
return (NULL); |
||
2470 |
|||
2471 |
ret->version = s->version; |
||
2472 |
ret->internal->type = s->internal->type; |
||
2473 |
ret->method = s->method; |
||
2474 |
|||
2475 |
if (s->session != NULL) { |
||
2476 |
/* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */ |
||
2477 |
SSL_copy_session_id(ret, s); |
||
2478 |
} else { |
||
2479 |
/* |
||
2480 |
* No session has been established yet, so we have to expect |
||
2481 |
* that s->cert or ret->cert will be changed later -- |
||
2482 |
* they should not both point to the same object, |
||
2483 |
* and thus we can't use SSL_copy_session_id. |
||
2484 |
*/ |
||
2485 |
|||
2486 |
ret->method->internal->ssl_free(ret); |
||
2487 |
ret->method = s->method; |
||
2488 |
ret->method->internal->ssl_new(ret); |
||
2489 |
|||
2490 |
if (s->cert != NULL) { |
||
2491 |
ssl_cert_free(ret->cert); |
||
2492 |
ret->cert = ssl_cert_dup(s->cert); |
||
2493 |
if (ret->cert == NULL) |
||
2494 |
goto err; |
||
2495 |
} |
||
2496 |
|||
2497 |
SSL_set_session_id_context(ret, |
||
2498 |
s->sid_ctx, s->sid_ctx_length); |
||
2499 |
} |
||
2500 |
|||
2501 |
ret->internal->options = s->internal->options; |
||
2502 |
ret->internal->mode = s->internal->mode; |
||
2503 |
SSL_set_max_cert_list(ret, SSL_get_max_cert_list(s)); |
||
2504 |
SSL_set_read_ahead(ret, SSL_get_read_ahead(s)); |
||
2505 |
ret->internal->msg_callback = s->internal->msg_callback; |
||
2506 |
ret->internal->msg_callback_arg = s->internal->msg_callback_arg; |
||
2507 |
SSL_set_verify(ret, SSL_get_verify_mode(s), |
||
2508 |
SSL_get_verify_callback(s)); |
||
2509 |
SSL_set_verify_depth(ret, SSL_get_verify_depth(s)); |
||
2510 |
ret->internal->generate_session_id = s->internal->generate_session_id; |
||
2511 |
|||
2512 |
SSL_set_info_callback(ret, SSL_get_info_callback(s)); |
||
2513 |
|||
2514 |
ret->internal->debug = s->internal->debug; |
||
2515 |
|||
2516 |
/* copy app data, a little dangerous perhaps */ |
||
2517 |
if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, |
||
2518 |
&ret->internal->ex_data, &s->internal->ex_data)) |
||
2519 |
goto err; |
||
2520 |
|||
2521 |
/* setup rbio, and wbio */ |
||
2522 |
if (s->rbio != NULL) { |
||
2523 |
if (!BIO_dup_state(s->rbio,(char *)&ret->rbio)) |
||
2524 |
goto err; |
||
2525 |
} |
||
2526 |
if (s->wbio != NULL) { |
||
2527 |
if (s->wbio != s->rbio) { |
||
2528 |
if (!BIO_dup_state(s->wbio,(char *)&ret->wbio)) |
||
2529 |
goto err; |
||
2530 |
} else |
||
2531 |
ret->wbio = ret->rbio; |
||
2532 |
} |
||
2533 |
ret->internal->rwstate = s->internal->rwstate; |
||
2534 |
ret->internal->in_handshake = s->internal->in_handshake; |
||
2535 |
ret->internal->handshake_func = s->internal->handshake_func; |
||
2536 |
ret->server = s->server; |
||
2537 |
ret->internal->renegotiate = s->internal->renegotiate; |
||
2538 |
ret->internal->new_session = s->internal->new_session; |
||
2539 |
ret->internal->quiet_shutdown = s->internal->quiet_shutdown; |
||
2540 |
ret->internal->shutdown = s->internal->shutdown; |
||
2541 |
/* SSL_dup does not really work at any state, though */ |
||
2542 |
S3I(ret)->hs.state = S3I(s)->hs.state; |
||
2543 |
ret->internal->rstate = s->internal->rstate; |
||
2544 |
|||
2545 |
/* |
||
2546 |
* Would have to copy ret->init_buf, ret->init_msg, ret->init_num, |
||
2547 |
* ret->init_off |
||
2548 |
*/ |
||
2549 |
ret->internal->init_num = 0; |
||
2550 |
|||
2551 |
ret->internal->hit = s->internal->hit; |
||
2552 |
|||
2553 |
X509_VERIFY_PARAM_inherit(ret->param, s->param); |
||
2554 |
|||
2555 |
/* dup the cipher_list and cipher_list_by_id stacks */ |
||
2556 |
if (s->cipher_list != NULL) { |
||
2557 |
if ((ret->cipher_list = |
||
2558 |
sk_SSL_CIPHER_dup(s->cipher_list)) == NULL) |
||
2559 |
goto err; |
||
2560 |
} |
||
2561 |
if (s->internal->cipher_list_by_id != NULL) { |
||
2562 |
if ((ret->internal->cipher_list_by_id = |
||
2563 |
sk_SSL_CIPHER_dup(s->internal->cipher_list_by_id)) == NULL) |
||
2564 |
goto err; |
||
2565 |
} |
||
2566 |
|||
2567 |
/* Dup the client_CA list */ |
||
2568 |
if (s->internal->client_CA != NULL) { |
||
2569 |
if ((sk = sk_X509_NAME_dup(s->internal->client_CA)) == NULL) goto err; |
||
2570 |
ret->internal->client_CA = sk; |
||
2571 |
for (i = 0; i < sk_X509_NAME_num(sk); i++) { |
||
2572 |
xn = sk_X509_NAME_value(sk, i); |
||
2573 |
if (sk_X509_NAME_set(sk, i, |
||
2574 |
X509_NAME_dup(xn)) == NULL) { |
||
2575 |
X509_NAME_free(xn); |
||
2576 |
goto err; |
||
2577 |
} |
||
2578 |
} |
||
2579 |
} |
||
2580 |
|||
2581 |
if (0) { |
||
2582 |
err: |
||
2583 |
if (ret != NULL) |
||
2584 |
SSL_free(ret); |
||
2585 |
ret = NULL; |
||
2586 |
} |
||
2587 |
return (ret); |
||
2588 |
} |
||
2589 |
|||
2590 |
void |
||
2591 |
ssl_clear_cipher_ctx(SSL *s) |
||
2592 |
{ |
||
2593 |
40166 |
EVP_CIPHER_CTX_free(s->enc_read_ctx); |
|
2594 |
20083 |
s->enc_read_ctx = NULL; |
|
2595 |
20083 |
EVP_CIPHER_CTX_free(s->internal->enc_write_ctx); |
|
2596 |
20083 |
s->internal->enc_write_ctx = NULL; |
|
2597 |
|||
2598 |
✓✓ | 20083 |
if (s->internal->aead_read_ctx != NULL) { |
2599 |
8105 |
EVP_AEAD_CTX_cleanup(&s->internal->aead_read_ctx->ctx); |
|
2600 |
8105 |
free(s->internal->aead_read_ctx); |
|
2601 |
8105 |
s->internal->aead_read_ctx = NULL; |
|
2602 |
8105 |
} |
|
2603 |
✓✓ | 20083 |
if (s->internal->aead_write_ctx != NULL) { |
2604 |
8105 |
EVP_AEAD_CTX_cleanup(&s->internal->aead_write_ctx->ctx); |
|
2605 |
8105 |
free(s->internal->aead_write_ctx); |
|
2606 |
8105 |
s->internal->aead_write_ctx = NULL; |
|
2607 |
8105 |
} |
|
2608 |
|||
2609 |
20083 |
} |
|
2610 |
|||
2611 |
/* Fix this function so that it takes an optional type parameter */ |
||
2612 |
X509 * |
||
2613 |
SSL_get_certificate(const SSL *s) |
||
2614 |
{ |
||
2615 |
if (s->cert != NULL) |
||
2616 |
return (s->cert->key->x509); |
||
2617 |
else |
||
2618 |
return (NULL); |
||
2619 |
} |
||
2620 |
|||
2621 |
/* Fix this function so that it takes an optional type parameter */ |
||
2622 |
EVP_PKEY * |
||
2623 |
SSL_get_privatekey(SSL *s) |
||
2624 |
{ |
||
2625 |
if (s->cert != NULL) |
||
2626 |
return (s->cert->key->privatekey); |
||
2627 |
else |
||
2628 |
return (NULL); |
||
2629 |
} |
||
2630 |
|||
2631 |
const SSL_CIPHER * |
||
2632 |
SSL_get_current_cipher(const SSL *s) |
||
2633 |
{ |
||
2634 |
✓✗✓✗ |
828 |
if ((s->session != NULL) && (s->session->cipher != NULL)) |
2635 |
276 |
return (s->session->cipher); |
|
2636 |
return (NULL); |
||
2637 |
276 |
} |
|
2638 |
const void * |
||
2639 |
SSL_get_current_compression(SSL *s) |
||
2640 |
{ |
||
2641 |
return (NULL); |
||
2642 |
} |
||
2643 |
|||
2644 |
const void * |
||
2645 |
SSL_get_current_expansion(SSL *s) |
||
2646 |
{ |
||
2647 |
return (NULL); |
||
2648 |
} |
||
2649 |
|||
2650 |
int |
||
2651 |
ssl_init_wbio_buffer(SSL *s, int push) |
||
2652 |
{ |
||
2653 |
BIO *bbio; |
||
2654 |
|||
2655 |
✓✗ | 16970 |
if (s->bbio == NULL) { |
2656 |
8485 |
bbio = BIO_new(BIO_f_buffer()); |
|
2657 |
✗✓ | 8485 |
if (bbio == NULL) |
2658 |
return (0); |
||
2659 |
8485 |
s->bbio = bbio; |
|
2660 |
8485 |
} else { |
|
2661 |
bbio = s->bbio; |
||
2662 |
if (s->bbio == s->wbio) |
||
2663 |
s->wbio = BIO_pop(s->wbio); |
||
2664 |
} |
||
2665 |
8485 |
(void)BIO_reset(bbio); |
|
2666 |
/* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ |
||
2667 |
✗✓ | 8485 |
if (!BIO_set_read_buffer_size(bbio, 1)) { |
2668 |
SSLerror(s, ERR_R_BUF_LIB); |
||
2669 |
return (0); |
||
2670 |
} |
||
2671 |
✓✓ | 8485 |
if (push) { |
2672 |
✓✗ | 264 |
if (s->wbio != bbio) |
2673 |
264 |
s->wbio = BIO_push(bbio, s->wbio); |
|
2674 |
} else { |
||
2675 |
✗✓ | 8221 |
if (s->wbio == bbio) |
2676 |
s->wbio = BIO_pop(bbio); |
||
2677 |
} |
||
2678 |
8485 |
return (1); |
|
2679 |
8485 |
} |
|
2680 |
|||
2681 |
void |
||
2682 |
ssl_free_wbio_buffer(SSL *s) |
||
2683 |
{ |
||
2684 |
✓✗ | 43196 |
if (s == NULL) |
2685 |
return; |
||
2686 |
|||
2687 |
✓✓ | 21598 |
if (s->bbio == NULL) |
2688 |
return; |
||
2689 |
|||
2690 |
✓✗ | 8433 |
if (s->bbio == s->wbio) { |
2691 |
/* remove buffering */ |
||
2692 |
8433 |
s->wbio = BIO_pop(s->wbio); |
|
2693 |
8433 |
} |
|
2694 |
8433 |
BIO_free(s->bbio); |
|
2695 |
8433 |
s->bbio = NULL; |
|
2696 |
30031 |
} |
|
2697 |
|||
2698 |
void |
||
2699 |
SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode) |
||
2700 |
{ |
||
2701 |
4 |
ctx->internal->quiet_shutdown = mode; |
|
2702 |
2 |
} |
|
2703 |
|||
2704 |
int |
||
2705 |
SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx) |
||
2706 |
{ |
||
2707 |
return (ctx->internal->quiet_shutdown); |
||
2708 |
} |
||
2709 |
|||
2710 |
void |
||
2711 |
SSL_set_quiet_shutdown(SSL *s, int mode) |
||
2712 |
{ |
||
2713 |
s->internal->quiet_shutdown = mode; |
||
2714 |
} |
||
2715 |
|||
2716 |
int |
||
2717 |
SSL_get_quiet_shutdown(const SSL *s) |
||
2718 |
{ |
||
2719 |
return (s->internal->quiet_shutdown); |
||
2720 |
} |
||
2721 |
|||
2722 |
void |
||
2723 |
SSL_set_shutdown(SSL *s, int mode) |
||
2724 |
{ |
||
2725 |
s->internal->shutdown = mode; |
||
2726 |
} |
||
2727 |
|||
2728 |
int |
||
2729 |
SSL_get_shutdown(const SSL *s) |
||
2730 |
{ |
||
2731 |
return (s->internal->shutdown); |
||
2732 |
} |
||
2733 |
|||
2734 |
int |
||
2735 |
SSL_version(const SSL *s) |
||
2736 |
{ |
||
2737 |
1770 |
return (s->version); |
|
2738 |
} |
||
2739 |
|||
2740 |
SSL_CTX * |
||
2741 |
SSL_get_SSL_CTX(const SSL *ssl) |
||
2742 |
{ |
||
2743 |
return (ssl->ctx); |
||
2744 |
} |
||
2745 |
|||
2746 |
SSL_CTX * |
||
2747 |
SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx) |
||
2748 |
{ |
||
2749 |
CERT *ocert = ssl->cert; |
||
2750 |
|||
2751 |
if (ssl->ctx == ctx) |
||
2752 |
return (ssl->ctx); |
||
2753 |
if (ctx == NULL) |
||
2754 |
ctx = ssl->initial_ctx; |
||
2755 |
ssl->cert = ssl_cert_dup(ctx->internal->cert); |
||
2756 |
if (ocert != NULL) { |
||
2757 |
int i; |
||
2758 |
/* Copy negotiated digests from original certificate. */ |
||
2759 |
for (i = 0; i < SSL_PKEY_NUM; i++) |
||
2760 |
ssl->cert->pkeys[i].digest = ocert->pkeys[i].digest; |
||
2761 |
ssl_cert_free(ocert); |
||
2762 |
} |
||
2763 |
CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
||
2764 |
SSL_CTX_free(ssl->ctx); /* decrement reference count */ |
||
2765 |
ssl->ctx = ctx; |
||
2766 |
return (ssl->ctx); |
||
2767 |
} |
||
2768 |
|||
2769 |
int |
||
2770 |
SSL_CTX_set_default_verify_paths(SSL_CTX *ctx) |
||
2771 |
{ |
||
2772 |
168 |
return (X509_STORE_set_default_paths(ctx->cert_store)); |
|
2773 |
} |
||
2774 |
|||
2775 |
int |
||
2776 |
SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, |
||
2777 |
const char *CApath) |
||
2778 |
{ |
||
2779 |
708 |
return (X509_STORE_load_locations(ctx->cert_store, CAfile, CApath)); |
|
2780 |
} |
||
2781 |
|||
2782 |
int |
||
2783 |
SSL_CTX_load_verify_mem(SSL_CTX *ctx, void *buf, int len) |
||
2784 |
{ |
||
2785 |
32 |
return (X509_STORE_load_mem(ctx->cert_store, buf, len)); |
|
2786 |
} |
||
2787 |
|||
2788 |
void |
||
2789 |
SSL_set_info_callback(SSL *ssl, void (*cb)(const SSL *ssl, int type, int val)) |
||
2790 |
{ |
||
2791 |
ssl->internal->info_callback = cb; |
||
2792 |
} |
||
2793 |
|||
2794 |
void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl, int type, int val) |
||
2795 |
{ |
||
2796 |
return (ssl->internal->info_callback); |
||
2797 |
} |
||
2798 |
|||
2799 |
int |
||
2800 |
SSL_state(const SSL *ssl) |
||
2801 |
{ |
||
2802 |
269308 |
return (S3I(ssl)->hs.state); |
|
2803 |
} |
||
2804 |
|||
2805 |
void |
||
2806 |
SSL_set_state(SSL *ssl, int state) |
||
2807 |
{ |
||
2808 |
S3I(ssl)->hs.state = state; |
||
2809 |
} |
||
2810 |
|||
2811 |
void |
||
2812 |
SSL_set_verify_result(SSL *ssl, long arg) |
||
2813 |
{ |
||
2814 |
ssl->verify_result = arg; |
||
2815 |
} |
||
2816 |
|||
2817 |
long |
||
2818 |
SSL_get_verify_result(const SSL *ssl) |
||
2819 |
{ |
||
2820 |
return (ssl->verify_result); |
||
2821 |
} |
||
2822 |
|||
2823 |
int |
||
2824 |
SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
||
2825 |
CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
||
2826 |
{ |
||
2827 |
return (CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp, |
||
2828 |
new_func, dup_func, free_func)); |
||
2829 |
} |
||
2830 |
|||
2831 |
int |
||
2832 |
SSL_set_ex_data(SSL *s, int idx, void *arg) |
||
2833 |
{ |
||
2834 |
64 |
return (CRYPTO_set_ex_data(&s->internal->ex_data, idx, arg)); |
|
2835 |
} |
||
2836 |
|||
2837 |
void * |
||
2838 |
SSL_get_ex_data(const SSL *s, int idx) |
||
2839 |
{ |
||
2840 |
96 |
return (CRYPTO_get_ex_data(&s->internal->ex_data, idx)); |
|
2841 |
} |
||
2842 |
|||
2843 |
int |
||
2844 |
SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
||
2845 |
CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
||
2846 |
{ |
||
2847 |
return (CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp, |
||
2848 |
new_func, dup_func, free_func)); |
||
2849 |
} |
||
2850 |
|||
2851 |
int |
||
2852 |
SSL_CTX_set_ex_data(SSL_CTX *s, int idx, void *arg) |
||
2853 |
{ |
||
2854 |
return (CRYPTO_set_ex_data(&s->internal->ex_data, idx, arg)); |
||
2855 |
} |
||
2856 |
|||
2857 |
void * |
||
2858 |
SSL_CTX_get_ex_data(const SSL_CTX *s, int idx) |
||
2859 |
{ |
||
2860 |
return (CRYPTO_get_ex_data(&s->internal->ex_data, idx)); |
||
2861 |
} |
||
2862 |
|||
2863 |
int |
||
2864 |
ssl_ok(SSL *s) |
||
2865 |
{ |
||
2866 |
return (1); |
||
2867 |
} |
||
2868 |
|||
2869 |
X509_STORE * |
||
2870 |
SSL_CTX_get_cert_store(const SSL_CTX *ctx) |
||
2871 |
{ |
||
2872 |
212 |
return (ctx->cert_store); |
|
2873 |
} |
||
2874 |
|||
2875 |
void |
||
2876 |
SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store) |
||
2877 |
{ |
||
2878 |
X509_STORE_free(ctx->cert_store); |
||
2879 |
ctx->cert_store = store; |
||
2880 |
} |
||
2881 |
|||
2882 |
int |
||
2883 |
SSL_want(const SSL *s) |
||
2884 |
{ |
||
2885 |
27792 |
return (s->internal->rwstate); |
|
2886 |
} |
||
2887 |
|||
2888 |
void |
||
2889 |
SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, RSA *(*cb)(SSL *ssl, int is_export, |
||
2890 |
int keylength)) |
||
2891 |
{ |
||
2892 |
408 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb); |
|
2893 |
204 |
} |
|
2894 |
|||
2895 |
void |
||
2896 |
SSL_set_tmp_rsa_callback(SSL *ssl, RSA *(*cb)(SSL *ssl, int is_export, |
||
2897 |
int keylength)) |
||
2898 |
{ |
||
2899 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb); |
||
2900 |
} |
||
2901 |
|||
2902 |
void |
||
2903 |
SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, DH *(*dh)(SSL *ssl, int is_export, |
||
2904 |
int keylength)) |
||
2905 |
{ |
||
2906 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh); |
||
2907 |
} |
||
2908 |
|||
2909 |
void |
||
2910 |
SSL_set_tmp_dh_callback(SSL *ssl, DH *(*dh)(SSL *ssl, int is_export, |
||
2911 |
int keylength)) |
||
2912 |
{ |
||
2913 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh); |
||
2914 |
} |
||
2915 |
|||
2916 |
void |
||
2917 |
SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, EC_KEY *(*ecdh)(SSL *ssl, |
||
2918 |
int is_export, int keylength)) |
||
2919 |
{ |
||
2920 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH_CB, |
||
2921 |
(void (*)(void))ecdh); |
||
2922 |
} |
||
2923 |
|||
2924 |
void |
||
2925 |
SSL_set_tmp_ecdh_callback(SSL *ssl, EC_KEY *(*ecdh)(SSL *ssl, int is_export, |
||
2926 |
int keylength)) |
||
2927 |
{ |
||
2928 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh); |
||
2929 |
} |
||
2930 |
|||
2931 |
|||
2932 |
void |
||
2933 |
SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, |
||
2934 |
int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) |
||
2935 |
{ |
||
2936 |
SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, |
||
2937 |
(void (*)(void))cb); |
||
2938 |
} |
||
2939 |
|||
2940 |
void |
||
2941 |
SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, |
||
2942 |
int content_type, const void *buf, size_t len, SSL *ssl, void *arg)) |
||
2943 |
{ |
||
2944 |
SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb); |
||
2945 |
} |
||
2946 |
|||
2947 |
void |
||
2948 |
ssl_clear_hash_ctx(EVP_MD_CTX **hash) |
||
2949 |
{ |
||
2950 |
✓✓ | 80332 |
if (*hash) |
2951 |
656 |
EVP_MD_CTX_destroy(*hash); |
|
2952 |
40166 |
*hash = NULL; |
|
2953 |
40166 |
} |
|
2954 |
|||
2955 |
void |
||
2956 |
SSL_set_debug(SSL *s, int debug) |
||
2957 |
{ |
||
2958 |
4 |
s->internal->debug = debug; |
|
2959 |
2 |
} |
|
2960 |
|||
2961 |
int |
||
2962 |
SSL_cache_hit(SSL *s) |
||
2963 |
{ |
||
2964 |
8 |
return (s->internal->hit); |
|
2965 |
} |
||
2966 |
|||
2967 |
int |
||
2968 |
SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) |
||
2969 |
{ |
||
2970 |
60 |
return ssl_version_set_min(ctx->method, version, |
|
2971 |
20 |
ctx->internal->max_version, &ctx->internal->min_version); |
|
2972 |
} |
||
2973 |
|||
2974 |
int |
||
2975 |
SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) |
||
2976 |
{ |
||
2977 |
54 |
return ssl_version_set_max(ctx->method, version, |
|
2978 |
18 |
ctx->internal->min_version, &ctx->internal->max_version); |
|
2979 |
} |
||
2980 |
|||
2981 |
int |
||
2982 |
SSL_set_min_proto_version(SSL *ssl, uint16_t version) |
||
2983 |
{ |
||
2984 |
45 |
return ssl_version_set_min(ssl->method, version, |
|
2985 |
15 |
ssl->internal->max_version, &ssl->internal->min_version); |
|
2986 |
} |
||
2987 |
|||
2988 |
int |
||
2989 |
SSL_set_max_proto_version(SSL *ssl, uint16_t version) |
||
2990 |
{ |
||
2991 |
45 |
return ssl_version_set_max(ssl->method, version, |
|
2992 |
15 |
ssl->internal->min_version, &ssl->internal->max_version); |
|
2993 |
} |
||
2994 |
|||
2995 |
static int |
||
2996 |
ssl_cipher_id_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) |
||
2997 |
{ |
||
2998 |
157720 |
SSL_CIPHER const *a = a_; |
|
2999 |
78860 |
SSL_CIPHER const *b = b_; |
|
3000 |
78860 |
return ssl_cipher_id_cmp(a, b); |
|
3001 |
} |
||
3002 |
|||
3003 |
SSL_CIPHER * |
||
3004 |
OBJ_bsearch_ssl_cipher_id(SSL_CIPHER *key, SSL_CIPHER const *base, int num) |
||
3005 |
{ |
||
3006 |
30706 |
return (SSL_CIPHER *)OBJ_bsearch_(key, base, num, sizeof(SSL_CIPHER), |
|
3007 |
ssl_cipher_id_cmp_BSEARCH_CMP_FN); |
||
3008 |
} |
Generated by: GCOVR (Version 3.3) |