1 /* $NetBSD: tls_dane.c,v 1.7 2026/05/09 18:49:21 christos Exp $ */ 2 3 /*++ 4 /* NAME 5 /* tls_dane 3 6 /* SUMMARY 7 /* Support for RFC 6698, 7671, 7672 (DANE) certificate matching 8 /* SYNOPSIS 9 /* #include <tls.h> 10 /* 11 /* void tls_dane_loglevel(log_param, log_level); 12 /* const char *log_param; 13 /* const char *log_level; 14 /* 15 /* int tls_dane_avail() 16 /* 17 /* void tls_dane_flush() 18 /* 19 /* TLS_DANE *tls_dane_alloc() 20 /* 21 /* void tls_tlsa_free(tlsa) 22 /* TLS_TLSA *tlsa; 23 /* 24 /* void tls_dane_free(dane) 25 /* TLS_DANE *dane; 26 /* 27 /* void tls_dane_add_fpt_digests(dane, pkey_only, digest, delim, smtp_mode) 28 /* TLS_DANE *dane; 29 /* int pkey_only; 30 /* const char *digest; 31 /* const char *delim; 32 /* int smtp_mode; 33 /* 34 /* TLS_TLSA *tlsa_prepend(tlsa, usage, selector, mtype, data, len) 35 /* TLS_TLSA *tlsa; 36 /* uint8_t usage; 37 /* uint8_t selector; 38 /* uint8_t mtype; 39 /* const unsigned char *data; 40 /* uint16_t length; 41 /* 42 /* int tls_dane_load_trustfile(dane, tafile) 43 /* TLS_DANE *dane; 44 /* const char *tafile; 45 /* 46 /* TLS_DANE *tls_dane_resolve(port, proto, hostrr, forcetlsa) 47 /* unsigned port; 48 /* const char *proto; 49 /* DNS_RR *hostrr; 50 /* int forcetlsa; 51 /* 52 /* void tls_dane_digest_init(ctx, fpt_alg) 53 /* SSL_CTX *ctx; 54 /* const EVP_MD *fpt_alg; 55 /* 56 /* void tls_dane_enable(TLScontext) 57 /* TLS_SESS_STATE *TLScontext; 58 /* 59 /* void tls_dane_log(TLScontext) 60 /* TLS_SESS_STATE *TLScontext; 61 /* 62 /* int tls_dane_unusable(dane) 63 /* const TLS_DANE *dane; 64 /* 65 /* int tls_dane_notfound(dane) 66 /* const TLS_DANE *dane; 67 /* DESCRIPTION 68 /* tls_dane_loglevel() allows the policy lookup functions in the DANE 69 /* library to examine the application's TLS loglevel in and possibly 70 /* produce a more detailed activity log. 71 /* 72 /* tls_dane_avail() returns true if the features required to support DANE 73 /* are present in libresolv. 74 /* 75 /* tls_dane_flush() flushes all entries from the cache, and deletes 76 /* the cache. 77 /* 78 /* tls_dane_alloc() returns a pointer to a newly allocated TLS_DANE 79 /* structure with null ta and ee digest sublists. 80 /* 81 /* tls_tlsa_free() frees a TLSA record linked list. 82 /* 83 /* tls_dane_free() frees the structure allocated by tls_dane_alloc(). 84 /* 85 /* tls_dane_digest_init() configures OpenSSL to support the configured 86 /* DANE TLSA digests and private-use fingerprint digest. 87 /* 88 /* tlsa_prepend() prepends a TLSA record to the head of a linked list 89 /* which may be null when the list is empty. The result value is the 90 /* new list head. 91 /* 92 /* tls_dane_add_fpt_digests() splits "digest" using the characters in 93 /* "delim" as delimiters and generates corresponding synthetic DANE TLSA 94 /* records with matching type 255 (private-use), which we associated with 95 /* the configured fingerprint digest algorithm. This is an incremental 96 /* interface, that builds a TLS_DANE structure outside the cache by 97 /* manually adding entries. 98 /* 99 /* tls_dane_load_trustfile() imports trust-anchor certificates and 100 /* public keys from a file (rather than DNS TLSA records). 101 /* 102 /* tls_dane_resolve() maps a (port, protocol, hostrr) tuple to a 103 /* corresponding TLS_DANE policy structure found in the DNS. The port 104 /* argument is in network byte order. A null pointer is returned when 105 /* the DNS query for the TLSA record tempfailed. In all other cases the 106 /* return value is a pointer to the corresponding TLS_DANE structure. 107 /* The caller must free the structure via tls_dane_free(). 108 /* 109 /* tls_dane_enable() enables DANE-style certificate checks for connections 110 /* that are configured with TLSA records. The TLSA records may be from 111 /* DNS (at the "dane", "dane-only" and "half-dane" security levels), or be 112 /* synthetic in support of either the "fingerprint" level or local trust 113 /* anchor based validation with the "secure" and "verify" levels. The 114 /* return value is the number of "usable" TLSA records loaded, or negative 115 /* if a record failed to load due to an internal OpenSSL problems, rather 116 /* than an issue with the record making that record "unusable". 117 /* 118 /* tls_dane_log() logs successful verification via DNS-based or 119 /* synthetic DANE TLSA RRs (fingerprint or "tafile"). 120 /* 121 /* tls_dane_unusable() checks whether a cached TLS_DANE record is 122 /* the result of a validated RRset, with no usable elements. In 123 /* this case, TLS is mandatory, but certificate verification is 124 /* not DANE-based. 125 /* 126 /* tls_dane_notfound() checks whether a cached TLS_DANE record is 127 /* the result of a validated DNS lookup returning NODATA. In 128 /* this case, TLS is not required by RFC, though users may elect 129 /* a mandatory TLS fallback policy. 130 /* 131 /* Arguments: 132 /* .IP ctx 133 /* SSL context to be configured with the chosen digest algorithms. 134 /* .IP fpt_alg 135 /* The OpenSSL EVP digest algorithm handle for the fingerprint digest. 136 /* .IP pkey_only 137 /* When true, generate "fingerprint" TLSA records for just the public 138 /* keys. Otherwise, for both certificates and public keys. 139 /* .IP tlsa 140 /* TLSA record linked list head, initially NULL. 141 /* .IP usage 142 /* DANE TLSA certificate usage field. 143 /* .IP selector 144 /* DANE TLSA selector field. 145 /* .IP mtype 146 /* DANE TLSA matching type field 147 /* .IP data 148 /* DANE TLSA associated data field (raw binary form), copied for internal 149 /* use. The caller is responsible for freeing his own copy. 150 /* .IP length 151 /* Length of DANE TLSA associated DATA field. 152 /* .IP dane 153 /* Pointer to a TLS_DANE structure that lists the valid trust-anchor 154 /* and end-entity full-certificate and/or public-key digests. 155 /* .IP port 156 /* The TCP port in network byte order. 157 /* .IP proto 158 /* Almost certainly "tcp". 159 /* .IP hostrr 160 /* DNS_RR pointer to TLSA base domain data. 161 /* .IP forcetlsa 162 /* When true, TLSA lookups are performed even when the qname and rname 163 /* are insecure. This is only useful in the unlikely case that DLV is 164 /* used to secure the TLSA RRset in an otherwise insecure zone. 165 /* .IP log_param 166 /* The TLS log level parameter name whose value is the log_level argument. 167 /* .IP log_level 168 /* The application TLS log level, which may affect dane lookup verbosity. 169 /* .IP digest 170 /* The digest (or list of digests concatenated with characters from 171 /* "delim") to be added to the TLS_DANE record. 172 /* .IP delim 173 /* The set of delimiter characters used above. 174 /* .IP smtp_mode 175 /* Is the caller an SMTP client or an LMTP client? 176 /* .IP tafile; 177 /* A file with trust anchor certificates or public keys in PEM format. 178 /* LICENSE 179 /* .ad 180 /* .fi 181 /* This software is free. You can do with it whatever you want. 182 /* The original author kindly requests that you acknowledge 183 /* the use of his software. 184 /* AUTHOR(S) 185 /* Wietse Venema 186 /* IBM T.J. Watson Research 187 /* P.O. Box 704 188 /* Yorktown Heights, NY 10598, USA 189 /* 190 /* Wietse Venema 191 /* Google, Inc. 192 /* 111 8th Avenue 193 /* New York, NY 10011, USA 194 /* 195 /* Viktor Dukhovni 196 /*--*/ 197 198 /* System library. */ 199 200 #include <sys_defs.h> 201 #include <ctype.h> 202 203 #ifdef STRCASECMP_IN_STRINGS_H 204 #include <strings.h> 205 #endif 206 207 #ifdef USE_TLS 208 #include <string.h> 209 210 /* Utility library. */ 211 212 #include <msg.h> 213 #include <mymalloc.h> 214 #include <stringops.h> 215 #include <midna_domain.h> 216 #include <vstring.h> 217 #include <events.h> /* event_time() */ 218 #include <timecmp.h> 219 #include <ctable.h> 220 #include <hex_code.h> 221 #include <safe_ultostr.h> 222 #include <split_at.h> 223 #include <name_code.h> 224 225 #define STR(x) vstring_str(x) 226 227 /* Global library */ 228 229 #include <mail_params.h> 230 231 /* DNS library. */ 232 233 #include <dns.h> 234 235 /* TLS library. */ 236 237 #define TLS_INTERNAL 238 #include <tls.h> 239 240 /* Application-specific. */ 241 242 #undef DANE_TLSA_SUPPORT 243 244 #if RES_USE_DNSSEC && RES_USE_EDNS0 245 #define DANE_TLSA_SUPPORT 246 static int dane_tlsa_support = 1; 247 248 #else 249 static int dane_tlsa_support = 0; 250 251 #endif 252 253 /* 254 * A NULL alg field disables the algorithm at the codepoint passed to the 255 * SSL_CTX_dane_mtype_set(3) function. The ordinals are used for digest 256 * agility, higher is "better" (presumed stronger). 257 */ 258 typedef struct dane_mtype { 259 const EVP_MD *alg; 260 uint8_t ord; 261 } dane_mtype; 262 263 /* 264 * This is not intended to be a long-term cache of pre-parsed TLSA data, 265 * rather we primarily want to avoid fetching and parsing the TLSA records 266 * for a single multi-homed MX host more than once per delivery. Therefore, 267 * we keep the table reasonably small. 268 */ 269 #define CACHE_SIZE 20 270 static CTABLE *dane_cache; 271 272 static int log_mask; 273 274 /* tls_dane_logmask - configure policy lookup logging */ 275 276 void tls_dane_loglevel(const char *log_param, const char *log_level) 277 { 278 log_mask = tls_log_mask(log_param, log_level); 279 } 280 281 /* tls_dane_avail - check for availability of dane required digests */ 282 283 int tls_dane_avail(void) 284 { 285 return (dane_tlsa_support); 286 } 287 288 /* tls_dane_alloc - allocate a TLS_DANE structure */ 289 290 TLS_DANE *tls_dane_alloc(void) 291 { 292 TLS_DANE *dane = (TLS_DANE *) mymalloc(sizeof(*dane)); 293 294 dane->tlsa = 0; 295 dane->base_domain = 0; 296 dane->flags = 0; 297 dane->expires = 0; 298 dane->refs = 1; 299 return (dane); 300 } 301 302 /* tls_tlsa_free - free a TLSA RR linked list */ 303 304 void tls_tlsa_free(TLS_TLSA *tlsa) 305 { 306 TLS_TLSA *next; 307 308 for (; tlsa; tlsa = next) { 309 next = tlsa->next; 310 myfree(tlsa->data); 311 myfree(tlsa); 312 } 313 } 314 315 /* tls_dane_free - free a TLS_DANE structure */ 316 317 void tls_dane_free(TLS_DANE *dane) 318 { 319 if (--dane->refs > 0) 320 return; 321 if (dane->base_domain) 322 myfree(dane->base_domain); 323 if (dane->tlsa) 324 tls_tlsa_free(dane->tlsa); 325 myfree((void *) dane); 326 } 327 328 /* tlsa_prepend - Prepend internal-form TLSA record to the RRset linked list */ 329 330 TLS_TLSA *tlsa_prepend(TLS_TLSA *tlsa, uint8_t usage, uint8_t selector, 331 uint8_t mtype, const unsigned char *data, 332 uint16_t data_len) 333 { 334 TLS_TLSA *head; 335 336 head = (TLS_TLSA *) mymalloc(sizeof(*head)); 337 head->usage = usage; 338 head->selector = selector; 339 head->mtype = mtype; 340 head->length = data_len; 341 head->data = (unsigned char *) mymemdup(data, data_len); 342 head->next = tlsa; 343 return (head); 344 } 345 346 #define MAX_HEAD_BYTES 32 347 #define MAX_TAIL_BYTES 32 348 #define MAX_DUMP_BYTES (MAX_HEAD_BYTES + MAX_TAIL_BYTES) 349 350 /* tlsa_info - log import of a particular TLSA record */ 351 352 static void tlsa_info(const char *tag, const char *msg, 353 uint8_t u, uint8_t s, uint8_t m, 354 const unsigned char *data, ssize_t dlen) 355 { 356 static VSTRING *top; 357 static VSTRING *bot; 358 359 if (top == 0) 360 top = vstring_alloc(2 * MAX_HEAD_BYTES); 361 if (bot == 0) 362 bot = vstring_alloc(2 * MAX_TAIL_BYTES); 363 364 if (dlen > MAX_DUMP_BYTES) { 365 hex_encode(top, (char *) data, MAX_HEAD_BYTES); 366 hex_encode(bot, (char *) data + dlen - MAX_TAIL_BYTES, MAX_TAIL_BYTES); 367 } else if (dlen > 0) { 368 hex_encode(top, (char *) data, dlen); 369 } else { 370 vstring_sprintf(top, "..."); 371 } 372 373 msg_info("%s: %s: %u %u %u %s%s%s", tag, msg, u, s, m, STR(top), 374 dlen > MAX_DUMP_BYTES ? "..." : "", 375 dlen > MAX_DUMP_BYTES ? STR(bot) : ""); 376 } 377 378 /* tlsa_carp - carp about a particular TLSA record */ 379 380 static void tlsa_carp(const char *s1, const char *s2, const char *s3, 381 const char *s4, uint8_t u, uint8_t s, uint8_t m, 382 const unsigned char *data, ssize_t dlen) 383 { 384 static VSTRING *top; 385 static VSTRING *bot; 386 387 if (top == 0) 388 top = vstring_alloc(2 * MAX_HEAD_BYTES); 389 if (bot == 0) 390 bot = vstring_alloc(2 * MAX_TAIL_BYTES); 391 392 if (dlen > MAX_DUMP_BYTES) { 393 hex_encode(top, (char *) data, MAX_HEAD_BYTES); 394 hex_encode(bot, (char *) data + dlen - MAX_TAIL_BYTES, MAX_TAIL_BYTES); 395 } else if (dlen > 0) { 396 hex_encode(top, (char *) data, dlen); 397 } else { 398 vstring_sprintf(top, "..."); 399 } 400 401 msg_warn("%s%s%s %s: %u %u %u %s%s%s", s1, s2, s3, s4, u, s, m, STR(top), 402 dlen > MAX_DUMP_BYTES ? "..." : "", 403 dlen > MAX_DUMP_BYTES ? STR(bot) : ""); 404 } 405 406 /* tls_dane_flush - flush the cache */ 407 408 void tls_dane_flush(void) 409 { 410 if (dane_cache) 411 ctable_free(dane_cache); 412 dane_cache = 0; 413 } 414 415 /* dane_free - ctable style */ 416 417 static void dane_free(void *dane, void *unused_context) 418 { 419 tls_dane_free((TLS_DANE *) dane); 420 } 421 422 /* tls_dane_add_fpt_digests - map fingerprint list to DANE TLSA RRset */ 423 424 void tls_dane_add_fpt_digests(TLS_DANE *dane, int pkey_only, 425 const char *digest, const char *delim, 426 int smtp_mode) 427 { 428 ARGV *values = argv_split(digest, delim); 429 ssize_t i; 430 431 if (smtp_mode) { 432 if (warn_compat_break_smtp_tls_fpt_dgst) 433 msg_info("using backwards-compatible default setting " 434 VAR_SMTP_TLS_FPT_DGST "=md5 to compute certificate " 435 "fingerprints"); 436 } else { 437 if (warn_compat_break_lmtp_tls_fpt_dgst) 438 msg_info("using backwards-compatible default setting " 439 VAR_LMTP_TLS_FPT_DGST "=md5 to compute certificate " 440 "fingerprints"); 441 } 442 443 for (i = 0; i < values->argc; ++i) { 444 const char *cp = values->argv[i]; 445 size_t ilen = strlen(cp); 446 VSTRING *raw; 447 448 /* 449 * Decode optionally colon-separated hex-encoded string, the input 450 * value requires at most 3 bytes per byte of payload, which must not 451 * exceed the size of the widest supported hash function. 452 */ 453 if (ilen > 3 * EVP_MAX_MD_SIZE) { 454 msg_warn("malformed fingerprint value: %.100s...", 455 values->argv[i]); 456 continue; 457 } 458 raw = vstring_alloc(ilen / 2); 459 if (hex_decode_opt(raw, cp, ilen, HEX_DECODE_FLAG_ALLOW_COLON) == 0) { 460 myfree(raw); 461 msg_warn("malformed fingerprint value: %.384s", values->argv[i]); 462 continue; 463 } 464 #define USTR_LEN(raw) (unsigned char *) STR(raw), VSTRING_LEN(raw) 465 466 /* 467 * At the "fingerprint" security level certificate digests and public 468 * key digests are by default interchangeable. Each leaf certificate 469 * is matched via either the public key digest or full certificate 470 * digest. The DER encoding of a certificate is not a valid public 471 * key, and conversely, the DER encoding of a public key is not a 472 * valid certificate. An attacker would need a 2nd-preimage that is 473 * feasible across types (given cert digest == some pkey digest) and 474 * yet presumably difficult within a type (e.g. given cert digest == 475 * some other cert digest). No such attacks are known at this time, 476 * and it is expected that if any are found they would work within as 477 * well as across the cert/pkey data types. 478 * 479 * That said, when `pkey_only` is true, we match only public keys. 480 * 481 * The private-use matching type "255" is mapped to the configured 482 * fingerprint digest, which may (harmlessly) coincide with one of 483 * the standard DANE digest algorithms. The private code point is 484 * however unconditionally enabled. 485 */ 486 if (!pkey_only) { 487 dane->tlsa = tlsa_prepend(dane->tlsa, 3, 0, 255, USTR_LEN(raw)); 488 if (log_mask & (TLS_LOG_VERBOSE | TLS_LOG_DANE)) 489 tlsa_info("fingerprint", "digest as private-use TLSA record", 490 3, 0, 255, USTR_LEN(raw)); 491 } 492 /* The public key match is unconditional */ 493 dane->tlsa = tlsa_prepend(dane->tlsa, 3, 1, 255, USTR_LEN(raw)); 494 if (log_mask & (TLS_LOG_VERBOSE | TLS_LOG_DANE)) 495 tlsa_info("fingerprint", "digest as private-use TLSA record", 496 3, 1, 255, USTR_LEN(raw)); 497 498 vstring_free(raw); 499 } 500 argv_free(values); 501 } 502 503 /* parse_tlsa_rr - parse a validated TLSA RRset */ 504 505 static int parse_tlsa_rr(TLS_DANE *dane, DNS_RR *rr) 506 { 507 const uint8_t *ip; 508 uint8_t usage; 509 uint8_t selector; 510 uint8_t mtype; 511 ssize_t dlen; 512 unsigned const char *data; 513 int iscname = strcasecmp(rr->rname, rr->qname); 514 const char *q = iscname ? rr->qname : ""; 515 const char *a = iscname ? " -> " : ""; 516 const char *r = rr->rname; 517 518 if (rr->type != T_TLSA) 519 msg_panic("%s%s%s: unexpected non-TLSA RR type: %u", 520 q, a, r, rr->type); 521 522 /* Drop truncated records */ 523 if ((dlen = rr->data_len - 3) < 0) { 524 msg_warn("%s%s%s: truncated TLSA RR length == %u", 525 q, a, r, (unsigned) rr->data_len); 526 return (0); 527 } 528 ip = (const uint8_t *) rr->data; 529 usage = *ip++; 530 selector = *ip++; 531 mtype = *ip++; 532 data = (const unsigned char *) ip; 533 534 /*- 535 * Drop unsupported usages. 536 * Note: NO SUPPORT for usages 0/1 which do not apply to SMTP. 537 */ 538 switch (usage) { 539 case DNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION: 540 case DNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE: 541 break; 542 default: 543 tlsa_carp(q, a, r, "unsupported TLSA certificate usage", 544 usage, selector, mtype, data, dlen); 545 return (0); 546 } 547 548 /* 549 * Drop private-use matching type, reserved for fingerprint matching. 550 */ 551 if (mtype == 255) { 552 tlsa_carp(q, a, r, "reserved private-use matching type", 553 usage, selector, mtype, data, dlen); 554 return (0); 555 } 556 if (log_mask & (TLS_LOG_VERBOSE | TLS_LOG_DANE)) 557 tlsa_info("DNSSEC-signed TLSA record", r, 558 usage, selector, mtype, data, dlen); 559 dane->tlsa = tlsa_prepend(dane->tlsa, usage, selector, mtype, data, dlen); 560 return (1); 561 } 562 563 /* dane_lookup - TLSA record lookup, ctable style */ 564 565 static void *dane_lookup(const char *tlsa_fqdn, void *unused_ctx) 566 { 567 static VSTRING *why = 0; 568 DNS_RR *rrs = 0; 569 DNS_RR *rr; 570 TLS_DANE *dane = tls_dane_alloc(); 571 int ret; 572 573 if (why == 0) 574 why = vstring_alloc(10); 575 576 ret = dns_lookup(tlsa_fqdn, T_TLSA, RES_USE_DNSSEC, &rrs, 0, why); 577 578 switch (ret) { 579 case DNS_OK: 580 if (TLS_DANE_CACHE_TTL_MIN && rrs->ttl < TLS_DANE_CACHE_TTL_MIN) 581 rrs->ttl = TLS_DANE_CACHE_TTL_MIN; 582 if (TLS_DANE_CACHE_TTL_MAX && rrs->ttl > TLS_DANE_CACHE_TTL_MAX) 583 rrs->ttl = TLS_DANE_CACHE_TTL_MAX; 584 585 /* One more second to account for discrete time */ 586 dane->expires = 1 + event_time() + rrs->ttl; 587 588 if (rrs->dnssec_valid) { 589 int n = 0; 590 591 for (rr = rrs; rr != 0; rr = rr->next) 592 n += parse_tlsa_rr(dane, rr); 593 if (n == 0) 594 dane->flags |= TLS_DANE_FLAG_EMPTY; 595 } else 596 dane->flags |= TLS_DANE_FLAG_NORRS; 597 598 if (rrs) 599 dns_rr_free(rrs); 600 break; 601 602 case DNS_NOTFOUND: 603 dane->flags |= TLS_DANE_FLAG_NORRS; 604 dane->expires = 1 + event_time() + TLS_DANE_CACHE_TTL_MIN; 605 break; 606 607 default: 608 msg_warn("DANE TLSA lookup problem: %s", STR(why)); 609 dane->flags |= TLS_DANE_FLAG_ERROR; 610 break; 611 } 612 613 return (void *) dane; 614 } 615 616 /* resolve_host - resolve TLSA RRs for hostname (rname or qname) */ 617 618 static TLS_DANE *resolve_host(const char *host, const char *proto, 619 unsigned port) 620 { 621 static VSTRING *query_domain; 622 TLS_DANE *dane; 623 624 if (query_domain == 0) 625 query_domain = vstring_alloc(64); 626 627 vstring_sprintf(query_domain, "_%u._%s.%s", ntohs(port), proto, host); 628 dane = (TLS_DANE *) ctable_locate(dane_cache, STR(query_domain)); 629 if (timecmp(event_time(), dane->expires) > 0) 630 dane = (TLS_DANE *) ctable_refresh(dane_cache, STR(query_domain)); 631 if (dane->base_domain == 0) 632 dane->base_domain = mystrdup(host); 633 /* Increment ref-count of cached entry */ 634 ++dane->refs; 635 return (dane); 636 } 637 638 /* qname_secure - Lookup qname DNSSEC status */ 639 640 static int qname_secure(const char *qname) 641 { 642 static VSTRING *why; 643 int ret = 0; 644 DNS_RR *rrs; 645 646 if (!why) 647 why = vstring_alloc(10); 648 649 /* 650 * We assume that qname is already an fqdn, and does not need any 651 * suffixes from RES_DEFNAME or RES_DNSRCH. This is typically the name 652 * of an MX host, and must be a complete DNS name. DANE initialization 653 * code in the SMTP client is responsible for checking that the default 654 * resolver flags do not include RES_DEFNAME and RES_DNSRCH. 655 */ 656 ret = dns_lookup(qname, T_CNAME, RES_USE_DNSSEC, &rrs, 0, why); 657 if (ret == DNS_OK) { 658 ret = rrs->dnssec_valid; 659 dns_rr_free(rrs); 660 return (ret); 661 } 662 if (ret == DNS_NOTFOUND) 663 vstring_sprintf(why, "no longer a CNAME"); 664 msg_warn("DNSSEC status lookup error for %s: %s", qname, STR(why)); 665 return (-1); 666 } 667 668 /* tls_dane_resolve - cached map: (name, proto, port) -> TLS_DANE */ 669 670 TLS_DANE *tls_dane_resolve(unsigned port, const char *proto, DNS_RR *hostrr, 671 int forcetlsa) 672 { 673 TLS_DANE *dane = 0; 674 int iscname = strcasecmp(hostrr->rname, hostrr->qname); 675 int isvalid = 1; 676 677 if (!tls_dane_avail()) 678 return (0); /* Error */ 679 680 /* 681 * By default suppress TLSA lookups for hosts in non-DNSSEC zones. If 682 * the host zone is not DNSSEC validated, the TLSA qname sub-domain is 683 * safely assumed to not be in a DNSSEC Look-aside Validation child zone. 684 */ 685 if (!forcetlsa && !hostrr->dnssec_valid) { 686 isvalid = iscname ? qname_secure(hostrr->qname) : 0; 687 if (isvalid < 0) 688 return (0); /* Error */ 689 } 690 if (!isvalid) { 691 dane = tls_dane_alloc(); 692 dane->flags = TLS_DANE_FLAG_NORRS; 693 } else { 694 if (!dane_cache) 695 dane_cache = ctable_create(CACHE_SIZE, dane_lookup, dane_free, 0); 696 697 /* 698 * Try the rname first if secure, if nothing there, try the qname if 699 * different. Note, lookup errors are distinct from success with 700 * nothing found. If the rname lookup fails we don't try the qname. 701 */ 702 if (hostrr->dnssec_valid) { 703 dane = resolve_host(hostrr->rname, proto, port); 704 if (tls_dane_notfound(dane) && iscname) { 705 tls_dane_free(dane); 706 dane = 0; 707 } 708 } 709 if (!dane) 710 dane = resolve_host(hostrr->qname, proto, port); 711 if (dane->flags & TLS_DANE_FLAG_ERROR) { 712 /* We don't return this object. */ 713 tls_dane_free(dane); 714 dane = 0; 715 } 716 } 717 718 return (dane); 719 } 720 721 /* tls_dane_load_trustfile - load trust anchor certs or keys from file */ 722 723 int tls_dane_load_trustfile(TLS_DANE *dane, const char *tafile) 724 { 725 BIO *bp; 726 char *name = 0; 727 char *header = 0; 728 unsigned char *data = 0; 729 long len; 730 int tacount; 731 char *errtype = 0; /* if error: cert or pkey? */ 732 733 /* nop */ 734 if (tafile == 0 || *tafile == 0) 735 return (1); 736 737 /* 738 * On each call, PEM_read() wraps a stdio file in a BIO_NOCLOSE bio, 739 * calls PEM_read_bio() and then frees the bio. It is just as easy to 740 * open a BIO as a stdio file, so we use BIOs and call PEM_read_bio() 741 * directly. 742 */ 743 if ((bp = BIO_new_file(tafile, "r")) == NULL) { 744 msg_warn("error opening trust anchor file: %s: %m", tafile); 745 return (0); 746 } 747 /* Don't report old news */ 748 ERR_clear_error(); 749 750 /* 751 * OpenSSL implements DANE strictly, with DANE-TA(2) only matching issuer 752 * certificates, and never the leaf cert. We also allow the 753 * trust-anchors to directly match the leaf certificate or public key. 754 */ 755 for (tacount = 0; 756 errtype == 0 && PEM_read_bio(bp, &name, &header, &data, &len); 757 ++tacount) { 758 uint8_t daneta = DNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION; 759 uint8_t daneee = DNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE; 760 uint8_t mtype = DNS_TLSA_MATCHING_TYPE_NO_HASH_USED; 761 762 if (strcmp(name, PEM_STRING_X509) == 0 763 || strcmp(name, PEM_STRING_X509_OLD) == 0) { 764 uint8_t selector = DNS_TLSA_SELECTOR_FULL_CERTIFICATE; 765 766 if (log_mask & (TLS_LOG_VERBOSE | TLS_LOG_DANE)) 767 tlsa_info("TA cert as TLSA record", tafile, 768 daneta, selector, mtype, data, len); 769 dane->tlsa = 770 tlsa_prepend(dane->tlsa, daneta, selector, mtype, data, len); 771 dane->tlsa = 772 tlsa_prepend(dane->tlsa, daneee, selector, mtype, data, len); 773 } else if (strcmp(name, PEM_STRING_PUBLIC) == 0) { 774 uint8_t selector = DNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO; 775 776 if (log_mask & (TLS_LOG_VERBOSE | TLS_LOG_DANE)) 777 tlsa_info("TA pkey as TLSA record", tafile, 778 daneta, selector, mtype, data, len); 779 dane->tlsa = 780 tlsa_prepend(dane->tlsa, daneta, selector, mtype, data, len); 781 dane->tlsa = tlsa_prepend(dane->tlsa, daneee, selector, mtype, data, len); 782 } 783 784 /* 785 * If any of these were null, PEM_read() would have failed. 786 */ 787 OPENSSL_free(name); 788 OPENSSL_free(header); 789 OPENSSL_free(data); 790 } 791 BIO_free(bp); 792 793 if (errtype) { 794 tls_print_errors(); 795 msg_warn("error reading: %s: malformed trust-anchor %s", 796 tafile, errtype); 797 return (0); 798 } 799 if (ERR_GET_REASON(ERR_peek_last_error()) == PEM_R_NO_START_LINE) { 800 /* Reached end of PEM file */ 801 ERR_clear_error(); 802 return (tacount > 0); 803 } 804 /* Some other PEM read error */ 805 tls_print_errors(); 806 return (0); 807 } 808 809 int tls_dane_enable(TLS_SESS_STATE *TLScontext) 810 { 811 const TLS_DANE *dane = TLScontext->dane; 812 TLS_TLSA *tp; 813 SSL *ssl = TLScontext->con; 814 int usable = 0; 815 int ret; 816 int rpk_compat = 1; 817 818 for (tp = dane->tlsa; tp != 0; tp = tp->next) { 819 ret = SSL_dane_tlsa_add(ssl, tp->usage, tp->selector, 820 tp->mtype, tp->data, tp->length); 821 if (ret > 0) { 822 ++usable; 823 824 /* 825 * Disable use of RFC7250 raw public keys if any TLSA record 826 * depends on X.509 certificates. Only DANE-EE(3) SPKI(1) 827 * records can get by with just a public key. 828 */ 829 if (tp->usage != DNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE 830 || tp->selector != DNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO) 831 rpk_compat = 0; 832 continue; 833 } 834 if (ret == 0) { 835 tlsa_carp(TLScontext->namaddr, ":", "", "unusable TLSA RR", 836 tp->usage, tp->selector, tp->mtype, tp->data, 837 tp->length); 838 continue; 839 } 840 /* Internal problem in OpenSSL */ 841 tlsa_carp(TLScontext->namaddr, ":", "", "error loading trust settings", 842 tp->usage, tp->selector, tp->mtype, tp->data, tp->length); 843 tls_print_errors(); 844 return (-1); 845 } 846 if (rpk_compat) 847 tls_enable_server_rpk(NULL, ssl); 848 849 return (usable); 850 } 851 852 /* tls_dane_digest_init - configure supported DANE digests */ 853 854 void tls_dane_digest_init(SSL_CTX *ctx, const EVP_MD *fpt_alg) 855 { 856 dane_mtype mtypes[256]; 857 char *cp; 858 char *save; 859 char *algname; 860 uint8_t m; 861 uint8_t ord = 0; 862 uint8_t maxtype; 863 864 memset((char *) mtypes, 0, sizeof(mtypes)); 865 866 /* 867 * The DANE SHA2-256(1) and SHA2-512(2) algorithms are disabled, unless 868 * explicitly enabled. Other codepoints can be disabled explicitly by 869 * giving them an empty digest name, which also implicitly disables all 870 * smaller codepoints that are not explicitly assigned. 871 * 872 * We reserve the private-use code point (255) for use with fingerprint 873 * matching. It MUST NOT be accepted in DNS replies. 874 */ 875 mtypes[1].alg = NULL; 876 mtypes[2].alg = NULL; 877 mtypes[255].alg = fpt_alg; 878 maxtype = 2; 879 880 save = cp = mystrdup(var_tls_dane_digests); 881 while ((algname = mystrtok(&cp, CHARS_COMMA_SP)) != 0) { 882 char *algcode = split_at(algname, '='); 883 int codepoint = -1; 884 885 if (algcode && *algcode) { 886 unsigned long l; 887 char *endcp; 888 889 /* 890 * XXX: safe_strtoul() does not flag empty or white-space only 891 * input. Since we get algcode by splitting white-space/comma 892 * delimited tokens, this is not a problem here. 893 */ 894 l = safe_strtoul(algcode, &endcp, 10); 895 if ((l == 0 && (errno == EINVAL || endcp == algcode)) 896 || l >= 255 || *endcp) { 897 msg_warn("Invalid matching type number in %s: %s=%s", 898 VAR_TLS_DANE_DIGESTS, algname, algcode); 899 continue; 900 } 901 if (l == 0 || l == 255) { 902 msg_warn("Reserved matching type number in %s: %s=%s", 903 VAR_TLS_DANE_DIGESTS, algname, algcode); 904 continue; 905 } 906 codepoint = l; 907 } 908 /* Disable any codepoint gaps */ 909 if (codepoint > maxtype) { 910 while (++maxtype < codepoint) 911 mtypes[codepoint].alg = NULL; 912 maxtype = codepoint; 913 } 914 /* Handle explicitly disabled codepoints */ 915 if (*algname == 0) { 916 /* Skip empty specifiers */ 917 if (codepoint < 0) 918 continue; 919 mtypes[codepoint].alg = NULL; 920 continue; 921 } 922 switch (codepoint) { 923 case -1: 924 if (strcasecmp(algname, LN_sha256) == 0) 925 codepoint = 1; /* SHA2-256(1) */ 926 else if (strcasecmp(algname, LN_sha512) == 0) 927 codepoint = 2; /* SHA2-512(2) */ 928 else { 929 msg_warn("%s: digest algorithm %s needs an explicit number", 930 VAR_TLS_DANE_DIGESTS, algname); 931 continue; 932 } 933 break; 934 case 1: 935 if (strcasecmp(algname, LN_sha256) != 0) { 936 msg_warn("%s: matching type 1 can only be %s", 937 VAR_TLS_DANE_DIGESTS, LN_sha256); 938 continue; 939 } 940 algname = LN_sha256; 941 break; 942 case 2: 943 if (strcasecmp(algname, LN_sha512) != 0) { 944 msg_warn("%s: matching type 2 can only be %s", 945 VAR_TLS_DANE_DIGESTS, LN_sha512); 946 continue; 947 } 948 algname = LN_sha512; 949 break; 950 default: 951 break; 952 } 953 954 if (mtypes[codepoint].ord != 0) { 955 msg_warn("%s: matching type %d specified more than once", 956 VAR_TLS_DANE_DIGESTS, codepoint); 957 continue; 958 } 959 mtypes[codepoint].ord = ++ord; 960 961 if ((mtypes[codepoint].alg = tls_digest_byname(algname, NULL)) == 0) { 962 msg_warn("%s: digest algorithm \"%s\"(%d) unknown", 963 VAR_TLS_DANE_DIGESTS, algname, codepoint); 964 continue; 965 } 966 } 967 myfree(save); 968 969 for (m = 1; m != 0; m = m != maxtype ? m + 1 : 255) { 970 971 /* 972 * In OpenSSL higher order ordinals are preferred, but we list the 973 * most preferred algorithms first, so the last ordinal becomes 1, 974 * next-to-last, 2, ... 975 * 976 * The ordinals of non-disabled algorithms are always positive, and the 977 * computed value cannot overflow 254 (the largest possible value of 978 * 'ord' after loading each valid codepoint at most once). 979 */ 980 if (SSL_CTX_dane_mtype_set(ctx, mtypes[m].alg, m, 981 ord - mtypes[m].ord + 1) <= 0) { 982 msg_warn("%s: error configuring matching type %d", 983 VAR_TLS_DANE_DIGESTS, m); 984 tls_print_errors(); 985 } 986 } 987 } 988 989 /* tls_dane_log - log DANE-based verification success */ 990 991 void tls_dane_log(TLS_SESS_STATE *TLScontext) 992 { 993 static VSTRING *top; 994 static VSTRING *bot; 995 X509 *mcert = 0; 996 EVP_PKEY *mspki = 0; 997 int depth = SSL_get0_dane_authority(TLScontext->con, &mcert, &mspki); 998 uint8_t u, s, m; 999 unsigned const char *data; 1000 size_t dlen; 1001 1002 if (depth < 0) 1003 return; /* No DANE auth */ 1004 1005 switch (TLScontext->level) { 1006 case TLS_LEV_SECURE: 1007 case TLS_LEV_VERIFY: 1008 msg_info("%s: Matched trust anchor at depth %d", 1009 TLScontext->namaddr, depth); 1010 return; 1011 } 1012 1013 if (top == 0) 1014 top = vstring_alloc(2 * MAX_HEAD_BYTES); 1015 if (bot == 0) 1016 bot = vstring_alloc(2 * MAX_TAIL_BYTES); 1017 1018 (void) SSL_get0_dane_tlsa(TLScontext->con, &u, &s, &m, &data, &dlen); 1019 if (dlen > MAX_DUMP_BYTES) { 1020 hex_encode(top, (char *) data, MAX_HEAD_BYTES); 1021 hex_encode(bot, (char *) data + dlen - MAX_TAIL_BYTES, MAX_TAIL_BYTES); 1022 } else { 1023 hex_encode(top, (char *) data, dlen); 1024 } 1025 1026 if (TLScontext->level == TLS_LEV_FPRINT) { 1027 msg_info("%s: Matched fingerprint: %s%s%s", TLScontext->namaddr, 1028 STR(top), dlen > MAX_DUMP_BYTES ? "..." : "", 1029 dlen > MAX_DUMP_BYTES ? STR(bot) : ""); 1030 return; 1031 } 1032 #if OPENSSL_VERSION_PREREQ(3,2) 1033 if (SSL_get0_peer_rpk(TLScontext->con) != NULL) { 1034 msg_info("%s: Matched DANE raw public key: %u %u %u %s%s%s", 1035 TLScontext->namaddr, u, s, m, 1036 STR(top), dlen > MAX_DUMP_BYTES ? "..." : "", 1037 dlen > MAX_DUMP_BYTES ? STR(bot) : ""); 1038 return; 1039 } 1040 #endif 1041 msg_info("%s: Matched DANE %s at depth %d: %u %u %u %s%s%s", 1042 TLScontext->namaddr, mspki ? 1043 "TA public key verified certificate" : depth ? 1044 "TA certificate" : "EE certificate", depth, u, s, m, 1045 STR(top), dlen > MAX_DUMP_BYTES ? "..." : "", 1046 dlen > MAX_DUMP_BYTES ? STR(bot) : ""); 1047 } 1048 1049 #ifdef TEST 1050 1051 #include <unistd.h> 1052 #include <stdarg.h> 1053 1054 #include <mail_params.h> 1055 #include <mail_conf.h> 1056 #include <msg_vstream.h> 1057 1058 static int verify_chain(SSL *ssl, x509_stack_t *chain, TLS_SESS_STATE *tctx) 1059 { 1060 int ret; 1061 X509 *cert; 1062 X509_STORE_CTX *store_ctx; 1063 SSL_CTX *ssl_ctx = SSL_get_SSL_CTX(ssl); 1064 X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx); 1065 int store_ctx_idx = SSL_get_ex_data_X509_STORE_CTX_idx(); 1066 1067 cert = sk_X509_value(chain, 0); 1068 if ((store_ctx = X509_STORE_CTX_new()) == NULL) { 1069 SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN, ERR_R_MALLOC_FAILURE); 1070 return 0; 1071 } 1072 if (!X509_STORE_CTX_init(store_ctx, store, cert, chain)) { 1073 X509_STORE_CTX_free(store_ctx); 1074 return 0; 1075 } 1076 X509_STORE_CTX_set_ex_data(store_ctx, store_ctx_idx, ssl); 1077 1078 /* We're *verifying* a server chain */ 1079 X509_STORE_CTX_set_default(store_ctx, "ssl_server"); 1080 X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(store_ctx), 1081 SSL_get0_param(ssl)); 1082 X509_STORE_CTX_set0_dane(store_ctx, SSL_get0_dane(ssl)); 1083 1084 ret = X509_verify_cert(store_ctx); 1085 1086 SSL_set_verify_result(ssl, X509_STORE_CTX_get_error(store_ctx)); 1087 X509_STORE_CTX_free(store_ctx); 1088 1089 return (ret); 1090 } 1091 1092 static void load_tlsa_args(SSL *ssl, char *argv[]) 1093 { 1094 const EVP_MD *md = 0; 1095 X509 *cert = 0; 1096 BIO *bp; 1097 unsigned char *buf; 1098 unsigned char *buf2; 1099 int len; 1100 uint8_t u = atoi(argv[1]); 1101 uint8_t s = atoi(argv[2]); 1102 uint8_t m = atoi(argv[3]); 1103 EVP_PKEY *pkey; 1104 1105 /* Unsupported usages are fatal */ 1106 switch (u) { 1107 case DNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION: 1108 case DNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE: 1109 break; 1110 default: 1111 msg_fatal("unsupported certificate usage %u", u); 1112 } 1113 1114 /* Unsupported selectors are fatal */ 1115 switch (s) { 1116 case DNS_TLSA_SELECTOR_FULL_CERTIFICATE: 1117 case DNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO: 1118 break; 1119 default: 1120 msg_fatal("unsupported selector %u", s); 1121 } 1122 1123 /* Unsupported selectors are fatal */ 1124 switch (m) { 1125 case DNS_TLSA_MATCHING_TYPE_NO_HASH_USED: 1126 case DNS_TLSA_MATCHING_TYPE_SHA256: 1127 case DNS_TLSA_MATCHING_TYPE_SHA512: 1128 break; 1129 default: 1130 msg_fatal("unsupported matching type %u", m); 1131 } 1132 1133 if ((bp = BIO_new_file(argv[4], "r")) == NULL) 1134 msg_fatal("error opening %s: %m", argv[4]); 1135 if (!PEM_read_bio_X509(bp, &cert, 0, 0)) { 1136 tls_print_errors(); 1137 msg_fatal("error loading certificate from %s: %m", argv[4]); 1138 } 1139 BIO_free(bp); 1140 1141 /* 1142 * Extract ASN.1 DER form of certificate or public key. 1143 */ 1144 switch (s) { 1145 case DNS_TLSA_SELECTOR_FULL_CERTIFICATE: 1146 len = i2d_X509(cert, NULL); 1147 if (len > 0xffff) 1148 msg_fatal("certificate too long: %d", len); 1149 buf2 = buf = (unsigned char *) mymalloc(len); 1150 i2d_X509(cert, &buf2); 1151 break; 1152 case DNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO: 1153 pkey = X509_get_pubkey(cert); 1154 len = i2d_PUBKEY(pkey, NULL); 1155 if (len > 0xffff) 1156 msg_fatal("public key too long: %d", len); 1157 buf2 = buf = (unsigned char *) mymalloc(len); 1158 i2d_PUBKEY(pkey, &buf2); 1159 EVP_PKEY_free(pkey); 1160 break; 1161 } 1162 X509_free(cert); 1163 OPENSSL_assert(buf2 - buf == len); 1164 1165 switch (m) { 1166 case 0: 1167 break; 1168 case 1: 1169 if ((md = tls_digest_byname(LN_sha256, NULL)) == 0) 1170 msg_fatal("Digest %s not found", LN_sha256); 1171 break; 1172 case 2: 1173 if ((md = tls_digest_byname(LN_sha512, NULL)) == 0) 1174 msg_fatal("Digest %s not found", LN_sha512); 1175 break; 1176 default: 1177 msg_fatal("Unsupported DANE mtype: %d", m); 1178 } 1179 1180 if (md != 0) { 1181 unsigned char mdbuf[EVP_MAX_MD_SIZE]; 1182 unsigned int mdlen = sizeof(mdbuf); 1183 1184 if (!EVP_Digest(buf, len, mdbuf, &mdlen, md, 0)) 1185 msg_fatal("Digest failure for mtype: %d", m); 1186 myfree(buf); 1187 buf = (unsigned char *) mymemdup(mdbuf, len = mdlen); 1188 } 1189 SSL_dane_tlsa_add(ssl, u, s, m, buf, len); 1190 myfree((void *) buf); 1191 } 1192 1193 static x509_stack_t *load_chain(const char *chainfile) 1194 { 1195 BIO *bp; 1196 char *name = 0; 1197 char *header = 0; 1198 unsigned char *data = 0; 1199 long len; 1200 int count; 1201 char *errtype = 0; /* if error: cert or pkey? */ 1202 x509_stack_t *chain; 1203 typedef X509 *(*d2i_X509_t) (X509 **, const unsigned char **, long); 1204 1205 if ((chain = sk_X509_new_null()) == 0) { 1206 perror("malloc"); 1207 exit(1); 1208 } 1209 1210 /* 1211 * On each call, PEM_read() wraps a stdio file in a BIO_NOCLOSE bio, 1212 * calls PEM_read_bio() and then frees the bio. It is just as easy to 1213 * open a BIO as a stdio file, so we use BIOs and call PEM_read_bio() 1214 * directly. 1215 */ 1216 if ((bp = BIO_new_file(chainfile, "r")) == NULL) { 1217 fprintf(stderr, "error opening chainfile: %s: %m\n", chainfile); 1218 exit(1); 1219 } 1220 /* Don't report old news */ 1221 ERR_clear_error(); 1222 1223 for (count = 0; 1224 errtype == 0 && PEM_read_bio(bp, &name, &header, &data, &len); 1225 ++count) { 1226 const unsigned char *p = data; 1227 1228 if (strcmp(name, PEM_STRING_X509) == 0 1229 || strcmp(name, PEM_STRING_X509_TRUSTED) == 0 1230 || strcmp(name, PEM_STRING_X509_OLD) == 0) { 1231 d2i_X509_t d; 1232 X509 *cert; 1233 1234 d = strcmp(name, PEM_STRING_X509_TRUSTED) ? d2i_X509_AUX : d2i_X509; 1235 if ((cert = d(0, &p, len)) == 0 || (p - data) != len) 1236 errtype = "certificate"; 1237 else if (sk_X509_push(chain, cert) == 0) { 1238 perror("malloc"); 1239 exit(1); 1240 } 1241 } else { 1242 fprintf(stderr, "unexpected chain file object: %s\n", name); 1243 exit(1); 1244 } 1245 1246 /* 1247 * If any of these were null, PEM_read() would have failed. 1248 */ 1249 OPENSSL_free(name); 1250 OPENSSL_free(header); 1251 OPENSSL_free(data); 1252 } 1253 BIO_free(bp); 1254 1255 if (errtype) { 1256 tls_print_errors(); 1257 fprintf(stderr, "error reading: %s: malformed %s", chainfile, errtype); 1258 exit(1); 1259 } 1260 if (ERR_GET_REASON(ERR_peek_last_error()) == PEM_R_NO_START_LINE) { 1261 /* Reached end of PEM file */ 1262 ERR_clear_error(); 1263 if (count > 0) 1264 return chain; 1265 fprintf(stderr, "no certificates found in: %s\n", chainfile); 1266 exit(1); 1267 } 1268 /* Some other PEM read error */ 1269 tls_print_errors(); 1270 fprintf(stderr, "error reading: %s\n", chainfile); 1271 exit(1); 1272 } 1273 1274 static void usage(const char *progname) 1275 { 1276 fprintf(stderr, "Usage: %s certificate-usage selector matching-type" 1277 " certfile \\\n\t\tCAfile chainfile hostname [certname ...]\n", 1278 progname); 1279 fprintf(stderr, " where, certificate-usage = TLSA certificate usage,\n"); 1280 fprintf(stderr, "\t selector = TLSA selector,\n"); 1281 fprintf(stderr, "\t matching-type = empty string or OpenSSL digest algorithm name,\n"); 1282 fprintf(stderr, "\t PEM certfile provides certificate association data,\n"); 1283 fprintf(stderr, "\t PEM CAfile contains any usage 0/1 trusted roots,\n"); 1284 fprintf(stderr, "\t PEM chainfile = server chain file to verify\n"); 1285 fprintf(stderr, "\t hostname = destination hostname,\n"); 1286 fprintf(stderr, "\t each certname augments the hostname for name checks.\n"); 1287 exit(1); 1288 } 1289 1290 static SSL_CTX *ctx_init(const char *CAfile) 1291 { 1292 SSL_CTX *client_ctx; 1293 1294 tls_param_init(); 1295 tls_check_version(); 1296 1297 if (TLScontext_index < 0) 1298 if ((TLScontext_index = SSL_get_ex_new_index(0, 0, 0, 0, 0)) < 0) 1299 msg_fatal("Cannot allocate SSL application data index"); 1300 1301 ERR_clear_error(); 1302 if ((client_ctx = SSL_CTX_new(TLS_client_method())) == 0) 1303 msg_fatal("cannot allocate client SSL_CTX"); 1304 SSL_CTX_set_verify_depth(client_ctx, 5); 1305 1306 /* Enable DANE support in OpenSSL */ 1307 if (SSL_CTX_dane_enable(client_ctx) <= 0) { 1308 tls_print_errors(); 1309 msg_fatal("OpenSSL DANE initialization failed"); 1310 } 1311 if (tls_set_ca_certificate_info(client_ctx, CAfile, "") < 0) { 1312 tls_print_errors(); 1313 msg_fatal("cannot load CAfile: %s", CAfile); 1314 } 1315 SSL_CTX_set_verify(client_ctx, SSL_VERIFY_NONE, 1316 tls_verify_certificate_callback); 1317 return (client_ctx); 1318 } 1319 1320 int main(int argc, char *argv[]) 1321 { 1322 SSL_CTX *ssl_ctx; 1323 const EVP_MD *fpt_alg; 1324 TLS_SESS_STATE *tctx; 1325 x509_stack_t *chain; 1326 int i; 1327 1328 var_procname = mystrdup(basename(argv[0])); 1329 set_mail_conf_str(VAR_PROCNAME, var_procname); 1330 msg_vstream_init(var_procname, VSTREAM_OUT); 1331 1332 if (argc < 8) 1333 usage(argv[0]); 1334 1335 ssl_ctx = ctx_init(argv[5]); 1336 if (!tls_dane_avail()) 1337 msg_fatal("DANE TLSA support not available"); 1338 1339 tctx = tls_alloc_sess_context(TLS_LOG_NONE, argv[7]); 1340 tctx->namaddr = argv[7]; 1341 tctx->mdalg = atoi(argv[3]) == 2 ? LN_sha512 : LN_sha256; 1342 tctx->dane = tls_dane_alloc(); 1343 1344 if ((fpt_alg = tls_validate_digest(tctx->mdalg)) == 0) 1345 msg_fatal("fingerprint digest algorithm %s not found", 1346 tctx->mdalg); 1347 tls_dane_digest_init(ssl_ctx, fpt_alg); 1348 1349 if ((tctx->con = SSL_new(ssl_ctx)) == 0 1350 || !SSL_set_ex_data(tctx->con, TLScontext_index, tctx)) { 1351 tls_print_errors(); 1352 msg_fatal("Error allocating SSL connection"); 1353 } 1354 if (SSL_dane_enable(tctx->con, 0) <= 0) { 1355 tls_print_errors(); 1356 msg_fatal("Error enabling DANE for SSL handle"); 1357 } 1358 SSL_dane_set_flags(tctx->con, DANE_FLAG_NO_DANE_EE_NAMECHECKS); 1359 SSL_dane_set_flags(tctx->con, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS); 1360 for (i = 7; i < argc; ++i) 1361 if (!SSL_add1_host(tctx->con, argv[i])) 1362 msg_fatal("error adding hostname: %s", argv[i]); 1363 load_tlsa_args(tctx->con, argv); 1364 SSL_set_connect_state(tctx->con); 1365 1366 /* Verify saved server chain */ 1367 chain = load_chain(argv[6]); 1368 i = verify_chain(tctx->con, chain, tctx); 1369 tls_print_errors(); 1370 1371 if (i > 0) { 1372 const char *peername = SSL_get0_peername(tctx->con); 1373 1374 if (peername == 0) 1375 peername = argv[7]; 1376 msg_info("Verified %s", peername); 1377 } else { 1378 int r = SSL_get_verify_result(tctx->con); 1379 1380 msg_info("certificate verification failed for %s:%s: num=%d:%s", 1381 argv[6], argv[7], r, X509_verify_cert_error_string(r)); 1382 } 1383 1384 return (i <= 0); 1385 } 1386 1387 #endif /* TEST */ 1388 1389 #endif /* USE_TLS */ 1390