Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/tls/tls_client.c |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||||||||
2 | - | |||||||||||||||||||||||||
3 | - | |||||||||||||||||||||||||
4 | - | |||||||||||||||||||||||||
5 | - | |||||||||||||||||||||||||
6 | struct tls * | - | ||||||||||||||||||||||||
7 | tls_client(void) | - | ||||||||||||||||||||||||
8 | { | - | ||||||||||||||||||||||||
9 | struct tls *ctx; | - | ||||||||||||||||||||||||
10 | - | |||||||||||||||||||||||||
11 | if (tls_init() == -1
| 0-30 | ||||||||||||||||||||||||
12 | return never executed: (return ( ((void *)0) ); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||
13 | ((void *)0) never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||
14 | ); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||
15 | - | |||||||||||||||||||||||||
16 | if ((
| 0-30 | ||||||||||||||||||||||||
17 | ((void *)0)
| 0-30 | ||||||||||||||||||||||||
18 | ) | - | ||||||||||||||||||||||||
19 | return never executed: (return ( ((void *)0) ); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||
20 | ((void *)0) never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||
21 | ); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||
22 | - | |||||||||||||||||||||||||
23 | ctx->flags |= (1 << 0); | - | ||||||||||||||||||||||||
24 | - | |||||||||||||||||||||||||
25 | return executed 30 times by 2 tests: (ctx);return (ctx); Executed by:
executed 30 times by 2 tests: return (ctx); Executed by:
| 30 | ||||||||||||||||||||||||
26 | } | - | ||||||||||||||||||||||||
27 | - | |||||||||||||||||||||||||
28 | int | - | ||||||||||||||||||||||||
29 | tls_connect(struct tls *ctx, const char *host, const char *port) | - | ||||||||||||||||||||||||
30 | { | - | ||||||||||||||||||||||||
31 | return never executed: tls_connect_servername(ctx, host, port, return tls_connect_servername(ctx, host, port, ((void *)0) ); never executed: return tls_connect_servername(ctx, host, port, ((void *)0) ); | 0 | ||||||||||||||||||||||||
32 | ((void *)0) never executed: return tls_connect_servername(ctx, host, port, ((void *)0) ); | 0 | ||||||||||||||||||||||||
33 | ); never executed: return tls_connect_servername(ctx, host, port, ((void *)0) ); | 0 | ||||||||||||||||||||||||
34 | } | - | ||||||||||||||||||||||||
35 | - | |||||||||||||||||||||||||
36 | int | - | ||||||||||||||||||||||||
37 | tls_connect_servername(struct tls *ctx, const char *host, const char *port, | - | ||||||||||||||||||||||||
38 | const char *servername) | - | ||||||||||||||||||||||||
39 | { | - | ||||||||||||||||||||||||
40 | struct addrinfo hints, *res, *res0; | - | ||||||||||||||||||||||||
41 | const char *h = | - | ||||||||||||||||||||||||
42 | ((void *)0) | - | ||||||||||||||||||||||||
43 | , *p = | - | ||||||||||||||||||||||||
44 | ((void *)0) | - | ||||||||||||||||||||||||
45 | ; | - | ||||||||||||||||||||||||
46 | char *hs = | - | ||||||||||||||||||||||||
47 | ((void *)0) | - | ||||||||||||||||||||||||
48 | , *ps = | - | ||||||||||||||||||||||||
49 | ((void *)0) | - | ||||||||||||||||||||||||
50 | ; | - | ||||||||||||||||||||||||
51 | int rv = -1, s = -1, ret; | - | ||||||||||||||||||||||||
52 | - | |||||||||||||||||||||||||
53 | if ((
| 0 | ||||||||||||||||||||||||
54 | tls_set_errorx(ctx, "not a client context"); | - | ||||||||||||||||||||||||
55 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
56 | } | - | ||||||||||||||||||||||||
57 | - | |||||||||||||||||||||||||
58 | if (host ==
| 0 | ||||||||||||||||||||||||
59 | ((void *)0)
| 0 | ||||||||||||||||||||||||
60 | ) { | - | ||||||||||||||||||||||||
61 | tls_set_errorx(ctx, "host not specified"); | - | ||||||||||||||||||||||||
62 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
63 | } | - | ||||||||||||||||||||||||
64 | - | |||||||||||||||||||||||||
65 | - | |||||||||||||||||||||||||
66 | - | |||||||||||||||||||||||||
67 | - | |||||||||||||||||||||||||
68 | - | |||||||||||||||||||||||||
69 | if ((
| 0 | ||||||||||||||||||||||||
70 | ((void *)0)
| 0 | ||||||||||||||||||||||||
71 | ) { | - | ||||||||||||||||||||||||
72 | ret = tls_host_port(host, &hs, &ps); | - | ||||||||||||||||||||||||
73 | if (ret == -1
| 0 | ||||||||||||||||||||||||
74 | tls_set_errorx(ctx, "memory allocation failure"); | - | ||||||||||||||||||||||||
75 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
76 | } | - | ||||||||||||||||||||||||
77 | if (ret != 0
| 0 | ||||||||||||||||||||||||
78 | tls_set_errorx(ctx, "no port provided"); | - | ||||||||||||||||||||||||
79 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
80 | } | - | ||||||||||||||||||||||||
81 | } never executed: end of block | 0 | ||||||||||||||||||||||||
82 | - | |||||||||||||||||||||||||
83 | h = (
| 0 | ||||||||||||||||||||||||
84 | ((void *)0)
| 0 | ||||||||||||||||||||||||
85 | )
| 0 | ||||||||||||||||||||||||
86 | p = (
| 0 | ||||||||||||||||||||||||
87 | ((void *)0)
| 0 | ||||||||||||||||||||||||
88 | )
| 0 | ||||||||||||||||||||||||
89 | memset(&hints, 0, sizeof(hints)); | - | ||||||||||||||||||||||||
90 | hints.ai_socktype = | - | ||||||||||||||||||||||||
91 | SOCK_STREAM | - | ||||||||||||||||||||||||
92 | ; | - | ||||||||||||||||||||||||
93 | - | |||||||||||||||||||||||||
94 | - | |||||||||||||||||||||||||
95 | hints.ai_family = | - | ||||||||||||||||||||||||
96 | 2 | - | ||||||||||||||||||||||||
97 | ; | - | ||||||||||||||||||||||||
98 | hints.ai_flags = | - | ||||||||||||||||||||||||
99 | 0x0004 | - | ||||||||||||||||||||||||
100 | ; | - | ||||||||||||||||||||||||
101 | if (getaddrinfo(h, p, &hints, &res0) != 0
| 0 | ||||||||||||||||||||||||
102 | - | |||||||||||||||||||||||||
103 | hints.ai_family = | - | ||||||||||||||||||||||||
104 | 10 | - | ||||||||||||||||||||||||
105 | ; | - | ||||||||||||||||||||||||
106 | if (getaddrinfo(h, p, &hints, &res0) != 0
| 0 | ||||||||||||||||||||||||
107 | - | |||||||||||||||||||||||||
108 | hints.ai_family = | - | ||||||||||||||||||||||||
109 | 0 | - | ||||||||||||||||||||||||
110 | ; | - | ||||||||||||||||||||||||
111 | hints.ai_flags = | - | ||||||||||||||||||||||||
112 | 0x0020 | - | ||||||||||||||||||||||||
113 | ; | - | ||||||||||||||||||||||||
114 | if ((
| 0 | ||||||||||||||||||||||||
115 | tls_set_error(ctx, "%s", gai_strerror(s)); | - | ||||||||||||||||||||||||
116 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
117 | } | - | ||||||||||||||||||||||||
118 | } never executed: end of block | 0 | ||||||||||||||||||||||||
119 | } never executed: end of block | 0 | ||||||||||||||||||||||||
120 | - | |||||||||||||||||||||||||
121 | - | |||||||||||||||||||||||||
122 | s = -1; | - | ||||||||||||||||||||||||
123 | for (res = res0; res
| 0 | ||||||||||||||||||||||||
124 | s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); | - | ||||||||||||||||||||||||
125 | if (s == -1
| 0 | ||||||||||||||||||||||||
126 | tls_set_error(ctx, "socket"); | - | ||||||||||||||||||||||||
127 | continue; never executed: continue; | 0 | ||||||||||||||||||||||||
128 | } | - | ||||||||||||||||||||||||
129 | if (connect(s, res->ai_addr, res->ai_addrlen) == -1
| 0 | ||||||||||||||||||||||||
130 | tls_set_error(ctx, "connect"); | - | ||||||||||||||||||||||||
131 | close(s); | - | ||||||||||||||||||||||||
132 | s = -1; | - | ||||||||||||||||||||||||
133 | continue; never executed: continue; | 0 | ||||||||||||||||||||||||
134 | } | - | ||||||||||||||||||||||||
135 | - | |||||||||||||||||||||||||
136 | break; never executed: break; | 0 | ||||||||||||||||||||||||
137 | } | - | ||||||||||||||||||||||||
138 | freeaddrinfo(res0); | - | ||||||||||||||||||||||||
139 | - | |||||||||||||||||||||||||
140 | if (s == -1
| 0 | ||||||||||||||||||||||||
141 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
142 | - | |||||||||||||||||||||||||
143 | if (servername ==
| 0 | ||||||||||||||||||||||||
144 | ((void *)0)
| 0 | ||||||||||||||||||||||||
145 | ) | - | ||||||||||||||||||||||||
146 | servername = h; never executed: servername = h; | 0 | ||||||||||||||||||||||||
147 | - | |||||||||||||||||||||||||
148 | if (tls_connect_socket(ctx, s, servername) != 0
| 0 | ||||||||||||||||||||||||
149 | close(s); | - | ||||||||||||||||||||||||
150 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
151 | } | - | ||||||||||||||||||||||||
152 | - | |||||||||||||||||||||||||
153 | ctx->socket = s; | - | ||||||||||||||||||||||||
154 | - | |||||||||||||||||||||||||
155 | rv = 0; | - | ||||||||||||||||||||||||
156 | - | |||||||||||||||||||||||||
157 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||||||||
158 | free(hs); | - | ||||||||||||||||||||||||
159 | free(ps); | - | ||||||||||||||||||||||||
160 | - | |||||||||||||||||||||||||
161 | return never executed: (rv);return (rv); never executed: return (rv); | 0 | ||||||||||||||||||||||||
162 | } | - | ||||||||||||||||||||||||
163 | - | |||||||||||||||||||||||||
164 | static int | - | ||||||||||||||||||||||||
165 | tls_client_read_session(struct tls *ctx) | - | ||||||||||||||||||||||||
166 | { | - | ||||||||||||||||||||||||
167 | int sfd = ctx->config->session_fd; | - | ||||||||||||||||||||||||
168 | uint8_t *session = | - | ||||||||||||||||||||||||
169 | ((void *)0) | - | ||||||||||||||||||||||||
170 | ; | - | ||||||||||||||||||||||||
171 | size_t session_len = 0; | - | ||||||||||||||||||||||||
172 | SSL_SESSION *ss = | - | ||||||||||||||||||||||||
173 | ((void *)0) | - | ||||||||||||||||||||||||
174 | ; | - | ||||||||||||||||||||||||
175 | BIO *bio = | - | ||||||||||||||||||||||||
176 | ((void *)0) | - | ||||||||||||||||||||||||
177 | ; | - | ||||||||||||||||||||||||
178 | struct stat sb; | - | ||||||||||||||||||||||||
179 | ssize_t n; | - | ||||||||||||||||||||||||
180 | int rv = -1; | - | ||||||||||||||||||||||||
181 | - | |||||||||||||||||||||||||
182 | if (fstat(sfd, &sb) == -1
| 0 | ||||||||||||||||||||||||
183 | tls_set_error(ctx, "failed to stat session file"); | - | ||||||||||||||||||||||||
184 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
185 | } | - | ||||||||||||||||||||||||
186 | if (sb.st_size < 0
| 0 | ||||||||||||||||||||||||
187 | tls_set_errorx(ctx, "invalid session file size"); | - | ||||||||||||||||||||||||
188 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
189 | } | - | ||||||||||||||||||||||||
190 | session_len = (size_t)sb.st_size; | - | ||||||||||||||||||||||||
191 | - | |||||||||||||||||||||||||
192 | - | |||||||||||||||||||||||||
193 | if (session_len == 0
| 0 | ||||||||||||||||||||||||
194 | goto never executed: done;goto done; never executed: goto done; | 0 | ||||||||||||||||||||||||
195 | - | |||||||||||||||||||||||||
196 | if ((
| 0 | ||||||||||||||||||||||||
197 | ((void *)0)
| 0 | ||||||||||||||||||||||||
198 | ) | - | ||||||||||||||||||||||||
199 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
200 | - | |||||||||||||||||||||||||
201 | n = pread(sfd, session, session_len, 0); | - | ||||||||||||||||||||||||
202 | if (n < 0
| 0 | ||||||||||||||||||||||||
203 | tls_set_error(ctx, "failed to read session file"); | - | ||||||||||||||||||||||||
204 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
205 | } | - | ||||||||||||||||||||||||
206 | if ((
| 0 | ||||||||||||||||||||||||
207 | ((void *)0)
| 0 | ||||||||||||||||||||||||
208 | ) | - | ||||||||||||||||||||||||
209 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
210 | if ((
| 0 | ||||||||||||||||||||||||
211 | ((void *)0)
| 0 | ||||||||||||||||||||||||
212 | , tls_password_cb,
| 0 | ||||||||||||||||||||||||
213 |
| 0 | ||||||||||||||||||||||||
214 | ((void *)0)
| 0 | ||||||||||||||||||||||||
215 | )) ==
| 0 | ||||||||||||||||||||||||
216 | ((void *)0)
| 0 | ||||||||||||||||||||||||
217 | ) { | - | ||||||||||||||||||||||||
218 | tls_set_errorx(ctx, "failed to parse session"); | - | ||||||||||||||||||||||||
219 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
220 | } | - | ||||||||||||||||||||||||
221 | - | |||||||||||||||||||||||||
222 | if (SSL_set_session(ctx->ssl_conn, ss) != 1
| 0 | ||||||||||||||||||||||||
223 | tls_set_errorx(ctx, "failed to set session"); | - | ||||||||||||||||||||||||
224 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
225 | } | - | ||||||||||||||||||||||||
226 | - | |||||||||||||||||||||||||
227 | done: code before this statement never executed: done: | 0 | ||||||||||||||||||||||||
228 | rv = 0; | - | ||||||||||||||||||||||||
229 | - | |||||||||||||||||||||||||
230 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||||||||
231 | freezero(session, session_len); | - | ||||||||||||||||||||||||
232 | SSL_SESSION_free(ss); | - | ||||||||||||||||||||||||
233 | BIO_free(bio); | - | ||||||||||||||||||||||||
234 | - | |||||||||||||||||||||||||
235 | return never executed: rv;return rv; never executed: return rv; | 0 | ||||||||||||||||||||||||
236 | } | - | ||||||||||||||||||||||||
237 | - | |||||||||||||||||||||||||
238 | static int | - | ||||||||||||||||||||||||
239 | tls_client_write_session(struct tls *ctx) | - | ||||||||||||||||||||||||
240 | { | - | ||||||||||||||||||||||||
241 | int sfd = ctx->config->session_fd; | - | ||||||||||||||||||||||||
242 | SSL_SESSION *ss = | - | ||||||||||||||||||||||||
243 | ((void *)0) | - | ||||||||||||||||||||||||
244 | ; | - | ||||||||||||||||||||||||
245 | BIO *bio = | - | ||||||||||||||||||||||||
246 | ((void *)0) | - | ||||||||||||||||||||||||
247 | ; | - | ||||||||||||||||||||||||
248 | long data_len; | - | ||||||||||||||||||||||||
249 | char *data; | - | ||||||||||||||||||||||||
250 | off_t offset; | - | ||||||||||||||||||||||||
251 | size_t len; | - | ||||||||||||||||||||||||
252 | ssize_t n; | - | ||||||||||||||||||||||||
253 | int rv = -1; | - | ||||||||||||||||||||||||
254 | - | |||||||||||||||||||||||||
255 | if ((
| 0 | ||||||||||||||||||||||||
256 | ((void *)0)
| 0 | ||||||||||||||||||||||||
257 | ) { | - | ||||||||||||||||||||||||
258 | if (ftruncate(sfd, 0) == -1
| 0 | ||||||||||||||||||||||||
259 | tls_set_error(ctx, "failed to truncate session file"); | - | ||||||||||||||||||||||||
260 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
261 | } | - | ||||||||||||||||||||||||
262 | goto never executed: done;goto done; never executed: goto done; | 0 | ||||||||||||||||||||||||
263 | } | - | ||||||||||||||||||||||||
264 | - | |||||||||||||||||||||||||
265 | if ((
| 0 | ||||||||||||||||||||||||
266 | ((void *)0)
| 0 | ||||||||||||||||||||||||
267 | ) | - | ||||||||||||||||||||||||
268 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
269 | if (PEM_write_bio_SSL_SESSION(bio, ss) == 0
| 0 | ||||||||||||||||||||||||
270 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
271 | if ((
| 0 | ||||||||||||||||||||||||
272 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
273 | - | |||||||||||||||||||||||||
274 | len = (size_t)data_len; | - | ||||||||||||||||||||||||
275 | offset = 0; | - | ||||||||||||||||||||||||
276 | - | |||||||||||||||||||||||||
277 | if (ftruncate(sfd, len) == -1
| 0 | ||||||||||||||||||||||||
278 | tls_set_error(ctx, "failed to truncate session file"); | - | ||||||||||||||||||||||||
279 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
280 | } | - | ||||||||||||||||||||||||
281 | while (len > 0
| 0 | ||||||||||||||||||||||||
282 | if ((
| 0 | ||||||||||||||||||||||||
283 | tls_set_error(ctx, "failed to write session file"); | - | ||||||||||||||||||||||||
284 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
285 | } | - | ||||||||||||||||||||||||
286 | offset += n; | - | ||||||||||||||||||||||||
287 | len -= n; | - | ||||||||||||||||||||||||
288 | } never executed: end of block | 0 | ||||||||||||||||||||||||
289 | - | |||||||||||||||||||||||||
290 | done: code before this statement never executed: done: | 0 | ||||||||||||||||||||||||
291 | rv = 0; | - | ||||||||||||||||||||||||
292 | - | |||||||||||||||||||||||||
293 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||||||||
294 | SSL_SESSION_free(ss); | - | ||||||||||||||||||||||||
295 | BIO_free_all(bio); | - | ||||||||||||||||||||||||
296 | - | |||||||||||||||||||||||||
297 | return never executed: (rv);return (rv); never executed: return (rv); | 0 | ||||||||||||||||||||||||
298 | } | - | ||||||||||||||||||||||||
299 | - | |||||||||||||||||||||||||
300 | static int | - | ||||||||||||||||||||||||
301 | tls_connect_common(struct tls *ctx, const char *servername) | - | ||||||||||||||||||||||||
302 | { | - | ||||||||||||||||||||||||
303 | union tls_addr addrbuf; | - | ||||||||||||||||||||||||
304 | int rv = -1; | - | ||||||||||||||||||||||||
305 | - | |||||||||||||||||||||||||
306 | if ((
| 0-4 | ||||||||||||||||||||||||
307 | tls_set_errorx(ctx, "not a client context"); | - | ||||||||||||||||||||||||
308 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
309 | } | - | ||||||||||||||||||||||||
310 | - | |||||||||||||||||||||||||
311 | if (servername !=
| 0-4 | ||||||||||||||||||||||||
312 | ((void *)0)
| 0-4 | ||||||||||||||||||||||||
313 | ) { | - | ||||||||||||||||||||||||
314 | if ((
| 0-4 | ||||||||||||||||||||||||
315 | (__extension__ (__builtin_constant_p (
| 0-4 | ||||||||||||||||||||||||
316 | servername
| 0-4 | ||||||||||||||||||||||||
317 | )
| 0-4 | ||||||||||||||||||||||||
318 | servername
| 0-4 | ||||||||||||||||||||||||
319 | ) + 1) - (size_t)(const void *)(
| 0-4 | ||||||||||||||||||||||||
320 | servername
| 0-4 | ||||||||||||||||||||||||
321 | ) == 1)
| 0-4 | ||||||||||||||||||||||||
322 | servername
| 0-4 | ||||||||||||||||||||||||
323 | ))[0] == '\0'
| 0-4 | ||||||||||||||||||||||||
324 | servername
| 0-4 | ||||||||||||||||||||||||
325 | ) + 1; char *__retval = (char *) malloc (__len); if (__retval != ((void *)0)
never executed: __retval = (char *) memcpy (__retval, servername , __len);
| 0-4 | ||||||||||||||||||||||||
326 | servername
never executed: __retval = (char *) memcpy (__retval, servername , __len); | 0-4 | ||||||||||||||||||||||||
327 | , __len);
never executed: __retval; })) : __strdup (__retval = (char *) memcpy (__retval, servername , __len);
| 0-4 | ||||||||||||||||||||||||
328 | servername
| 0-4 | ||||||||||||||||||||||||
329 | )))
| 0-4 | ||||||||||||||||||||||||
330 | ) ==
| 0-4 | ||||||||||||||||||||||||
331 | ((void *)0)
| 0-4 | ||||||||||||||||||||||||
332 | ) { | - | ||||||||||||||||||||||||
333 | tls_set_errorx(ctx, "out of memory"); | - | ||||||||||||||||||||||||
334 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
335 | } | - | ||||||||||||||||||||||||
336 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||||||||
337 | - | |||||||||||||||||||||||||
338 | if ((
| 0-4 | ||||||||||||||||||||||||
339 | ((void *)0)
| 0-4 | ||||||||||||||||||||||||
340 | ) { | - | ||||||||||||||||||||||||
341 | tls_set_errorx(ctx, "ssl context failure"); | - | ||||||||||||||||||||||||
342 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
343 | } | - | ||||||||||||||||||||||||
344 | - | |||||||||||||||||||||||||
345 | if (tls_configure_ssl(ctx, ctx->ssl_ctx) != 0
| 0-4 | ||||||||||||||||||||||||
346 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
347 | - | |||||||||||||||||||||||||
348 | if (tls_configure_ssl_keypair(ctx, ctx->ssl_ctx,
| 0-4 | ||||||||||||||||||||||||
349 | ctx->config->keypair, 0) != 0
| 0-4 | ||||||||||||||||||||||||
350 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
351 | - | |||||||||||||||||||||||||
352 | if (ctx->config->verify_name
| 0-4 | ||||||||||||||||||||||||
353 | if (servername ==
| 0 | ||||||||||||||||||||||||
354 | ((void *)0)
| 0 | ||||||||||||||||||||||||
355 | ) { | - | ||||||||||||||||||||||||
356 | tls_set_errorx(ctx, "server name not specified"); | - | ||||||||||||||||||||||||
357 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
358 | } | - | ||||||||||||||||||||||||
359 | } never executed: end of block | 0 | ||||||||||||||||||||||||
360 | - | |||||||||||||||||||||||||
361 | if (tls_configure_ssl_verify(ctx, ctx->ssl_ctx, 0x01) == -1
| 0-4 | ||||||||||||||||||||||||
362 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
363 | - | |||||||||||||||||||||||||
364 | if (ctx->config->ecdhecurves !=
| 0-4 | ||||||||||||||||||||||||
365 | ((void *)0)
| 0-4 | ||||||||||||||||||||||||
366 | ) { | - | ||||||||||||||||||||||||
367 | if (SSL_CTX_set1_groups(ctx->ssl_ctx, ctx->config->ecdhecurves,
| 0-4 | ||||||||||||||||||||||||
368 | ctx->config->ecdhecurves_len) != 1
| 0-4 | ||||||||||||||||||||||||
369 | tls_set_errorx(ctx, "failed to set ecdhe curves"); | - | ||||||||||||||||||||||||
370 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
371 | } | - | ||||||||||||||||||||||||
372 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||||||||
373 | - | |||||||||||||||||||||||||
374 | if (SSL_CTX_callback_ctrl(ctx->ssl_ctx,63,(void (*)(void))tls_ocsp_verify_cb) != 1
| 0-4 | ||||||||||||||||||||||||
375 | tls_set_errorx(ctx, "ssl OCSP verification setup failure"); | - | ||||||||||||||||||||||||
376 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
377 | } | - | ||||||||||||||||||||||||
378 | - | |||||||||||||||||||||||||
379 | if ((
| 0-4 | ||||||||||||||||||||||||
380 | ((void *)0)
| 0-4 | ||||||||||||||||||||||||
381 | ) { | - | ||||||||||||||||||||||||
382 | tls_set_errorx(ctx, "ssl connection failure"); | - | ||||||||||||||||||||||||
383 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
384 | } | - | ||||||||||||||||||||||||
385 | - | |||||||||||||||||||||||||
386 | if ((
| 0-4 | ||||||||||||||||||||||||
387 | tls_set_errorx(ctx, "ssl application data failure"); | - | ||||||||||||||||||||||||
388 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
389 | } | - | ||||||||||||||||||||||||
390 | - | |||||||||||||||||||||||||
391 | if (ctx->config->session_fd != -1
| 0-4 | ||||||||||||||||||||||||
392 | SSL_ctrl((ctx->ssl_conn),77,(0x00004000L), | - | ||||||||||||||||||||||||
393 | ((void *)0) | - | ||||||||||||||||||||||||
394 | ); | - | ||||||||||||||||||||||||
395 | if (tls_client_read_session(ctx) == -1
| 0 | ||||||||||||||||||||||||
396 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
397 | } never executed: end of block | 0 | ||||||||||||||||||||||||
398 | - | |||||||||||||||||||||||||
399 | if (SSL_ctrl(ctx->ssl_conn,65,1,
| 0-4 | ||||||||||||||||||||||||
400 | ((void *)0)
| 0-4 | ||||||||||||||||||||||||
401 | ) != 1
| 0-4 | ||||||||||||||||||||||||
402 | tls_set_errorx(ctx, "ssl OCSP extension setup failure"); | - | ||||||||||||||||||||||||
403 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
404 | } | - | ||||||||||||||||||||||||
405 | - | |||||||||||||||||||||||||
406 | - | |||||||||||||||||||||||||
407 | - | |||||||||||||||||||||||||
408 | - | |||||||||||||||||||||||||
409 | - | |||||||||||||||||||||||||
410 | if (servername !=
| 0-4 | ||||||||||||||||||||||||
411 | ((void *)0)
| 0-4 | ||||||||||||||||||||||||
412 | && | - | ||||||||||||||||||||||||
413 | inet_pton(
| 0-4 | ||||||||||||||||||||||||
414 | 2
| 0-4 | ||||||||||||||||||||||||
415 | , servername, &addrbuf) != 1
| 0-4 | ||||||||||||||||||||||||
416 | inet_pton(
| 0-4 | ||||||||||||||||||||||||
417 | 10
| 0-4 | ||||||||||||||||||||||||
418 | , servername, &addrbuf) != 1
| 0-4 | ||||||||||||||||||||||||
419 | if (SSL_ctrl(ctx->ssl_conn,55,0,(char *)servername) == 0
| 0-4 | ||||||||||||||||||||||||
420 | tls_set_errorx(ctx, "server name indication failure"); | - | ||||||||||||||||||||||||
421 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
422 | } | - | ||||||||||||||||||||||||
423 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||||||||
424 | - | |||||||||||||||||||||||||
425 | ctx->state |= (1 << 1); | - | ||||||||||||||||||||||||
426 | rv = 0; | - | ||||||||||||||||||||||||
427 | - | |||||||||||||||||||||||||
428 | err: code before this statement executed 4 times by 1 test: err: Executed by:
| 4 | ||||||||||||||||||||||||
429 | return executed 4 times by 1 test: (rv);return (rv); Executed by:
executed 4 times by 1 test: return (rv); Executed by:
| 4 | ||||||||||||||||||||||||
430 | } | - | ||||||||||||||||||||||||
431 | - | |||||||||||||||||||||||||
432 | int | - | ||||||||||||||||||||||||
433 | tls_connect_socket(struct tls *ctx, int s, const char *servername) | - | ||||||||||||||||||||||||
434 | { | - | ||||||||||||||||||||||||
435 | return executed 1 time by 1 test: tls_connect_fds(ctx, s, s, servername);return tls_connect_fds(ctx, s, s, servername); Executed by:
executed 1 time by 1 test: return tls_connect_fds(ctx, s, s, servername); Executed by:
| 1 | ||||||||||||||||||||||||
436 | } | - | ||||||||||||||||||||||||
437 | - | |||||||||||||||||||||||||
438 | int | - | ||||||||||||||||||||||||
439 | tls_connect_fds(struct tls *ctx, int fd_read, int fd_write, | - | ||||||||||||||||||||||||
440 | const char *servername) | - | ||||||||||||||||||||||||
441 | { | - | ||||||||||||||||||||||||
442 | int rv = -1; | - | ||||||||||||||||||||||||
443 | - | |||||||||||||||||||||||||
444 | if (fd_read < 0
| 0-2 | ||||||||||||||||||||||||
445 | tls_set_errorx(ctx, "invalid file descriptors"); | - | ||||||||||||||||||||||||
446 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
447 | } | - | ||||||||||||||||||||||||
448 | - | |||||||||||||||||||||||||
449 | if (tls_connect_common(ctx, servername) != 0
| 0-2 | ||||||||||||||||||||||||
450 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
451 | - | |||||||||||||||||||||||||
452 | if (SSL_set_rfd(ctx->ssl_conn, fd_read) != 1
| 0-2 | ||||||||||||||||||||||||
453 | SSL_set_wfd(ctx->ssl_conn, fd_write) != 1
| 0-2 | ||||||||||||||||||||||||
454 | tls_set_errorx(ctx, "ssl file descriptor failure"); | - | ||||||||||||||||||||||||
455 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
456 | } | - | ||||||||||||||||||||||||
457 | - | |||||||||||||||||||||||||
458 | rv = 0; | - | ||||||||||||||||||||||||
459 | err: code before this statement executed 2 times by 1 test: err: Executed by:
| 2 | ||||||||||||||||||||||||
460 | return executed 2 times by 1 test: (rv);return (rv); Executed by:
executed 2 times by 1 test: return (rv); Executed by:
| 2 | ||||||||||||||||||||||||
461 | } | - | ||||||||||||||||||||||||
462 | - | |||||||||||||||||||||||||
463 | int | - | ||||||||||||||||||||||||
464 | tls_connect_cbs(struct tls *ctx, tls_read_cb read_cb, | - | ||||||||||||||||||||||||
465 | tls_write_cb write_cb, void *cb_arg, const char *servername) | - | ||||||||||||||||||||||||
466 | { | - | ||||||||||||||||||||||||
467 | int rv = -1; | - | ||||||||||||||||||||||||
468 | - | |||||||||||||||||||||||||
469 | if (tls_connect_common(ctx, servername) != 0
| 0-2 | ||||||||||||||||||||||||
470 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
471 | - | |||||||||||||||||||||||||
472 | if (tls_set_cbs(ctx, read_cb, write_cb, cb_arg) != 0
| 0-2 | ||||||||||||||||||||||||
473 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
474 | - | |||||||||||||||||||||||||
475 | rv = 0; | - | ||||||||||||||||||||||||
476 | - | |||||||||||||||||||||||||
477 | err: code before this statement executed 2 times by 1 test: err: Executed by:
| 2 | ||||||||||||||||||||||||
478 | return executed 2 times by 1 test: (rv);return (rv); Executed by:
executed 2 times by 1 test: return (rv); Executed by:
| 2 | ||||||||||||||||||||||||
479 | } | - | ||||||||||||||||||||||||
480 | - | |||||||||||||||||||||||||
481 | int | - | ||||||||||||||||||||||||
482 | tls_handshake_client(struct tls *ctx) | - | ||||||||||||||||||||||||
483 | { | - | ||||||||||||||||||||||||
484 | X509 *cert = | - | ||||||||||||||||||||||||
485 | ((void *)0) | - | ||||||||||||||||||||||||
486 | ; | - | ||||||||||||||||||||||||
487 | int match, ssl_ret; | - | ||||||||||||||||||||||||
488 | int rv = -1; | - | ||||||||||||||||||||||||
489 | - | |||||||||||||||||||||||||
490 | if ((
| 0-17 | ||||||||||||||||||||||||
491 | tls_set_errorx(ctx, "not a client context"); | - | ||||||||||||||||||||||||
492 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
493 | } | - | ||||||||||||||||||||||||
494 | - | |||||||||||||||||||||||||
495 | if ((
| 1-16 | ||||||||||||||||||||||||
496 | tls_set_errorx(ctx, "context not connected"); | - | ||||||||||||||||||||||||
497 | goto executed 1 time by 1 test: err;goto err; Executed by:
executed 1 time by 1 test: goto err; Executed by:
| 1 | ||||||||||||||||||||||||
498 | } | - | ||||||||||||||||||||||||
499 | - | |||||||||||||||||||||||||
500 | ctx->state |= (1 << 3); | - | ||||||||||||||||||||||||
501 | - | |||||||||||||||||||||||||
502 | ERR_clear_error(); | - | ||||||||||||||||||||||||
503 | if ((
| 4-12 | ||||||||||||||||||||||||
504 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); | - | ||||||||||||||||||||||||
505 | goto executed 12 times by 1 test: err;goto err; Executed by:
executed 12 times by 1 test: goto err; Executed by:
| 12 | ||||||||||||||||||||||||
506 | } | - | ||||||||||||||||||||||||
507 | - | |||||||||||||||||||||||||
508 | if (ctx->config->verify_name
| 0-4 | ||||||||||||||||||||||||
509 | cert = SSL_get_peer_certificate(ctx->ssl_conn); | - | ||||||||||||||||||||||||
510 | if (cert ==
| 0 | ||||||||||||||||||||||||
511 | ((void *)0)
| 0 | ||||||||||||||||||||||||
512 | ) { | - | ||||||||||||||||||||||||
513 | tls_set_errorx(ctx, "no server certificate"); | - | ||||||||||||||||||||||||
514 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
515 | } | - | ||||||||||||||||||||||||
516 | if (tls_check_name(ctx, cert, ctx->servername, &match) == -1
| 0 | ||||||||||||||||||||||||
517 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
518 | if (!match
| 0 | ||||||||||||||||||||||||
519 | tls_set_errorx(ctx, "name `%s' not present in" | - | ||||||||||||||||||||||||
520 | " server certificate", ctx->servername); | - | ||||||||||||||||||||||||
521 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
522 | } | - | ||||||||||||||||||||||||
523 | } never executed: end of block | 0 | ||||||||||||||||||||||||
524 | - | |||||||||||||||||||||||||
525 | ctx->state |= (1 << 2); | - | ||||||||||||||||||||||||
526 | - | |||||||||||||||||||||||||
527 | if (ctx->config->session_fd != -1
| 0-4 | ||||||||||||||||||||||||
528 | if (tls_client_write_session(ctx) == -1
| 0 | ||||||||||||||||||||||||
529 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
530 | } never executed: end of block | 0 | ||||||||||||||||||||||||
531 | - | |||||||||||||||||||||||||
532 | rv = 0; | - | ||||||||||||||||||||||||
533 | - | |||||||||||||||||||||||||
534 | err: code before this statement executed 4 times by 1 test: err: Executed by:
| 4 | ||||||||||||||||||||||||
535 | X509_free(cert); | - | ||||||||||||||||||||||||
536 | - | |||||||||||||||||||||||||
537 | return executed 17 times by 1 test: (rv);return (rv); Executed by:
executed 17 times by 1 test: return (rv); Executed by:
| 17 | ||||||||||||||||||||||||
538 | } | - | ||||||||||||||||||||||||
Switch to Source code | Preprocessed file |