1 /* $OpenBSD: tls_config.c,v 1.28 2016/08/22 14:55:59 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/stat.h> 19 20 #include <ctype.h> 21 #include <errno.h> 22 #include <fcntl.h> 23 #include <stdlib.h> 24 #include <unistd.h> 25 26 #include <tls.h> 27 #include "tls_internal.h" 28 29 static int 30 set_string(const char **dest, const char *src) 31 { 32 free((char *)*dest); 33 *dest = NULL; 34 if (src != NULL) 35 if ((*dest = strdup(src)) == NULL) 36 return -1; 37 return 0; 38 } 39 40 static void * 41 memdup(const void *in, size_t len) 42 { 43 void *out; 44 45 if ((out = malloc(len)) == NULL) 46 return NULL; 47 memcpy(out, in, len); 48 return out; 49 } 50 51 static int 52 set_mem(char **dest, size_t *destlen, const void *src, size_t srclen) 53 { 54 free(*dest); 55 *dest = NULL; 56 *destlen = 0; 57 if (src != NULL) 58 if ((*dest = memdup(src, srclen)) == NULL) 59 return -1; 60 *destlen = srclen; 61 return 0; 62 } 63 64 static struct tls_keypair * 65 tls_keypair_new() 66 { 67 return calloc(1, sizeof(struct tls_keypair)); 68 } 69 70 static int 71 tls_keypair_set_cert_file(struct tls_keypair *keypair, struct tls_error *error, 72 const char *cert_file) 73 { 74 return tls_config_load_file(error, "certificate", cert_file, 75 &keypair->cert_mem, &keypair->cert_len); 76 } 77 78 static int 79 tls_keypair_set_cert_mem(struct tls_keypair *keypair, const uint8_t *cert, 80 size_t len) 81 { 82 return set_mem(&keypair->cert_mem, &keypair->cert_len, cert, len); 83 } 84 85 static int 86 tls_keypair_set_key_file(struct tls_keypair *keypair, struct tls_error *error, 87 const char *key_file) 88 { 89 if (keypair->key_mem != NULL) 90 explicit_bzero(keypair->key_mem, keypair->key_len); 91 return tls_config_load_file(error, "key", key_file, 92 &keypair->key_mem, &keypair->key_len); 93 } 94 95 static int 96 tls_keypair_set_key_mem(struct tls_keypair *keypair, const uint8_t *key, 97 size_t len) 98 { 99 if (keypair->key_mem != NULL) 100 explicit_bzero(keypair->key_mem, keypair->key_len); 101 return set_mem(&keypair->key_mem, &keypair->key_len, key, len); 102 } 103 104 static void 105 tls_keypair_clear(struct tls_keypair *keypair) 106 { 107 tls_keypair_set_cert_mem(keypair, NULL, 0); 108 tls_keypair_set_key_mem(keypair, NULL, 0); 109 } 110 111 static void 112 tls_keypair_free(struct tls_keypair *keypair) 113 { 114 if (keypair == NULL) 115 return; 116 117 tls_keypair_clear(keypair); 118 119 free(keypair->cert_mem); 120 free(keypair->key_mem); 121 122 free(keypair); 123 } 124 125 int 126 tls_config_load_file(struct tls_error *error, const char *filetype, 127 const char *filename, char **buf, size_t *len) 128 { 129 struct stat st; 130 int fd = -1; 131 132 free(*buf); 133 *buf = NULL; 134 *len = 0; 135 136 if ((fd = open(filename, O_RDONLY)) == -1) { 137 tls_error_set(error, "failed to open %s file '%s'", 138 filetype, filename); 139 goto fail; 140 } 141 if (fstat(fd, &st) != 0) { 142 tls_error_set(error, "failed to stat %s file '%s'", 143 filetype, filename); 144 goto fail; 145 } 146 *len = (size_t)st.st_size; 147 if ((*buf = malloc(*len)) == NULL) { 148 tls_error_set(error, "failed to allocate buffer for " 149 "%s file", filetype); 150 goto fail; 151 } 152 if (read(fd, *buf, *len) != *len) { 153 tls_error_set(error, "failed to read %s file '%s'", 154 filetype, filename); 155 goto fail; 156 } 157 close(fd); 158 return 0; 159 160 fail: 161 if (fd != -1) 162 close(fd); 163 if (*buf != NULL) 164 explicit_bzero(*buf, *len); 165 free(*buf); 166 *buf = NULL; 167 *len = 0; 168 169 return -1; 170 } 171 172 struct tls_config * 173 tls_config_new(void) 174 { 175 struct tls_config *config; 176 177 if ((config = calloc(1, sizeof(*config))) == NULL) 178 return (NULL); 179 180 if ((config->keypair = tls_keypair_new()) == NULL) 181 goto err; 182 183 /* 184 * Default configuration. 185 */ 186 if (tls_config_set_dheparams(config, "none") != 0) 187 goto err; 188 if (tls_config_set_ecdhecurve(config, "auto") != 0) 189 goto err; 190 if (tls_config_set_ciphers(config, "secure") != 0) 191 goto err; 192 193 tls_config_set_protocols(config, TLS_PROTOCOLS_DEFAULT); 194 tls_config_set_verify_depth(config, 6); 195 196 tls_config_prefer_ciphers_server(config); 197 198 tls_config_verify(config); 199 200 return (config); 201 202 err: 203 tls_config_free(config); 204 return (NULL); 205 } 206 207 void 208 tls_config_free(struct tls_config *config) 209 { 210 struct tls_keypair *kp, *nkp; 211 212 if (config == NULL) 213 return; 214 215 for (kp = config->keypair; kp != NULL; kp = nkp) { 216 nkp = kp->next; 217 tls_keypair_free(kp); 218 } 219 220 free(config->error.msg); 221 222 free(config->alpn); 223 free((char *)config->ca_mem); 224 free((char *)config->ca_path); 225 free((char *)config->ciphers); 226 227 free(config); 228 } 229 230 static void 231 tls_config_keypair_add(struct tls_config *config, struct tls_keypair *keypair) 232 { 233 struct tls_keypair *kp; 234 235 kp = config->keypair; 236 while (kp->next != NULL) 237 kp = kp->next; 238 239 kp->next = keypair; 240 } 241 242 const char * 243 tls_config_error(struct tls_config *config) 244 { 245 return config->error.msg; 246 } 247 248 void 249 tls_config_clear_keys(struct tls_config *config) 250 { 251 struct tls_keypair *kp; 252 253 for (kp = config->keypair; kp != NULL; kp = kp->next) 254 tls_keypair_clear(kp); 255 256 tls_config_set_ca_mem(config, NULL, 0); 257 } 258 259 int 260 tls_config_parse_protocols(uint32_t *protocols, const char *protostr) 261 { 262 uint32_t proto, protos = 0; 263 char *s, *p, *q; 264 int negate; 265 266 if ((s = strdup(protostr)) == NULL) 267 return (-1); 268 269 q = s; 270 while ((p = strsep(&q, ",:")) != NULL) { 271 while (*p == ' ' || *p == '\t') 272 p++; 273 274 negate = 0; 275 if (*p == '!') { 276 negate = 1; 277 p++; 278 } 279 280 if (negate && protos == 0) 281 protos = TLS_PROTOCOLS_ALL; 282 283 proto = 0; 284 if (strcasecmp(p, "all") == 0 || 285 strcasecmp(p, "legacy") == 0) 286 proto = TLS_PROTOCOLS_ALL; 287 else if (strcasecmp(p, "default") == 0 || 288 strcasecmp(p, "secure") == 0) 289 proto = TLS_PROTOCOLS_DEFAULT; 290 if (strcasecmp(p, "tlsv1") == 0) 291 proto = TLS_PROTOCOL_TLSv1; 292 else if (strcasecmp(p, "tlsv1.0") == 0) 293 proto = TLS_PROTOCOL_TLSv1_0; 294 else if (strcasecmp(p, "tlsv1.1") == 0) 295 proto = TLS_PROTOCOL_TLSv1_1; 296 else if (strcasecmp(p, "tlsv1.2") == 0) 297 proto = TLS_PROTOCOL_TLSv1_2; 298 299 if (proto == 0) { 300 free(s); 301 return (-1); 302 } 303 304 if (negate) 305 protos &= ~proto; 306 else 307 protos |= proto; 308 } 309 310 *protocols = protos; 311 312 free(s); 313 314 return (0); 315 } 316 317 static int 318 tls_config_parse_alpn(struct tls_config *config, const char *alpn, 319 char **alpn_data, size_t *alpn_len) 320 { 321 size_t buf_len, i, len; 322 char *buf = NULL; 323 char *s = NULL; 324 char *p, *q; 325 326 free(*alpn_data); 327 *alpn_data = NULL; 328 *alpn_len = 0; 329 330 if ((buf_len = strlen(alpn) + 1) > 65535) { 331 tls_config_set_errorx(config, "alpn too large"); 332 goto err; 333 } 334 335 if ((buf = malloc(buf_len)) == NULL) { 336 tls_config_set_errorx(config, "out of memory"); 337 goto err; 338 } 339 340 if ((s = strdup(alpn)) == NULL) { 341 tls_config_set_errorx(config, "out of memory"); 342 goto err; 343 } 344 345 i = 0; 346 q = s; 347 while ((p = strsep(&q, ",")) != NULL) { 348 if ((len = strlen(p)) == 0) { 349 tls_config_set_errorx(config, 350 "alpn protocol with zero length"); 351 goto err; 352 } 353 if (len > 255) { 354 tls_config_set_errorx(config, 355 "alpn protocol too long"); 356 goto err; 357 } 358 buf[i++] = len & 0xff; 359 memcpy(&buf[i], p, len); 360 i += len; 361 } 362 363 free(s); 364 365 *alpn_data = buf; 366 *alpn_len = buf_len; 367 368 return (0); 369 370 err: 371 free(buf); 372 free(s); 373 374 return (-1); 375 } 376 377 int 378 tls_config_set_alpn(struct tls_config *config, const char *alpn) 379 { 380 return tls_config_parse_alpn(config, alpn, &config->alpn, 381 &config->alpn_len); 382 } 383 384 int 385 tls_config_add_keypair_file(struct tls_config *config, 386 const char *cert_file, const char *key_file) 387 { 388 struct tls_keypair *keypair; 389 390 if ((keypair = tls_keypair_new()) == NULL) 391 return (-1); 392 if (tls_keypair_set_cert_file(keypair, &config->error, cert_file) != 0) 393 goto err; 394 if (tls_keypair_set_key_file(keypair, &config->error, key_file) != 0) 395 goto err; 396 397 tls_config_keypair_add(config, keypair); 398 399 return (0); 400 401 err: 402 tls_keypair_free(keypair); 403 return (-1); 404 } 405 406 int 407 tls_config_add_keypair_mem(struct tls_config *config, const uint8_t *cert, 408 size_t cert_len, const uint8_t *key, size_t key_len) 409 { 410 struct tls_keypair *keypair; 411 412 if ((keypair = tls_keypair_new()) == NULL) 413 return (-1); 414 if (tls_keypair_set_cert_mem(keypair, cert, cert_len) != 0) 415 goto err; 416 if (tls_keypair_set_key_mem(keypair, key, key_len) != 0) 417 goto err; 418 419 tls_config_keypair_add(config, keypair); 420 421 return (0); 422 423 err: 424 tls_keypair_free(keypair); 425 return (-1); 426 } 427 428 int 429 tls_config_set_ca_file(struct tls_config *config, const char *ca_file) 430 { 431 return tls_config_load_file(&config->error, "CA", ca_file, 432 &config->ca_mem, &config->ca_len); 433 } 434 435 int 436 tls_config_set_ca_path(struct tls_config *config, const char *ca_path) 437 { 438 return set_string(&config->ca_path, ca_path); 439 } 440 441 int 442 tls_config_set_ca_mem(struct tls_config *config, const uint8_t *ca, size_t len) 443 { 444 return set_mem(&config->ca_mem, &config->ca_len, ca, len); 445 } 446 447 int 448 tls_config_set_cert_file(struct tls_config *config, const char *cert_file) 449 { 450 return tls_keypair_set_cert_file(config->keypair, &config->error, 451 cert_file); 452 } 453 454 int 455 tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, 456 size_t len) 457 { 458 return tls_keypair_set_cert_mem(config->keypair, cert, len); 459 } 460 461 int 462 tls_config_set_ciphers(struct tls_config *config, const char *ciphers) 463 { 464 SSL_CTX *ssl_ctx = NULL; 465 466 if (ciphers == NULL || 467 strcasecmp(ciphers, "default") == 0 || 468 strcasecmp(ciphers, "secure") == 0) 469 ciphers = TLS_CIPHERS_DEFAULT; 470 else if (strcasecmp(ciphers, "compat") == 0) 471 ciphers = TLS_CIPHERS_COMPAT; 472 else if (strcasecmp(ciphers, "legacy") == 0) 473 ciphers = TLS_CIPHERS_LEGACY; 474 else if (strcasecmp(ciphers, "all") == 0 || 475 strcasecmp(ciphers, "insecure") == 0) 476 ciphers = TLS_CIPHERS_ALL; 477 478 if ((ssl_ctx = SSL_CTX_new(SSLv23_method())) == NULL) { 479 tls_config_set_errorx(config, "out of memory"); 480 goto fail; 481 } 482 if (SSL_CTX_set_cipher_list(ssl_ctx, ciphers) != 1) { 483 tls_config_set_errorx(config, "no ciphers for '%s'", ciphers); 484 goto fail; 485 } 486 487 SSL_CTX_free(ssl_ctx); 488 return set_string(&config->ciphers, ciphers); 489 490 fail: 491 SSL_CTX_free(ssl_ctx); 492 return -1; 493 } 494 495 int 496 tls_config_set_dheparams(struct tls_config *config, const char *params) 497 { 498 int keylen; 499 500 if (params == NULL || strcasecmp(params, "none") == 0) 501 keylen = 0; 502 else if (strcasecmp(params, "auto") == 0) 503 keylen = -1; 504 else if (strcasecmp(params, "legacy") == 0) 505 keylen = 1024; 506 else { 507 tls_config_set_errorx(config, "invalid dhe param '%s'", params); 508 return (-1); 509 } 510 511 config->dheparams = keylen; 512 513 return (0); 514 } 515 516 int 517 tls_config_set_ecdhecurve(struct tls_config *config, const char *name) 518 { 519 int nid; 520 521 if (name == NULL || strcasecmp(name, "none") == 0) 522 nid = NID_undef; 523 else if (strcasecmp(name, "auto") == 0) 524 nid = -1; 525 else if ((nid = OBJ_txt2nid(name)) == NID_undef) { 526 tls_config_set_errorx(config, "invalid ecdhe curve '%s'", name); 527 return (-1); 528 } 529 530 config->ecdhecurve = nid; 531 532 return (0); 533 } 534 535 int 536 tls_config_set_key_file(struct tls_config *config, const char *key_file) 537 { 538 return tls_keypair_set_key_file(config->keypair, &config->error, 539 key_file); 540 } 541 542 int 543 tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, 544 size_t len) 545 { 546 return tls_keypair_set_key_mem(config->keypair, key, len); 547 } 548 549 int 550 tls_config_set_keypair_file(struct tls_config *config, 551 const char *cert_file, const char *key_file) 552 { 553 if (tls_config_set_cert_file(config, cert_file) != 0) 554 return (-1); 555 if (tls_config_set_key_file(config, key_file) != 0) 556 return (-1); 557 558 return (0); 559 } 560 561 int 562 tls_config_set_keypair_mem(struct tls_config *config, const uint8_t *cert, 563 size_t cert_len, const uint8_t *key, size_t key_len) 564 { 565 if (tls_config_set_cert_mem(config, cert, cert_len) != 0) 566 return (-1); 567 if (tls_config_set_key_mem(config, key, key_len) != 0) 568 return (-1); 569 570 return (0); 571 } 572 573 void 574 tls_config_set_protocols(struct tls_config *config, uint32_t protocols) 575 { 576 config->protocols = protocols; 577 } 578 579 void 580 tls_config_set_verify_depth(struct tls_config *config, int verify_depth) 581 { 582 config->verify_depth = verify_depth; 583 } 584 585 void 586 tls_config_prefer_ciphers_client(struct tls_config *config) 587 { 588 config->ciphers_server = 0; 589 } 590 591 void 592 tls_config_prefer_ciphers_server(struct tls_config *config) 593 { 594 config->ciphers_server = 1; 595 } 596 597 void 598 tls_config_insecure_noverifycert(struct tls_config *config) 599 { 600 config->verify_cert = 0; 601 } 602 603 void 604 tls_config_insecure_noverifyname(struct tls_config *config) 605 { 606 config->verify_name = 0; 607 } 608 609 void 610 tls_config_insecure_noverifytime(struct tls_config *config) 611 { 612 config->verify_time = 0; 613 } 614 615 void 616 tls_config_verify(struct tls_config *config) 617 { 618 config->verify_cert = 1; 619 config->verify_name = 1; 620 config->verify_time = 1; 621 } 622 623 void 624 tls_config_verify_client(struct tls_config *config) 625 { 626 config->verify_client = 1; 627 } 628 629 void 630 tls_config_verify_client_optional(struct tls_config *config) 631 { 632 config->verify_client = 2; 633 } 634