Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/tls/tls_server.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* $OpenBSD: tls_server.c,v 1.44 2018/03/19 16:34:47 jsing Exp $ */ | - | ||||||||||||||||||||||||||||||
2 | /* | - | ||||||||||||||||||||||||||||||
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | - | ||||||||||||||||||||||||||||||
4 | * | - | ||||||||||||||||||||||||||||||
5 | * Permission to use, copy, modify, and distribute this software for any | - | ||||||||||||||||||||||||||||||
6 | * purpose with or without fee is hereby granted, provided that the above | - | ||||||||||||||||||||||||||||||
7 | * copyright notice and this permission notice appear in all copies. | - | ||||||||||||||||||||||||||||||
8 | * | - | ||||||||||||||||||||||||||||||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | - | ||||||||||||||||||||||||||||||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | - | ||||||||||||||||||||||||||||||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | - | ||||||||||||||||||||||||||||||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | - | ||||||||||||||||||||||||||||||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | - | ||||||||||||||||||||||||||||||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | - | ||||||||||||||||||||||||||||||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | - | ||||||||||||||||||||||||||||||
16 | */ | - | ||||||||||||||||||||||||||||||
17 | - | |||||||||||||||||||||||||||||||
18 | #include <sys/socket.h> | - | ||||||||||||||||||||||||||||||
19 | - | |||||||||||||||||||||||||||||||
20 | #include <arpa/inet.h> | - | ||||||||||||||||||||||||||||||
21 | - | |||||||||||||||||||||||||||||||
22 | #include <openssl/ec.h> | - | ||||||||||||||||||||||||||||||
23 | #include <openssl/err.h> | - | ||||||||||||||||||||||||||||||
24 | #include <openssl/ssl.h> | - | ||||||||||||||||||||||||||||||
25 | - | |||||||||||||||||||||||||||||||
26 | #include <tls.h> | - | ||||||||||||||||||||||||||||||
27 | #include "tls_internal.h" | - | ||||||||||||||||||||||||||||||
28 | - | |||||||||||||||||||||||||||||||
29 | struct tls * | - | ||||||||||||||||||||||||||||||
30 | tls_server(void) | - | ||||||||||||||||||||||||||||||
31 | { | - | ||||||||||||||||||||||||||||||
32 | struct tls *ctx; | - | ||||||||||||||||||||||||||||||
33 | - | |||||||||||||||||||||||||||||||
34 | if (tls_init() == -1)
| 0-2 | ||||||||||||||||||||||||||||||
35 | return (NULL); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||||||||
36 | - | |||||||||||||||||||||||||||||||
37 | if ((ctx = tls_new()) == NULL)
| 0-2 | ||||||||||||||||||||||||||||||
38 | return (NULL); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||||||||
39 | - | |||||||||||||||||||||||||||||||
40 | ctx->flags |= TLS_SERVER; | - | ||||||||||||||||||||||||||||||
41 | - | |||||||||||||||||||||||||||||||
42 | return (ctx); executed 2 times by 1 test: return (ctx); Executed by:
| 2 | ||||||||||||||||||||||||||||||
43 | } | - | ||||||||||||||||||||||||||||||
44 | - | |||||||||||||||||||||||||||||||
45 | struct tls * | - | ||||||||||||||||||||||||||||||
46 | tls_server_conn(struct tls *ctx) | - | ||||||||||||||||||||||||||||||
47 | { | - | ||||||||||||||||||||||||||||||
48 | struct tls *conn_ctx; | - | ||||||||||||||||||||||||||||||
49 | - | |||||||||||||||||||||||||||||||
50 | if ((conn_ctx = tls_new()) == NULL)
| 0-4 | ||||||||||||||||||||||||||||||
51 | return (NULL); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||||||||
52 | - | |||||||||||||||||||||||||||||||
53 | conn_ctx->flags |= TLS_SERVER_CONN; | - | ||||||||||||||||||||||||||||||
54 | - | |||||||||||||||||||||||||||||||
55 | ctx->config->refcount++; | - | ||||||||||||||||||||||||||||||
56 | - | |||||||||||||||||||||||||||||||
57 | conn_ctx->config = ctx->config; | - | ||||||||||||||||||||||||||||||
58 | conn_ctx->keypair = ctx->config->keypair; | - | ||||||||||||||||||||||||||||||
59 | - | |||||||||||||||||||||||||||||||
60 | return (conn_ctx); executed 4 times by 1 test: return (conn_ctx); Executed by:
| 4 | ||||||||||||||||||||||||||||||
61 | } | - | ||||||||||||||||||||||||||||||
62 | - | |||||||||||||||||||||||||||||||
63 | static int | - | ||||||||||||||||||||||||||||||
64 | tls_server_alpn_cb(SSL *ssl, const unsigned char **out, unsigned char *outlen, | - | ||||||||||||||||||||||||||||||
65 | const unsigned char *in, unsigned int inlen, void *arg) | - | ||||||||||||||||||||||||||||||
66 | { | - | ||||||||||||||||||||||||||||||
67 | struct tls *ctx = arg; | - | ||||||||||||||||||||||||||||||
68 | - | |||||||||||||||||||||||||||||||
69 | if (SSL_select_next_proto((unsigned char**)out, outlen,
| 0 | ||||||||||||||||||||||||||||||
70 | ctx->config->alpn, ctx->config->alpn_len, in, inlen) ==
| 0 | ||||||||||||||||||||||||||||||
71 | OPENSSL_NPN_NEGOTIATED)
| 0 | ||||||||||||||||||||||||||||||
72 | return (SSL_TLSEXT_ERR_OK); never executed: return (0); | 0 | ||||||||||||||||||||||||||||||
73 | - | |||||||||||||||||||||||||||||||
74 | return (SSL_TLSEXT_ERR_NOACK); never executed: return (3); | 0 | ||||||||||||||||||||||||||||||
75 | } | - | ||||||||||||||||||||||||||||||
76 | - | |||||||||||||||||||||||||||||||
77 | static int | - | ||||||||||||||||||||||||||||||
78 | tls_servername_cb(SSL *ssl, int *al, void *arg) | - | ||||||||||||||||||||||||||||||
79 | { | - | ||||||||||||||||||||||||||||||
80 | struct tls *ctx = (struct tls *)arg; | - | ||||||||||||||||||||||||||||||
81 | struct tls_sni_ctx *sni_ctx; | - | ||||||||||||||||||||||||||||||
82 | union tls_addr addrbuf; | - | ||||||||||||||||||||||||||||||
83 | struct tls *conn_ctx; | - | ||||||||||||||||||||||||||||||
84 | const char *name; | - | ||||||||||||||||||||||||||||||
85 | int match; | - | ||||||||||||||||||||||||||||||
86 | - | |||||||||||||||||||||||||||||||
87 | if ((conn_ctx = SSL_get_app_data(ssl)) == NULL)
| 0-4 | ||||||||||||||||||||||||||||||
88 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
89 | - | |||||||||||||||||||||||||||||||
90 | if ((name = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name)) ==
| 0-4 | ||||||||||||||||||||||||||||||
91 | NULL) {
| 0-4 | ||||||||||||||||||||||||||||||
92 | /* | - | ||||||||||||||||||||||||||||||
93 | * The servername callback gets called even when there is no | - | ||||||||||||||||||||||||||||||
94 | * TLS servername extension provided by the client. Sigh! | - | ||||||||||||||||||||||||||||||
95 | */ | - | ||||||||||||||||||||||||||||||
96 | return (SSL_TLSEXT_ERR_NOACK); never executed: return (3); | 0 | ||||||||||||||||||||||||||||||
97 | } | - | ||||||||||||||||||||||||||||||
98 | - | |||||||||||||||||||||||||||||||
99 | /* | - | ||||||||||||||||||||||||||||||
100 | * Per RFC 6066 section 3: ensure that name is not an IP literal. | - | ||||||||||||||||||||||||||||||
101 | * | - | ||||||||||||||||||||||||||||||
102 | * While we should treat this as an error, a number of clients | - | ||||||||||||||||||||||||||||||
103 | * (Python, Ruby and Safari) are not RFC compliant. To avoid handshake | - | ||||||||||||||||||||||||||||||
104 | * failures, pretend that we did not receive the extension. | - | ||||||||||||||||||||||||||||||
105 | */ | - | ||||||||||||||||||||||||||||||
106 | if (inet_pton(AF_INET, name, &addrbuf) == 1 ||
| 0-4 | ||||||||||||||||||||||||||||||
107 | inet_pton(AF_INET6, name, &addrbuf) == 1)
| 0-4 | ||||||||||||||||||||||||||||||
108 | return (SSL_TLSEXT_ERR_NOACK); never executed: return (3); | 0 | ||||||||||||||||||||||||||||||
109 | - | |||||||||||||||||||||||||||||||
110 | free((char *)conn_ctx->servername); | - | ||||||||||||||||||||||||||||||
111 | if ((conn_ctx->servername = strdup(name)) == NULL) never executed: __retval = (char *) memcpy (__retval, name , __len);
| 0-4 | ||||||||||||||||||||||||||||||
112 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
113 | - | |||||||||||||||||||||||||||||||
114 | /* Find appropriate SSL context for requested servername. */ | - | ||||||||||||||||||||||||||||||
115 | for (sni_ctx = ctx->sni_ctx; sni_ctx != NULL; sni_ctx = sni_ctx->next) {
| 0-4 | ||||||||||||||||||||||||||||||
116 | if (tls_check_name(ctx, sni_ctx->ssl_cert, name,
| 0 | ||||||||||||||||||||||||||||||
117 | &match) == -1)
| 0 | ||||||||||||||||||||||||||||||
118 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
119 | if (match) {
| 0 | ||||||||||||||||||||||||||||||
120 | conn_ctx->keypair = sni_ctx->keypair; | - | ||||||||||||||||||||||||||||||
121 | SSL_set_SSL_CTX(conn_ctx->ssl_conn, sni_ctx->ssl_ctx); | - | ||||||||||||||||||||||||||||||
122 | return (SSL_TLSEXT_ERR_OK); never executed: return (0); | 0 | ||||||||||||||||||||||||||||||
123 | } | - | ||||||||||||||||||||||||||||||
124 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
125 | - | |||||||||||||||||||||||||||||||
126 | /* No match, use the existing context/certificate. */ | - | ||||||||||||||||||||||||||||||
127 | return (SSL_TLSEXT_ERR_OK); executed 4 times by 1 test: return (0); Executed by:
| 4 | ||||||||||||||||||||||||||||||
128 | - | |||||||||||||||||||||||||||||||
129 | err: | - | ||||||||||||||||||||||||||||||
130 | /* | - | ||||||||||||||||||||||||||||||
131 | * There is no way to tell libssl that an internal failure occurred. | - | ||||||||||||||||||||||||||||||
132 | * The only option we have is to return a fatal alert. | - | ||||||||||||||||||||||||||||||
133 | */ | - | ||||||||||||||||||||||||||||||
134 | *al = TLS1_AD_INTERNAL_ERROR; | - | ||||||||||||||||||||||||||||||
135 | return (SSL_TLSEXT_ERR_ALERT_FATAL); never executed: return (2); | 0 | ||||||||||||||||||||||||||||||
136 | } | - | ||||||||||||||||||||||||||||||
137 | - | |||||||||||||||||||||||||||||||
138 | static struct tls_ticket_key * | - | ||||||||||||||||||||||||||||||
139 | tls_server_ticket_key(struct tls_config *config, unsigned char *keyname) | - | ||||||||||||||||||||||||||||||
140 | { | - | ||||||||||||||||||||||||||||||
141 | struct tls_ticket_key *key = NULL; | - | ||||||||||||||||||||||||||||||
142 | time_t now; | - | ||||||||||||||||||||||||||||||
143 | int i; | - | ||||||||||||||||||||||||||||||
144 | - | |||||||||||||||||||||||||||||||
145 | now = time(NULL); | - | ||||||||||||||||||||||||||||||
146 | if (config->ticket_autorekey == 1) {
| 0 | ||||||||||||||||||||||||||||||
147 | if (now - 3 * (config->session_lifetime / 4) >
| 0 | ||||||||||||||||||||||||||||||
148 | config->ticket_keys[0].time) {
| 0 | ||||||||||||||||||||||||||||||
149 | if (tls_config_ticket_autorekey(config) == -1)
| 0 | ||||||||||||||||||||||||||||||
150 | return (NULL); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||||||||
151 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
152 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
153 | for (i = 0; i < TLS_NUM_TICKETS; i++) {
| 0 | ||||||||||||||||||||||||||||||
154 | struct tls_ticket_key *tk = &config->ticket_keys[i]; | - | ||||||||||||||||||||||||||||||
155 | if (now - config->session_lifetime > tk->time)
| 0 | ||||||||||||||||||||||||||||||
156 | continue; never executed: continue; | 0 | ||||||||||||||||||||||||||||||
157 | if (keyname == NULL || timingsafe_memcmp(keyname,
| 0 | ||||||||||||||||||||||||||||||
158 | tk->key_name, sizeof(tk->key_name)) == 0) {
| 0 | ||||||||||||||||||||||||||||||
159 | key = tk; | - | ||||||||||||||||||||||||||||||
160 | break; never executed: break; | 0 | ||||||||||||||||||||||||||||||
161 | } | - | ||||||||||||||||||||||||||||||
162 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
163 | return (key); never executed: return (key); | 0 | ||||||||||||||||||||||||||||||
164 | } | - | ||||||||||||||||||||||||||||||
165 | - | |||||||||||||||||||||||||||||||
166 | static int | - | ||||||||||||||||||||||||||||||
167 | tls_server_ticket_cb(SSL *ssl, unsigned char *keyname, unsigned char *iv, | - | ||||||||||||||||||||||||||||||
168 | EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int mode) | - | ||||||||||||||||||||||||||||||
169 | { | - | ||||||||||||||||||||||||||||||
170 | struct tls_ticket_key *key; | - | ||||||||||||||||||||||||||||||
171 | struct tls *tls_ctx; | - | ||||||||||||||||||||||||||||||
172 | - | |||||||||||||||||||||||||||||||
173 | if ((tls_ctx = SSL_get_app_data(ssl)) == NULL)
| 0 | ||||||||||||||||||||||||||||||
174 | return (-1); never executed: return (-1); | 0 | ||||||||||||||||||||||||||||||
175 | - | |||||||||||||||||||||||||||||||
176 | if (mode == 1) {
| 0 | ||||||||||||||||||||||||||||||
177 | /* create new session */ | - | ||||||||||||||||||||||||||||||
178 | key = tls_server_ticket_key(tls_ctx->config, NULL); | - | ||||||||||||||||||||||||||||||
179 | if (key == NULL) {
| 0 | ||||||||||||||||||||||||||||||
180 | tls_set_errorx(tls_ctx, "no valid ticket key found"); | - | ||||||||||||||||||||||||||||||
181 | return (-1); never executed: return (-1); | 0 | ||||||||||||||||||||||||||||||
182 | } | - | ||||||||||||||||||||||||||||||
183 | - | |||||||||||||||||||||||||||||||
184 | memcpy(keyname, key->key_name, sizeof(key->key_name)); | - | ||||||||||||||||||||||||||||||
185 | arc4random_buf(iv, EVP_MAX_IV_LENGTH); | - | ||||||||||||||||||||||||||||||
186 | EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, | - | ||||||||||||||||||||||||||||||
187 | key->aes_key, iv); | - | ||||||||||||||||||||||||||||||
188 | HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key), | - | ||||||||||||||||||||||||||||||
189 | EVP_sha256(), NULL); | - | ||||||||||||||||||||||||||||||
190 | return (0); never executed: return (0); | 0 | ||||||||||||||||||||||||||||||
191 | } else { | - | ||||||||||||||||||||||||||||||
192 | /* get key by name */ | - | ||||||||||||||||||||||||||||||
193 | key = tls_server_ticket_key(tls_ctx->config, keyname); | - | ||||||||||||||||||||||||||||||
194 | if (key == NULL)
| 0 | ||||||||||||||||||||||||||||||
195 | return (0); never executed: return (0); | 0 | ||||||||||||||||||||||||||||||
196 | - | |||||||||||||||||||||||||||||||
197 | EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, | - | ||||||||||||||||||||||||||||||
198 | key->aes_key, iv); | - | ||||||||||||||||||||||||||||||
199 | HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key), | - | ||||||||||||||||||||||||||||||
200 | EVP_sha256(), NULL); | - | ||||||||||||||||||||||||||||||
201 | - | |||||||||||||||||||||||||||||||
202 | /* time to renew the ticket? is it the primary key? */ | - | ||||||||||||||||||||||||||||||
203 | if (key != &tls_ctx->config->ticket_keys[0])
| 0 | ||||||||||||||||||||||||||||||
204 | return (2); never executed: return (2); | 0 | ||||||||||||||||||||||||||||||
205 | return (1); never executed: return (1); | 0 | ||||||||||||||||||||||||||||||
206 | } | - | ||||||||||||||||||||||||||||||
207 | } | - | ||||||||||||||||||||||||||||||
208 | - | |||||||||||||||||||||||||||||||
209 | static int | - | ||||||||||||||||||||||||||||||
210 | tls_configure_server_ssl(struct tls *ctx, SSL_CTX **ssl_ctx, | - | ||||||||||||||||||||||||||||||
211 | struct tls_keypair *keypair) | - | ||||||||||||||||||||||||||||||
212 | { | - | ||||||||||||||||||||||||||||||
213 | SSL_CTX_free(*ssl_ctx); | - | ||||||||||||||||||||||||||||||
214 | - | |||||||||||||||||||||||||||||||
215 | if ((*ssl_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) {
| 0-4 | ||||||||||||||||||||||||||||||
216 | tls_set_errorx(ctx, "ssl context failure"); | - | ||||||||||||||||||||||||||||||
217 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
218 | } | - | ||||||||||||||||||||||||||||||
219 | - | |||||||||||||||||||||||||||||||
220 | SSL_CTX_set_options(*ssl_ctx, SSL_OP_NO_CLIENT_RENEGOTIATION); | - | ||||||||||||||||||||||||||||||
221 | - | |||||||||||||||||||||||||||||||
222 | if (SSL_CTX_set_tlsext_servername_callback(*ssl_ctx,
| 0-4 | ||||||||||||||||||||||||||||||
223 | tls_servername_cb) != 1) {
| 0-4 | ||||||||||||||||||||||||||||||
224 | tls_set_error(ctx, "failed to set servername callback"); | - | ||||||||||||||||||||||||||||||
225 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
226 | } | - | ||||||||||||||||||||||||||||||
227 | if (SSL_CTX_set_tlsext_servername_arg(*ssl_ctx, ctx) != 1) {
| 0-4 | ||||||||||||||||||||||||||||||
228 | tls_set_error(ctx, "failed to set servername callback arg"); | - | ||||||||||||||||||||||||||||||
229 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
230 | } | - | ||||||||||||||||||||||||||||||
231 | - | |||||||||||||||||||||||||||||||
232 | if (tls_configure_ssl(ctx, *ssl_ctx) != 0)
| 0-4 | ||||||||||||||||||||||||||||||
233 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
234 | if (tls_configure_ssl_keypair(ctx, *ssl_ctx, keypair, 1) != 0)
| 0-4 | ||||||||||||||||||||||||||||||
235 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
236 | if (ctx->config->verify_client != 0) {
| 0-4 | ||||||||||||||||||||||||||||||
237 | int verify = SSL_VERIFY_PEER; | - | ||||||||||||||||||||||||||||||
238 | if (ctx->config->verify_client == 1)
| 0 | ||||||||||||||||||||||||||||||
239 | verify |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT; never executed: verify |= 0x02; | 0 | ||||||||||||||||||||||||||||||
240 | if (tls_configure_ssl_verify(ctx, *ssl_ctx, verify) == -1)
| 0 | ||||||||||||||||||||||||||||||
241 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
242 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
243 | - | |||||||||||||||||||||||||||||||
244 | if (ctx->config->alpn != NULL)
| 0-4 | ||||||||||||||||||||||||||||||
245 | SSL_CTX_set_alpn_select_cb(*ssl_ctx, tls_server_alpn_cb, never executed: SSL_CTX_set_alpn_select_cb(*ssl_ctx, tls_server_alpn_cb, ctx); | 0 | ||||||||||||||||||||||||||||||
246 | ctx); never executed: SSL_CTX_set_alpn_select_cb(*ssl_ctx, tls_server_alpn_cb, ctx); | 0 | ||||||||||||||||||||||||||||||
247 | - | |||||||||||||||||||||||||||||||
248 | if (ctx->config->dheparams == -1)
| 0-4 | ||||||||||||||||||||||||||||||
249 | SSL_CTX_set_dh_auto(*ssl_ctx, 1); never executed: SSL_CTX_ctrl(*ssl_ctx,118,1, ((void *)0) ); | 0 | ||||||||||||||||||||||||||||||
250 | else if (ctx->config->dheparams == 1024)
| 0-4 | ||||||||||||||||||||||||||||||
251 | SSL_CTX_set_dh_auto(*ssl_ctx, 2); never executed: SSL_CTX_ctrl(*ssl_ctx,118,2, ((void *)0) ); | 0 | ||||||||||||||||||||||||||||||
252 | - | |||||||||||||||||||||||||||||||
253 | if (ctx->config->ecdhecurves != NULL) {
| 0-4 | ||||||||||||||||||||||||||||||
254 | SSL_CTX_set_ecdh_auto(*ssl_ctx, 1); | - | ||||||||||||||||||||||||||||||
255 | if (SSL_CTX_set1_groups(*ssl_ctx, ctx->config->ecdhecurves,
| 0-4 | ||||||||||||||||||||||||||||||
256 | ctx->config->ecdhecurves_len) != 1) {
| 0-4 | ||||||||||||||||||||||||||||||
257 | tls_set_errorx(ctx, "failed to set ecdhe curves"); | - | ||||||||||||||||||||||||||||||
258 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
259 | } | - | ||||||||||||||||||||||||||||||
260 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||||||||||||||
261 | - | |||||||||||||||||||||||||||||||
262 | if (ctx->config->ciphers_server == 1)
| 0-4 | ||||||||||||||||||||||||||||||
263 | SSL_CTX_set_options(*ssl_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); executed 4 times by 1 test: SSL_CTX_ctrl((*ssl_ctx),32,(0x00400000L), ((void *)0) ); Executed by:
| 4 | ||||||||||||||||||||||||||||||
264 | - | |||||||||||||||||||||||||||||||
265 | if (SSL_CTX_set_tlsext_status_cb(*ssl_ctx, tls_ocsp_stapling_cb) != 1) {
| 0-4 | ||||||||||||||||||||||||||||||
266 | tls_set_errorx(ctx, "failed to add OCSP stapling callback"); | - | ||||||||||||||||||||||||||||||
267 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
268 | } | - | ||||||||||||||||||||||||||||||
269 | - | |||||||||||||||||||||||||||||||
270 | if (ctx->config->session_lifetime > 0) {
| 0-4 | ||||||||||||||||||||||||||||||
271 | /* set the session lifetime and enable tickets */ | - | ||||||||||||||||||||||||||||||
272 | SSL_CTX_set_timeout(*ssl_ctx, ctx->config->session_lifetime); | - | ||||||||||||||||||||||||||||||
273 | SSL_CTX_clear_options(*ssl_ctx, SSL_OP_NO_TICKET); | - | ||||||||||||||||||||||||||||||
274 | if (!SSL_CTX_set_tlsext_ticket_key_cb(*ssl_ctx,
| 0 | ||||||||||||||||||||||||||||||
275 | tls_server_ticket_cb)) { | - | ||||||||||||||||||||||||||||||
276 | tls_set_error(ctx, | - | ||||||||||||||||||||||||||||||
277 | "failed to set the TLS ticket callback"); | - | ||||||||||||||||||||||||||||||
278 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
279 | } | - | ||||||||||||||||||||||||||||||
280 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
281 | - | |||||||||||||||||||||||||||||||
282 | if (SSL_CTX_set_session_id_context(*ssl_ctx, ctx->config->session_id,
| 0-4 | ||||||||||||||||||||||||||||||
283 | sizeof(ctx->config->session_id)) != 1) {
| 0-4 | ||||||||||||||||||||||||||||||
284 | tls_set_error(ctx, "failed to set session id context"); | - | ||||||||||||||||||||||||||||||
285 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
286 | } | - | ||||||||||||||||||||||||||||||
287 | - | |||||||||||||||||||||||||||||||
288 | return (0); executed 4 times by 1 test: return (0); Executed by:
| 4 | ||||||||||||||||||||||||||||||
289 | - | |||||||||||||||||||||||||||||||
290 | err: | - | ||||||||||||||||||||||||||||||
291 | SSL_CTX_free(*ssl_ctx); | - | ||||||||||||||||||||||||||||||
292 | *ssl_ctx = NULL; | - | ||||||||||||||||||||||||||||||
293 | - | |||||||||||||||||||||||||||||||
294 | return (-1); never executed: return (-1); | 0 | ||||||||||||||||||||||||||||||
295 | } | - | ||||||||||||||||||||||||||||||
296 | - | |||||||||||||||||||||||||||||||
297 | static int | - | ||||||||||||||||||||||||||||||
298 | tls_configure_server_sni(struct tls *ctx) | - | ||||||||||||||||||||||||||||||
299 | { | - | ||||||||||||||||||||||||||||||
300 | struct tls_sni_ctx **sni_ctx; | - | ||||||||||||||||||||||||||||||
301 | struct tls_keypair *kp; | - | ||||||||||||||||||||||||||||||
302 | - | |||||||||||||||||||||||||||||||
303 | if (ctx->config->keypair->next == NULL)
| 0-4 | ||||||||||||||||||||||||||||||
304 | return (0); executed 4 times by 1 test: return (0); Executed by:
| 4 | ||||||||||||||||||||||||||||||
305 | - | |||||||||||||||||||||||||||||||
306 | /* Set up additional SSL contexts for SNI. */ | - | ||||||||||||||||||||||||||||||
307 | sni_ctx = &ctx->sni_ctx; | - | ||||||||||||||||||||||||||||||
308 | for (kp = ctx->config->keypair->next; kp != NULL; kp = kp->next) {
| 0 | ||||||||||||||||||||||||||||||
309 | if ((*sni_ctx = tls_sni_ctx_new()) == NULL) {
| 0 | ||||||||||||||||||||||||||||||
310 | tls_set_errorx(ctx, "out of memory"); | - | ||||||||||||||||||||||||||||||
311 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
312 | } | - | ||||||||||||||||||||||||||||||
313 | (*sni_ctx)->keypair = kp; | - | ||||||||||||||||||||||||||||||
314 | if (tls_configure_server_ssl(ctx, &(*sni_ctx)->ssl_ctx, kp) == -1)
| 0 | ||||||||||||||||||||||||||||||
315 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
316 | if (tls_keypair_load_cert(kp, &ctx->error,
| 0 | ||||||||||||||||||||||||||||||
317 | &(*sni_ctx)->ssl_cert) == -1)
| 0 | ||||||||||||||||||||||||||||||
318 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
319 | sni_ctx = &(*sni_ctx)->next; | - | ||||||||||||||||||||||||||||||
320 | } never executed: end of block | 0 | ||||||||||||||||||||||||||||||
321 | - | |||||||||||||||||||||||||||||||
322 | return (0); never executed: return (0); | 0 | ||||||||||||||||||||||||||||||
323 | - | |||||||||||||||||||||||||||||||
324 | err: | - | ||||||||||||||||||||||||||||||
325 | return (-1); never executed: return (-1); | 0 | ||||||||||||||||||||||||||||||
326 | } | - | ||||||||||||||||||||||||||||||
327 | - | |||||||||||||||||||||||||||||||
328 | int | - | ||||||||||||||||||||||||||||||
329 | tls_configure_server(struct tls *ctx) | - | ||||||||||||||||||||||||||||||
330 | { | - | ||||||||||||||||||||||||||||||
331 | if (tls_configure_server_ssl(ctx, &ctx->ssl_ctx,
| 0-4 | ||||||||||||||||||||||||||||||
332 | ctx->config->keypair) == -1)
| 0-4 | ||||||||||||||||||||||||||||||
333 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
334 | if (tls_configure_server_sni(ctx) == -1)
| 0-4 | ||||||||||||||||||||||||||||||
335 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
336 | - | |||||||||||||||||||||||||||||||
337 | return (0); executed 4 times by 1 test: return (0); Executed by:
| 4 | ||||||||||||||||||||||||||||||
338 | - | |||||||||||||||||||||||||||||||
339 | err: | - | ||||||||||||||||||||||||||||||
340 | return (-1); never executed: return (-1); | 0 | ||||||||||||||||||||||||||||||
341 | } | - | ||||||||||||||||||||||||||||||
342 | - | |||||||||||||||||||||||||||||||
343 | static struct tls * | - | ||||||||||||||||||||||||||||||
344 | tls_accept_common(struct tls *ctx) | - | ||||||||||||||||||||||||||||||
345 | { | - | ||||||||||||||||||||||||||||||
346 | struct tls *conn_ctx = NULL; | - | ||||||||||||||||||||||||||||||
347 | - | |||||||||||||||||||||||||||||||
348 | if ((ctx->flags & TLS_SERVER) == 0) {
| 0-4 | ||||||||||||||||||||||||||||||
349 | tls_set_errorx(ctx, "not a server context"); | - | ||||||||||||||||||||||||||||||
350 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
351 | } | - | ||||||||||||||||||||||||||||||
352 | - | |||||||||||||||||||||||||||||||
353 | if ((conn_ctx = tls_server_conn(ctx)) == NULL) {
| 0-4 | ||||||||||||||||||||||||||||||
354 | tls_set_errorx(ctx, "connection context failure"); | - | ||||||||||||||||||||||||||||||
355 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
356 | } | - | ||||||||||||||||||||||||||||||
357 | - | |||||||||||||||||||||||||||||||
358 | if ((conn_ctx->ssl_conn = SSL_new(ctx->ssl_ctx)) == NULL) {
| 0-4 | ||||||||||||||||||||||||||||||
359 | tls_set_errorx(ctx, "ssl failure"); | - | ||||||||||||||||||||||||||||||
360 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
361 | } | - | ||||||||||||||||||||||||||||||
362 | - | |||||||||||||||||||||||||||||||
363 | if (SSL_set_app_data(conn_ctx->ssl_conn, conn_ctx) != 1) {
| 0-4 | ||||||||||||||||||||||||||||||
364 | tls_set_errorx(ctx, "ssl application data failure"); | - | ||||||||||||||||||||||||||||||
365 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
366 | } | - | ||||||||||||||||||||||||||||||
367 | - | |||||||||||||||||||||||||||||||
368 | return conn_ctx; executed 4 times by 1 test: return conn_ctx; Executed by:
| 4 | ||||||||||||||||||||||||||||||
369 | - | |||||||||||||||||||||||||||||||
370 | err: | - | ||||||||||||||||||||||||||||||
371 | tls_free(conn_ctx); | - | ||||||||||||||||||||||||||||||
372 | - | |||||||||||||||||||||||||||||||
373 | return (NULL); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||||||||
374 | } | - | ||||||||||||||||||||||||||||||
375 | - | |||||||||||||||||||||||||||||||
376 | int | - | ||||||||||||||||||||||||||||||
377 | tls_accept_socket(struct tls *ctx, struct tls **cctx, int s) | - | ||||||||||||||||||||||||||||||
378 | { | - | ||||||||||||||||||||||||||||||
379 | return (tls_accept_fds(ctx, cctx, s, s)); executed 1 time by 1 test: return (tls_accept_fds(ctx, cctx, s, s)); Executed by:
| 1 | ||||||||||||||||||||||||||||||
380 | } | - | ||||||||||||||||||||||||||||||
381 | - | |||||||||||||||||||||||||||||||
382 | int | - | ||||||||||||||||||||||||||||||
383 | tls_accept_fds(struct tls *ctx, struct tls **cctx, int fd_read, int fd_write) | - | ||||||||||||||||||||||||||||||
384 | { | - | ||||||||||||||||||||||||||||||
385 | struct tls *conn_ctx; | - | ||||||||||||||||||||||||||||||
386 | - | |||||||||||||||||||||||||||||||
387 | if ((conn_ctx = tls_accept_common(ctx)) == NULL)
| 0-2 | ||||||||||||||||||||||||||||||
388 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
389 | - | |||||||||||||||||||||||||||||||
390 | if (SSL_set_rfd(conn_ctx->ssl_conn, fd_read) != 1 ||
| 0-2 | ||||||||||||||||||||||||||||||
391 | SSL_set_wfd(conn_ctx->ssl_conn, fd_write) != 1) {
| 0-2 | ||||||||||||||||||||||||||||||
392 | tls_set_errorx(ctx, "ssl file descriptor failure"); | - | ||||||||||||||||||||||||||||||
393 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
394 | } | - | ||||||||||||||||||||||||||||||
395 | - | |||||||||||||||||||||||||||||||
396 | *cctx = conn_ctx; | - | ||||||||||||||||||||||||||||||
397 | - | |||||||||||||||||||||||||||||||
398 | return (0); executed 2 times by 1 test: return (0); Executed by:
| 2 | ||||||||||||||||||||||||||||||
399 | err: | - | ||||||||||||||||||||||||||||||
400 | tls_free(conn_ctx); | - | ||||||||||||||||||||||||||||||
401 | *cctx = NULL; | - | ||||||||||||||||||||||||||||||
402 | - | |||||||||||||||||||||||||||||||
403 | return (-1); never executed: return (-1); | 0 | ||||||||||||||||||||||||||||||
404 | } | - | ||||||||||||||||||||||||||||||
405 | - | |||||||||||||||||||||||||||||||
406 | int | - | ||||||||||||||||||||||||||||||
407 | tls_accept_cbs(struct tls *ctx, struct tls **cctx, | - | ||||||||||||||||||||||||||||||
408 | tls_read_cb read_cb, tls_write_cb write_cb, void *cb_arg) | - | ||||||||||||||||||||||||||||||
409 | { | - | ||||||||||||||||||||||||||||||
410 | struct tls *conn_ctx; | - | ||||||||||||||||||||||||||||||
411 | - | |||||||||||||||||||||||||||||||
412 | if ((conn_ctx = tls_accept_common(ctx)) == NULL)
| 0-2 | ||||||||||||||||||||||||||||||
413 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
414 | - | |||||||||||||||||||||||||||||||
415 | if (tls_set_cbs(conn_ctx, read_cb, write_cb, cb_arg) != 0)
| 0-2 | ||||||||||||||||||||||||||||||
416 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
417 | - | |||||||||||||||||||||||||||||||
418 | *cctx = conn_ctx; | - | ||||||||||||||||||||||||||||||
419 | - | |||||||||||||||||||||||||||||||
420 | return (0); executed 2 times by 1 test: return (0); Executed by:
| 2 | ||||||||||||||||||||||||||||||
421 | err: | - | ||||||||||||||||||||||||||||||
422 | tls_free(conn_ctx); | - | ||||||||||||||||||||||||||||||
423 | *cctx = NULL; | - | ||||||||||||||||||||||||||||||
424 | - | |||||||||||||||||||||||||||||||
425 | return (-1); never executed: return (-1); | 0 | ||||||||||||||||||||||||||||||
426 | } | - | ||||||||||||||||||||||||||||||
427 | - | |||||||||||||||||||||||||||||||
428 | int | - | ||||||||||||||||||||||||||||||
429 | tls_handshake_server(struct tls *ctx) | - | ||||||||||||||||||||||||||||||
430 | { | - | ||||||||||||||||||||||||||||||
431 | int ssl_ret; | - | ||||||||||||||||||||||||||||||
432 | int rv = -1; | - | ||||||||||||||||||||||||||||||
433 | - | |||||||||||||||||||||||||||||||
434 | if ((ctx->flags & TLS_SERVER_CONN) == 0) {
| 0-12 | ||||||||||||||||||||||||||||||
435 | tls_set_errorx(ctx, "not a server connection context"); | - | ||||||||||||||||||||||||||||||
436 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||||||||
437 | } | - | ||||||||||||||||||||||||||||||
438 | - | |||||||||||||||||||||||||||||||
439 | ctx->state |= TLS_SSL_NEEDS_SHUTDOWN; | - | ||||||||||||||||||||||||||||||
440 | - | |||||||||||||||||||||||||||||||
441 | ERR_clear_error(); | - | ||||||||||||||||||||||||||||||
442 | if ((ssl_ret = SSL_accept(ctx->ssl_conn)) != 1) {
| 4-8 | ||||||||||||||||||||||||||||||
443 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); | - | ||||||||||||||||||||||||||||||
444 | goto err; executed 8 times by 1 test: goto err; Executed by:
| 8 | ||||||||||||||||||||||||||||||
445 | } | - | ||||||||||||||||||||||||||||||
446 | - | |||||||||||||||||||||||||||||||
447 | ctx->state |= TLS_HANDSHAKE_COMPLETE; | - | ||||||||||||||||||||||||||||||
448 | rv = 0; | - | ||||||||||||||||||||||||||||||
449 | - | |||||||||||||||||||||||||||||||
450 | err: code before this statement executed 4 times by 1 test: err: Executed by:
| 4 | ||||||||||||||||||||||||||||||
451 | return (rv); executed 12 times by 1 test: return (rv); Executed by:
| 12 | ||||||||||||||||||||||||||||||
452 | } | - | ||||||||||||||||||||||||||||||
Source code | Switch to Preprocessed file |