| 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 blockExecuted 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 blockExecuted 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 blockExecuted 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 |