170 #ifdef STRCASECMP_IN_STRINGS_H
191 #define STR(x) vstring_str(x)
208 #undef TRUST_ANCHOR_SUPPORT
209 #undef DANE_TLSA_SUPPORT
212 #if OPENSSL_VERSION_NUMBER >= 0x1000000fL && \
213 (defined(X509_V_FLAG_PARTIAL_CHAIN) || !defined(OPENSSL_NO_ECDH))
214 #define TRUST_ANCHOR_SUPPORT
216 #ifndef X509_V_FLAG_PARTIAL_CHAIN
220 #if defined(TLSEXT_MAXLEN_host_name) && RES_USE_DNSSEC && RES_USE_EDNS0
221 #define DANE_TLSA_SUPPORT
226 #ifdef TRUST_ANCHOR_SUPPORT
227 static int ta_support = 1;
230 static int ta_support = 0;
235 static int wrap_signed = 1;
238 static int wrap_signed = 0;
242 #ifdef DANE_TLSA_SUPPORT
243 static int dane_tlsa_support = 1;
246 static int dane_tlsa_support = 0;
250 static EVP_PKEY *signkey;
251 static const EVP_MD *signmd;
252 static const char *signalg;
253 static ASN1_OBJECT *serverAuth;
263 static iana_digest iana_table[] = {
270 typedef struct dane_digest {
271 struct dane_digest *next;
279 #define MAXDIGESTS 256
280 static dane_digest *digest_list;
288 #define CACHE_SIZE 20
289 static CTABLE *dane_cache;
291 static int dane_initialized;
292 static int dane_verbose;
296 void tls_dane_verbose(
int on)
303 static dane_digest *add_digest(
char *mdalg,
int pref)
308 const char *dane_mdalg = mdalg;
310 const EVP_MD *md = 0;
313 if (value && *value) {
323 if ((l == 0 && (errno == EINVAL || endcp == value))
326 msg_warn(
"Invalid matching type number in %s: %s=%s",
336 for (i = iana_table; i->mdalg; ++i) {
337 if (*mdalg &&
strcasecmp(i->mdalg, mdalg) == 0) {
338 if (dane_id >= 0 && i->dane_id != dane_id) {
339 msg_warn(
"Non-standard value in %s: %s%s%s",
341 value ?
"=" :
"", value ? value :
"");
344 dane_id = i->dane_id;
345 }
else if (i->dane_id == dane_id) {
347 msg_warn(
"Non-standard algorithm in %s: %s%s%s",
349 value ?
"=" :
"", value ? value :
"");
352 dane_mdalg = i->mdalg;
359 if (dane_id < 0 || (dane_id > 0 && !*dane_mdalg)) {
360 msg_warn(
"Unknown incompletely specified element in %s: %s%s%s",
362 value ?
"=" :
"", value ? value :
"");
369 for (d = digest_list; d; d = d->next) {
371 || d->dane_id == dane_id) {
372 msg_warn(
"Duplicate element in %s: %s%s%s",
374 value ?
"=" :
"", value ? value :
"");
380 && ((md = EVP_get_digestbyname(dane_mdalg)) == 0
381 || (mdlen = EVP_MD_size(md)) <= 0
382 || mdlen > EVP_MAX_MD_SIZE)) {
383 msg_warn(
"Unimplemented digest algorithm in %s: %s%s%s",
385 value ?
"=" :
"", value ? value :
"");
388 d = (dane_digest *)
mymalloc(
sizeof(*d));
389 d->next = digest_list;
394 d->dane_id = dane_id;
396 return (digest_list = d);
401 static dane_digest *digest_byid(uint8_t dane_id)
405 for (d = digest_list; d; d = d->next)
406 if (d->dane_id == dane_id)
413 static int digest_pref_byid(uint8_t dane_id)
415 dane_digest *d = digest_byid(dane_id);
417 return (d ? (d->pref) : (MAXDIGESTS + dane_id));
422 static EVP_PKEY *gencakey(
void)
432 if ((eckey = EC_KEY_new()) != 0
433 && (group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)) != 0
434 && (EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE),
435 EC_KEY_set_group(eckey, group))
436 && EC_KEY_generate_key(eckey)
437 && (key = EVP_PKEY_new()) != 0
438 && !EVP_PKEY_set1_EC_KEY(key, eckey)) {
443 EC_GROUP_free(group);
452 static void dane_init(
void)
458 static char fullmtype[] =
"=0";
468 if (add_digest(fullmtype, 0)) {
471 if ((d = add_digest(tok, ++digest_pref)) == 0) {
476 if (digest_pref == 1) {
491 || (wrap_signed && (signkey = gencakey()) == 0)
492 || (serverAuth = OBJ_nid2obj(NID_server_auth)) == 0) {
493 msg_warn(
"cannot generate TA certificates, "
494 "no trust-anchor or DANE support");
496 dane_tlsa_support = ta_support = 0;
497 }
else if (signmd == 0) {
498 msg_warn(
"digest algorithm initializaton failed, no DANE support");
500 dane_tlsa_support = 0;
502 dane_initialized = 1;
507 int tls_dane_avail(
void)
509 if (!dane_initialized)
511 return (dane_tlsa_support);
516 void tls_dane_flush(
void)
525 TLS_DANE *tls_dane_alloc(
void)
527 TLS_DANE *dane = (TLS_DANE *)
mymalloc(
sizeof(*dane));
533 dane->base_domain = 0;
540 static void ta_cert_insert(TLS_DANE *d, X509 *x)
542 TLS_CERTS *
new = (TLS_CERTS *)
mymalloc(
sizeof(*
new));
546 new->next = d->certs;
550 static void free_ta_certs(TLS_DANE *d)
555 for (head = d->certs; head; head = next) {
557 X509_free(head->cert);
562 static void ta_pkey_insert(TLS_DANE *d, EVP_PKEY *k)
564 TLS_PKEYS *
new = (TLS_PKEYS *)
mymalloc(
sizeof(*
new));
568 new->next = d->pkeys;
572 static void free_ta_pkeys(TLS_DANE *d)
577 for (head = d->pkeys; head; head = next) {
579 EVP_PKEY_free(head->pkey);
584 static void tlsa_free(TLS_TLSA *tlsa)
597 void tls_dane_free(TLS_DANE *dane)
602 if (--dane->refs > 0)
606 for (tlsa = dane->ta; tlsa; tlsa = next) {
610 for (tlsa = dane->ee; tlsa; tlsa = next) {
618 if (dane->base_domain)
619 myfree(dane->base_domain);
626 static void dane_free(
void *dane,
void *unused_context)
628 tls_dane_free((TLS_DANE *) dane);
633 static TLS_TLSA **dane_locate(TLS_TLSA **tlsap,
const char *mdalg)
642 for (; *tlsap; tlsap = &(*tlsap)->next) {
651 new = (TLS_TLSA *)
mymalloc(
sizeof(*
new));
663 void tls_dane_add_ee_digests(TLS_DANE *dane,
const char *mdalg,
664 const char *digest,
const char *delim)
666 TLS_TLSA **tlsap = dane_locate(&dane->ee, mdalg);
667 TLS_TLSA *tlsa = *tlsap;
670 if (tlsa->pkeys == 0)
676 if (tlsa->pkeys->argc == 0) {
680 if (tlsa->certs == 0) {
700 if (tlsa->certs == 0)
708 static void dane_add(TLS_DANE *dane,
int certusage,
int selector,
709 const char *mdalg,
char *digest)
717 certusage = TLS_DANE_TA;
720 certusage = TLS_DANE_EE;
723 msg_panic(
"Unsupported DANE certificate usage: %d", certusage);
728 selector = TLS_DANE_CERT;
731 selector = TLS_DANE_PKEY;
734 msg_panic(
"Unsupported DANE selector: %d", selector);
737 tlsap = (certusage == TLS_DANE_EE) ? &dane->ee : &dane->ta;
738 tlsa = *(tlsap = dane_locate(tlsap, mdalg));
739 argvp = (selector == TLS_DANE_PKEY) ? &tlsa->pkeys : &tlsa->certs;
746 #define FILTER_CTX_AGILITY_OK (1<<0)
747 #define FILTER_CTX_APPLY_AGILITY (1<<1)
748 #define FILTER_CTX_PARSE_DATA (1<<2)
750 #define FILTER_RR_DROP 0
751 #define FILTER_RR_KEEP 1
753 typedef struct filter_ctx {
760 typedef int (*tlsa_filter) (
DNS_RR *, filter_ctx *);
764 static DNS_RR *tlsa_apply(DNS_RR *rr, tlsa_filter filter, filter_ctx *ctx)
774 for ( ; rr; rr = next) {
777 if (filter(rr, ctx) == FILTER_RR_KEEP) {
793 static unsigned int usmdelta(uint8_t u, uint8_t s, uint8_t m, DNS_RR *next)
795 uint8_t *ip = (next && next->
data_len >= 3) ? (uint8_t *) next->
data : 0;
796 uint8_t nu = ip ? *ip++ : ~u;
797 uint8_t ns = ip ? *ip++ : ~s;
798 uint8_t nm = ip ? *ip++ : ~m;
800 return (((u ^ nu) << 16) | ((s ^ ns) << 8) | (m ^ nm));
805 static int tlsa_rr_cmp(DNS_RR *a, DNS_RR *b)
815 uint8_t *ai = (uint8_t *) a->
data;
816 uint8_t *bi = (uint8_t *) b->
data;
818 #define signedcmp(x, y) (((int)(x)) - ((int)(y)))
820 if ((cmp = signedcmp(ai[0], bi[0])) != 0
821 || (cmp = signedcmp(ai[1], bi[1])) != 0
822 || (cmp = digest_pref_byid(ai[2]) -
823 digest_pref_byid(bi[2])) != 0)
833 static int parse_tlsa_rr(DNS_RR *rr, filter_ctx *ctx)
840 D2I_const
unsigned char *data;
841 D2I_const
unsigned char *p;
843 const char *q = (iscname) ? (rr)->qname :
"";
844 const char *a = (iscname) ?
" -> " :
"";
845 const char *r = rr->
rname;
849 msg_panic(
"unexpected non-TLSA RR type %u for %s%s%s", rr->
type,
853 if ((dlen = rr->
data_len - 3) < 0) {
854 msg_warn(
"truncated length %u RR: %s%s%s IN TLSA ...",
856 ctx->flags &= ~FILTER_CTX_AGILITY_OK;
857 return (FILTER_RR_DROP);
859 ip = (uint8_t *) rr->
data;
863 change = usmdelta(usage, selector, mtype, rr->
next);
864 p = data = (D2I_const
unsigned char *) ip;
870 if (ctx->count && (ctx->flags & FILTER_CTX_APPLY_AGILITY)) {
871 if (change & 0xffff00)
873 return (FILTER_RR_DROP);
886 msg_warn(
"unsupported certificate usage %u in RR: "
887 "%s%s%s IN TLSA %u ...", usage,
889 return (FILTER_RR_DROP);
900 msg_warn(
"unsupported selector %u in RR: "
901 "%s%s%s IN TLSA %u %u ...", selector,
902 q, a, r, usage, selector);
903 return (FILTER_RR_DROP);
907 dane_digest *d = digest_byid(mtype);
910 msg_warn(
"unsupported matching type %u in RR: "
911 "%s%s%s IN TLSA %u %u %u ...", mtype,
912 q, a, r, usage, selector, mtype);
913 return (FILTER_RR_DROP);
915 if (dlen != d->len) {
916 msg_warn(
"malformed %s digest, length %lu, in RR: "
917 "%s%s%s IN TLSA %u %u %u ...",
918 d->mdalg, (
unsigned long) dlen,
919 q, a, r, usage, selector, mtype);
920 ctx->flags &= ~FILTER_CTX_AGILITY_OK;
921 return (FILTER_RR_DROP);
924 if (change && (change & 0xffff00) == 0
925 && (ctx->flags & FILTER_CTX_APPLY_AGILITY))
928 if (ctx->flags & FILTER_CTX_PARSE_DATA) {
929 char *digest = tls_digest_encode(data, dlen);
931 dane_add(ctx->dane, usage, selector, d->mdalg, digest);
933 msg_info(
"using DANE RR: %s%s%s IN TLSA %u %u %u %s",
934 q, a, r, usage, selector, mtype, digest);
944 if (!d2i_X509(&x, &p, dlen) || dlen != p - data) {
946 "%s%s%s IN TLSA %u %u %u ...",
"certificate",
947 q, a, r, usage, selector, mtype);
950 return (FILTER_RR_DROP);
953 k = X509_get_pubkey(x);
956 msg_warn(
"malformed %s in RR: %s%s%s IN TLSA %u %u %u ...",
957 "or unsupported certificate public key",
958 q, a, r, usage, selector, mtype);
960 return (FILTER_RR_DROP);
969 && (ctx->flags & FILTER_CTX_PARSE_DATA))
970 ta_cert_insert(ctx->dane, x);
975 if (!d2i_PUBKEY(&k, &p, dlen) || dlen != p - data) {
976 msg_warn(
"malformed %s in RR: %s%s%s IN TLSA %u %u %u ...",
977 "public key", q, a, r, usage, selector, mtype);
980 return (FILTER_RR_DROP);
989 && (ctx->flags & FILTER_CTX_PARSE_DATA))
990 ta_pkey_insert(ctx->dane, k);
999 if (ctx->flags & FILTER_CTX_PARSE_DATA) {
1000 char *digest = tls_data_fprint((
char *) data, dlen, signalg);
1002 dane_add(ctx->dane, usage, selector, signalg, digest);
1004 msg_info(
"using DANE RR: %s%s%s IN TLSA %u %u %u <%s>; "
1005 "%s digest %s", q, a, r, usage, selector, mtype,
1007 "certificate" :
"public key", signalg, digest);
1011 return (FILTER_RR_KEEP);
1016 static DNS_RR *process_rrs(TLS_DANE *dane, DNS_RR *rrset)
1021 ctx.count = ctx.target = 0;
1022 ctx.flags = FILTER_CTX_APPLY_AGILITY | FILTER_CTX_PARSE_DATA;
1024 rrset = tlsa_apply(rrset, parse_tlsa_rr, &ctx);
1026 if (dane->ta == 0 && dane->ee == 0)
1027 dane->flags |= TLS_DANE_FLAG_EMPTY;
1034 static void *dane_lookup(
const char *tlsa_fqdn,
void *unused_ctx)
1044 dane = tls_dane_alloc();
1049 if (TLS_DANE_CACHE_TTL_MIN && rrs->
ttl < TLS_DANE_CACHE_TTL_MIN)
1050 rrs->
ttl = TLS_DANE_CACHE_TTL_MIN;
1051 if (TLS_DANE_CACHE_TTL_MAX && rrs->
ttl > TLS_DANE_CACHE_TTL_MAX)
1052 rrs->
ttl = TLS_DANE_CACHE_TTL_MAX;
1066 rrs = process_rrs(dane, rrs);
1068 dane->flags |= TLS_DANE_FLAG_NORRS;
1075 dane->flags |= TLS_DANE_FLAG_NORRS;
1076 dane->expires = 1 +
event_time() + TLS_DANE_CACHE_TTL_MIN;
1080 msg_warn(
"DANE TLSA lookup problem: %s",
STR(why));
1081 dane->flags |= TLS_DANE_FLAG_ERROR;
1085 return (
void *) dane;
1090 static TLS_DANE *resolve_host(
const char *host,
const char *proto,
1096 if (query_domain == 0)
1099 vstring_sprintf(query_domain,
"_%u._%s.%s", ntohs(port), proto, host);
1103 if (dane->base_domain == 0)
1104 dane->base_domain =
mystrdup(host);
1112 static int qname_secure(
const char *qname)
1136 msg_warn(
"DNSSEC status lookup error for %s: %s", qname,
STR(why));
1142 TLS_DANE *tls_dane_resolve(
unsigned port,
const char *proto, DNS_RR *hostrr,
1149 if (!tls_dane_avail())
1158 isvalid = iscname ? qname_secure(hostrr->
qname) : 0;
1163 dane = tls_dane_alloc();
1164 dane->flags = TLS_DANE_FLAG_NORRS;
1167 dane_cache =
ctable_create(CACHE_SIZE, dane_lookup, dane_free, 0);
1175 dane = resolve_host(hostrr->
rname, proto, port);
1176 if (tls_dane_notfound(dane) && iscname) {
1177 tls_dane_free(dane);
1182 dane = resolve_host(hostrr->
qname, proto, port);
1183 if (dane->flags & TLS_DANE_FLAG_ERROR) {
1185 tls_dane_free(dane);
1195 int tls_dane_load_trustfile(TLS_DANE *dane,
const char *tafile)
1197 #ifdef TRUST_ANCHOR_SUPPORT
1201 unsigned char *data = 0;
1208 if (tafile == 0 || *tafile == 0)
1211 if (!dane_initialized)
1215 msg_warn(
"trust-anchor files not supported");
1218 mdalg = signalg ? signalg :
"sha1";
1226 if ((bp = BIO_new_file(tafile,
"r")) == NULL) {
1227 msg_warn(
"error opening trust anchor file: %s: %m", tafile);
1234 errtype == 0 && PEM_read_bio(bp, &name, &header, &data, &len);
1236 D2I_const
unsigned char *p = data;
1241 if (strcmp(name, PEM_STRING_X509) == 0
1242 || strcmp(name, PEM_STRING_X509_OLD) == 0) {
1243 X509 *cert = d2i_X509(0, &p, len);
1245 if (cert && (p - data) == len) {
1247 digest = tls_data_fprint((
char *) data, len, mdalg);
1248 dane_add(dane, usage, selector, mdalg, digest);
1250 ta_cert_insert(dane, cert);
1252 errtype =
"certificate";
1255 }
else if (strcmp(name, PEM_STRING_PUBLIC) == 0) {
1256 EVP_PKEY *pkey = d2i_PUBKEY(0, &p, len);
1258 if (pkey && (p - data) == len) {
1260 digest = tls_data_fprint((
char *) data, len, mdalg);
1261 dane_add(dane, usage, selector, mdalg, digest);
1263 ta_pkey_insert(dane, pkey);
1265 errtype =
"public key";
1267 EVP_PKEY_free(pkey);
1274 OPENSSL_free(header);
1281 msg_warn(
"error reading: %s: malformed trust-anchor %s",
1285 if (ERR_GET_REASON(ERR_peek_last_error()) == PEM_R_NO_START_LINE) {
1288 return (tacount > 0);
1293 msg_warn(
"Trust anchor files not supported");
1300 int tls_dane_match(TLS_SESS_STATE *TLScontext,
int usage,
1301 X509 *cert,
int depth)
1303 const TLS_DANE *dane = TLScontext->dane;
1304 TLS_TLSA *tlsa = (usage == TLS_DANE_EE) ? dane->ee : dane->ta;
1305 const char *namaddr = TLScontext->namaddr;
1306 const char *ustr = (usage == TLS_DANE_EE) ?
"end entity" :
"trust anchor";
1309 for (matched = 0; tlsa && !matched; tlsa = tlsa->next) {
1317 #define MATCHED_CERT 1
1318 #define MATCHED_PKEY 2
1321 char *pkey_dgst = tls_pkey_fprint(cert, tlsa->mdalg);
1323 for (dgst = tlsa->pkeys->argv; !matched && *dgst; ++dgst)
1325 matched = MATCHED_PKEY;
1326 if (TLScontext->log_mask & (TLS_LOG_VERBOSE | TLS_LOG_CERTMATCH)
1328 msg_info(
"%s: depth=%d matched %s public-key %s digest=%s",
1329 namaddr, depth, ustr, tlsa->mdalg, pkey_dgst);
1332 if (tlsa->certs != 0 && !matched) {
1333 char *cert_dgst = tls_cert_fprint(cert, tlsa->mdalg);
1335 for (dgst = tlsa->certs->argv; !matched && *dgst; ++dgst)
1337 matched = MATCHED_CERT;
1338 if (TLScontext->log_mask & (TLS_LOG_VERBOSE | TLS_LOG_CERTMATCH)
1340 msg_info(
"%s: depth=%d matched %s certificate %s digest %s",
1341 namaddr, depth, ustr, tlsa->mdalg, cert_dgst);
1351 static int push_ext(X509 *cert, X509_EXTENSION *ext)
1354 if (X509_add_ext(cert, ext, -1))
1356 X509_EXTENSION_free(ext);
1363 static int add_ext(X509 *issuer, X509 *subject,
int ext_nid,
char *ext_val)
1367 X509V3_set_ctx(&v3ctx, issuer, subject, 0, 0, 0);
1368 return push_ext(subject, X509V3_EXT_conf_nid(0, &v3ctx, ext_nid, ext_val));
1373 static int set_serial(X509 *cert, AUTHORITY_KEYID *akid, X509 *subject)
1378 if (akid && akid->serial)
1379 return (X509_set_serialNumber(cert, akid->serial));
1385 if ((bn = ASN1_INTEGER_to_BN(X509_get_serialNumber(subject), 0)) != 0
1386 && BN_add_word(bn, 1)
1387 && BN_to_ASN1_INTEGER(bn, X509_get_serialNumber(cert)))
1397 static int add_akid(X509 *cert, AUTHORITY_KEYID *akid)
1399 ASN1_OCTET_STRING *id;
1400 unsigned char c = 0;
1401 int nid = NID_authority_key_identifier;
1411 id = ((akid && akid->keyid) ? akid->keyid : 0);
1412 if (
id && ASN1_STRING_length(
id) == 1 && *ASN1_STRING_get0_data(
id) == c)
1415 if ((akid = AUTHORITY_KEYID_new()) != 0
1416 && (akid->keyid = ASN1_OCTET_STRING_new()) != 0
1417 && ASN1_OCTET_STRING_set(akid->keyid, (
void *) &c, 1)
1418 && X509_add1_ext_i2d(cert, nid, akid, 0, X509V3_ADD_DEFAULT) > 0)
1421 AUTHORITY_KEYID_free(akid);
1427 static int add_skid(X509 *cert, AUTHORITY_KEYID *akid)
1429 int nid = NID_subject_key_identifier;
1431 if (!akid || !akid->keyid)
1432 return (add_ext(0, cert, nid,
"hash"));
1434 return (X509_add1_ext_i2d(cert, nid, akid->keyid, 0,
1435 X509V3_ADD_DEFAULT) > 0);
1440 static X509_NAME *akid_issuer_name(AUTHORITY_KEYID *akid)
1442 if (akid && akid->issuer) {
1444 general_name_stack_t *gens = akid->issuer;
1446 for (i = 0; i < sk_GENERAL_NAME_num(gens); ++i) {
1447 GENERAL_NAME *gn = sk_GENERAL_NAME_value(gens, i);
1449 if (gn->type == GEN_DIRNAME)
1450 return (gn->d.dirn);
1458 static int set_issuer_name(X509 *cert, AUTHORITY_KEYID *akid, X509_NAME *subj)
1460 X509_NAME *name = akid_issuer_name(akid);
1467 return (X509_set_issuer_name(cert, name));
1468 return (X509_set_issuer_name(cert, subj));
1473 static void grow_chain(TLS_SESS_STATE *TLScontext,
int trusted, X509 *cert)
1475 x509_stack_t **xs = trusted ? &TLScontext->trusted : &TLScontext->untrusted;
1480 if (!*xs && (*xs = sk_X509_new_null()) == 0)
1483 if (trusted && !X509_add1_trust_object(cert, serverAuth))
1486 if (!sk_X509_push(*xs, cert))
1493 static void wrap_key(TLS_SESS_STATE *TLScontext,
int depth,
1494 EVP_PKEY *key, X509 *subject)
1497 AUTHORITY_KEYID *akid;
1498 X509_NAME *name = X509_get_issuer_name(subject);
1505 if (name == 0 || (cert = X509_new()) == 0)
1512 if (TLScontext->tadepth < 0) {
1513 TLScontext->tadepth = depth + 1;
1514 if (TLScontext->log_mask & (TLS_LOG_VERBOSE | TLS_LOG_CERTMATCH))
1515 msg_info(
"%s: depth=%d chain is trust-anchor signed",
1516 TLScontext->namaddr, depth);
1518 akid = X509_get_ext_d2i(subject, NID_authority_key_identifier, 0, 0);
1528 if (!X509_set_version(cert, 2)
1529 || !set_serial(cert, akid, subject)
1530 || !set_issuer_name(cert, akid, name)
1531 || !X509_gmtime_adj(X509_getm_notBefore(cert), -30 * 86400L)
1532 || !X509_gmtime_adj(X509_getm_notAfter(cert), 30 * 86400L)
1533 || !X509_set_subject_name(cert, name)
1534 || !X509_set_pubkey(cert, key ? key : signkey)
1535 || !add_ext(0, cert, NID_basic_constraints,
"CA:TRUE")
1536 || (key && !add_akid(cert, akid))
1537 || !add_skid(cert, akid)
1538 || (wrap_signed && !X509_sign(cert, signkey, signmd))) {
1540 msg_fatal(
"error generating DANE wrapper certificate");
1543 AUTHORITY_KEYID_free(akid);
1544 if (key && wrap_signed) {
1545 wrap_key(TLScontext, depth + 1, 0, cert);
1546 grow_chain(TLScontext, UNTRUSTED, cert);
1548 grow_chain(TLScontext, TRUSTED, cert);
1555 static void wrap_cert(TLS_SESS_STATE *TLScontext, X509 *tacert,
int depth)
1559 unsigned char *asn1;
1562 if (TLScontext->tadepth < 0)
1563 TLScontext->tadepth = depth + 1;
1565 if (TLScontext->log_mask & (TLS_LOG_VERBOSE | TLS_LOG_CERTMATCH))
1566 msg_info(
"%s: depth=%d trust-anchor certificate",
1567 TLScontext->namaddr, depth);
1572 if (!wrap_signed || X509_check_issued(tacert, tacert) == X509_V_OK) {
1573 grow_chain(TLScontext, TRUSTED, tacert);
1577 len = i2d_X509(tacert, NULL);
1578 asn1 = buf = (
unsigned char *)
mymalloc(len);
1579 i2d_X509(tacert, &buf);
1580 if (buf - asn1 != len)
1581 msg_panic(
"i2d_X509 failed to encode TA certificate");
1584 cert = d2i_X509(0, (D2I_const
unsigned char **) &buf, len);
1585 if (!cert || (buf - asn1) != len)
1586 msg_panic(
"d2i_X509 failed to decode TA certificate");
1589 grow_chain(TLScontext, UNTRUSTED, cert);
1592 if (!X509_sign(cert, signkey, signmd)) {
1594 msg_fatal(
"error generating DANE wrapper certificate");
1596 wrap_key(TLScontext, depth + 1, signkey, cert);
1602 static int ta_signed(TLS_SESS_STATE *TLScontext, X509 *cert,
int depth)
1604 const TLS_DANE *dane = TLScontext->dane;
1617 for (x = dane->certs; !done && x; x = x->next) {
1618 if (X509_check_issued(x->cert, cert) == X509_V_OK) {
1619 if ((pk = X509_get_pubkey(x->cert)) == 0)
1622 if ((done = (X509_verify(cert, pk) > 0)) != 0)
1623 wrap_cert(TLScontext, x->cert, depth);
1648 for (k = dane->pkeys; !done && k; k = k->next)
1649 if ((done = (X509_verify(cert, k->pkey) > 0)) != 0)
1650 wrap_key(TLScontext, depth, k->pkey, cert);
1659 static void set_trust(TLS_SESS_STATE *TLScontext, X509_STORE_CTX *ctx)
1667 X509 *cert = X509_STORE_CTX_get0_cert(ctx);
1668 x509_stack_t *in = X509_STORE_CTX_get0_untrusted(ctx);
1671 if ((in = sk_X509_dup(in)) == 0)
1682 for (n = sk_X509_num(in); n > 0; --n, ++depth) {
1683 for (i = 0; i < n; ++i)
1684 if (X509_check_issued(sk_X509_value(in, i), cert) == X509_V_OK)
1695 ca = sk_X509_delete(in, i);
1698 match = tls_dane_match(TLScontext, TLS_DANE_TA, ca, depth + 1);
1702 wrap_cert(TLScontext, ca, depth);
1705 if ((takey = X509_get_pubkey(ca)) == 0)
1706 msg_panic(
"trust-anchor certificate has null pkey");
1707 wrap_key(TLScontext, depth, takey, cert);
1708 EVP_PKEY_free(takey);
1711 msg_panic(
"unexpected tls_dane_match result: %d", match);
1717 grow_chain(TLScontext, UNTRUSTED, ca);
1720 if (X509_check_issued(ca, ca) == X509_V_OK) {
1734 if (!cert || !ta_signed(TLScontext, cert, depth)) {
1736 grow_chain(TLScontext, TRUSTED, 0);
1745 static int dane_cb(X509_STORE_CTX *ctx,
void *app_ctx)
1747 const char *myname =
"dane_cb";
1748 TLS_SESS_STATE *TLScontext = (TLS_SESS_STATE *) app_ctx;
1749 X509 *cert = X509_STORE_CTX_get0_cert(ctx);
1759 if (X509_check_issued(cert, cert) == X509_V_OK) {
1765 grow_chain(TLScontext, UNTRUSTED, 0);
1766 if (tls_dane_match(TLScontext, TLS_DANE_TA, cert, 0)) {
1767 TLScontext->tadepth = 0;
1768 grow_chain(TLScontext, TRUSTED, cert);
1770 grow_chain(TLScontext, TRUSTED, 0);
1772 set_trust(TLScontext, ctx);
1779 X509_STORE_CTX_set0_trusted_stack(ctx, TLScontext->trusted);
1780 X509_STORE_CTX_set0_untrusted(ctx, TLScontext->untrusted);
1781 if (X509_STORE_CTX_get0_untrusted(ctx) != TLScontext->untrusted)
1782 msg_panic(
"%s: OpenSSL ABI change", myname);
1784 return X509_verify_cert(ctx);
1789 void tls_dane_set_callback(SSL_CTX *ctx, TLS_SESS_STATE *TLScontext)
1791 if (ta_support && TLS_DANE_HASTA(TLScontext->dane))
1792 SSL_CTX_set_cert_verify_callback(ctx, dane_cb, (
void *) TLScontext);
1794 SSL_CTX_set_cert_verify_callback(ctx, 0, 0);
1806 #if OPENSSL_VERSION_NUMBER < 0x10002000L
1807 #define SSL_get0_param(s) ((s)->param)
1810 static int verify_chain(SSL *ssl, x509_stack_t *chain, TLS_SESS_STATE *tctx)
1814 X509_STORE_CTX *store_ctx;
1815 SSL_CTX *ssl_ctx = SSL_get_SSL_CTX(ssl);
1816 X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx);
1817 int store_ctx_idx = SSL_get_ex_data_X509_STORE_CTX_idx();
1819 cert = sk_X509_value(chain, 0);
1820 if ((store_ctx = X509_STORE_CTX_new()) == NULL) {
1821 SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN, ERR_R_MALLOC_FAILURE);
1824 if (!X509_STORE_CTX_init(store_ctx, store, cert, chain)) {
1825 X509_STORE_CTX_free(store_ctx);
1828 X509_STORE_CTX_set_ex_data(store_ctx, store_ctx_idx, ssl);
1830 X509_STORE_CTX_set_default(store_ctx,
"ssl_server");
1831 X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(store_ctx),
1832 SSL_get0_param(ssl));
1834 if (SSL_get_verify_callback(ssl))
1835 X509_STORE_CTX_set_verify_cb(store_ctx, SSL_get_verify_callback(ssl));
1837 ret = dane_cb(store_ctx, tctx);
1839 SSL_set_verify_result(ssl, X509_STORE_CTX_get_error(store_ctx));
1840 X509_STORE_CTX_free(store_ctx);
1845 static void add_tlsa(TLS_DANE *dane,
char *argv[])
1851 unsigned char *buf2;
1853 uint8_t u = atoi(argv[1]);
1854 uint8_t s = atoi(argv[2]);
1855 const char *mdname = argv[3];
1864 msg_fatal(
"unsupported certificate usage %u", u);
1873 msg_fatal(
"unsupported selector %u", s);
1877 if (*mdname && !tls_validate_digest(mdname))
1878 msg_fatal(
"unsupported digest algorithm: %s", mdname);
1880 if ((bp = BIO_new_file(argv[4],
"r")) == NULL)
1881 msg_fatal(
"error opening %s: %m", argv[4]);
1882 if (!PEM_read_bio_X509(bp, &cert, 0, 0)) {
1884 msg_fatal(
"error loading certificate from %s: %m", argv[4]);
1893 len = i2d_X509(cert, NULL);
1894 buf2 = buf = (
unsigned char *)
mymalloc(len);
1895 i2d_X509(cert, &buf2);
1897 ta_cert_insert(dane, cert);
1900 pkey = X509_get_pubkey(cert);
1901 len = i2d_PUBKEY(pkey, NULL);
1902 buf2 = buf = (
unsigned char *)
mymalloc(len);
1903 i2d_PUBKEY(pkey, &buf2);
1905 ta_pkey_insert(dane, pkey);
1906 EVP_PKEY_free(pkey);
1909 OPENSSL_assert(buf2 - buf == len);
1911 digest = tls_data_fprint((
char *) buf, len, *mdname ? mdname : signalg);
1912 dane_add(dane, u, s, *mdname ? mdname : signalg, digest);
1917 static x509_stack_t *load_chain(
const char *chainfile)
1922 unsigned char *data = 0;
1926 x509_stack_t *chain;
1927 typedef X509 *(*d2i_X509_t) (X509 **,
const unsigned char **,
long);
1929 if ((chain = sk_X509_new_null()) == 0) {
1940 if ((bp = BIO_new_file(chainfile,
"r")) == NULL) {
1941 fprintf(stderr,
"error opening chainfile: %s: %m\n", chainfile);
1948 errtype == 0 && PEM_read_bio(bp, &name, &header, &data, &len);
1950 const unsigned char *p = data;
1952 if (strcmp(name, PEM_STRING_X509) == 0
1953 || strcmp(name, PEM_STRING_X509_TRUSTED) == 0
1954 || strcmp(name, PEM_STRING_X509_OLD) == 0) {
1958 d = strcmp(name, PEM_STRING_X509_TRUSTED) ? d2i_X509_AUX : d2i_X509;
1959 if ((cert = d(0, &p, len)) == 0 || (p - data) != len)
1960 errtype =
"certificate";
1961 else if (sk_X509_push(chain, cert) == 0) {
1966 fprintf(stderr,
"unexpected chain file object: %s\n", name);
1974 OPENSSL_free(header);
1981 fprintf(stderr,
"error reading: %s: malformed %s", chainfile, errtype);
1984 if (ERR_GET_REASON(ERR_peek_last_error()) == PEM_R_NO_START_LINE) {
1989 fprintf(stderr,
"no certificates found in: %s\n", chainfile);
1994 fprintf(stderr,
"error reading: %s\n", chainfile);
1998 static void usage(
const char *progname)
2000 fprintf(stderr,
"Usage: %s certificate-usage selector matching-type"
2001 " certfile \\\n\t\tCAfile chainfile hostname [certname ...]\n",
2003 fprintf(stderr,
" where, certificate-usage = TLSA certificate usage,\n");
2004 fprintf(stderr,
"\t selector = TLSA selector,\n");
2005 fprintf(stderr,
"\t matching-type = empty string or OpenSSL digest algorithm name,\n");
2006 fprintf(stderr,
"\t PEM certfile provides certificate association data,\n");
2007 fprintf(stderr,
"\t PEM CAfile contains any usage 0/1 trusted roots,\n");
2008 fprintf(stderr,
"\t PEM chainfile = server chain file to verify\n");
2009 fprintf(stderr,
"\t hostname = destination hostname,\n");
2010 fprintf(stderr,
"\t each certname augments the hostname for name checks.\n");
2016 static int match_servername(
const char *certid,
ARGV *margv)
2020 int match_subdomain;
2032 for (i = 0; i < margv->
argc; ++i) {
2033 match_subdomain = 0;
2034 domain = margv->
argv[i];
2035 if (*domain ==
'.' && domain[1] !=
'\0') {
2037 match_subdomain = 1;
2043 if (match_subdomain) {
2044 if ((idlen = strlen(certid)) > (domlen = strlen(domain)) + 1
2045 && certid[idlen - domlen - 1] ==
'.'
2046 && !
strcasecmp(certid + (idlen - domlen), domain))
2059 || (certid[0] ==
'*' && certid[1] ==
'.' && certid[2] != 0
2060 && (parent = strchr(domain,
'.')) != 0
2061 && (idlen = strlen(certid + 1)) <= (domlen = strlen(parent))
2063 parent + domlen - idlen,
2070 static void check_name(TLS_SESS_STATE *tctx, X509 *cert,
ARGV *margs)
2074 general_name_stack_t *gens;
2076 if (SSL_get_verify_result(tctx->con) != X509_V_OK)
2079 tctx->peer_status |= TLS_CERT_FLAG_TRUSTED;
2081 gens = X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0);
2083 int has_dnsname = 0;
2084 int num_gens = sk_GENERAL_NAME_num(gens);
2087 for (i = 0; !matched && i < num_gens; ++i) {
2088 const GENERAL_NAME *gn = sk_GENERAL_NAME_value(gens, i);
2089 const char *dnsname;
2091 if (gn->type != GEN_DNS)
2094 tctx->peer_status |= TLS_CERT_FLAG_ALTNAME;
2095 dnsname = tls_dns_name(gn, tctx);
2096 if (dnsname && *dnsname
2097 && (matched = match_servername(dnsname, margs)) != 0)
2098 tctx->peer_status |= TLS_CERT_FLAG_MATCHED;
2100 sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
2104 cn = tls_peer_CN(cert, tctx);
2105 if (match_servername(cn, margs))
2106 tctx->peer_status |= TLS_CERT_FLAG_MATCHED;
2110 static void check_print(TLS_SESS_STATE *tctx, X509 *cert)
2112 if (TLS_DANE_HASEE(tctx->dane)
2113 && tls_dane_match(tctx, TLS_DANE_EE, cert, 0))
2114 tctx->peer_status |= TLS_CERT_FLAG_TRUSTED | TLS_CERT_FLAG_MATCHED;
2117 static void check_peer(TLS_SESS_STATE *tctx, X509 *cert,
int argc,
char **argv)
2121 tctx->peer_status |= TLS_CERT_FLAG_PRESENT;
2122 check_print(tctx, cert);
2123 if (!TLS_CERT_IS_MATCHED(tctx)) {
2126 check_name(tctx, cert, &match);
2130 static SSL_CTX *ctx_init(
const char *CAfile)
2132 SSL_CTX *client_ctx;
2135 tls_check_version();
2137 #if OPENSSL_VERSION_NUMBER < 0x10100000L
2138 SSL_load_error_strings();
2142 if (!tls_validate_digest(LN_sha1))
2143 msg_fatal(
"%s digest algorithm not available", LN_sha1);
2145 if (TLScontext_index < 0)
2146 if ((TLScontext_index = SSL_get_ex_new_index(0, 0, 0, 0, 0)) < 0)
2147 msg_fatal(
"Cannot allocate SSL application data index");
2150 if ((client_ctx = SSL_CTX_new(TLS_client_method())) == 0)
2151 msg_fatal(
"cannot allocate client SSL_CTX");
2152 SSL_CTX_set_verify_depth(client_ctx, 5);
2154 if (tls_set_ca_certificate_info(client_ctx, CAfile,
"") < 0) {
2156 msg_fatal(
"cannot load CAfile: %s", CAfile);
2158 SSL_CTX_set_verify(client_ctx, SSL_VERIFY_NONE,
2159 tls_verify_certificate_callback);
2160 return (client_ctx);
2163 int main(
int argc,
char *argv[])
2166 TLS_SESS_STATE *tctx;
2167 x509_stack_t *chain;
2176 ssl_ctx = ctx_init(argv[5]);
2177 if (!tls_dane_avail())
2178 msg_fatal(
"DANE TLSA support not available");
2180 tctx = tls_alloc_sess_context(TLS_LOG_NONE, argv[7]);
2181 tctx->namaddr = argv[7];
2182 tctx->mdalg = LN_sha1;
2183 tctx->dane = tls_dane_alloc();
2185 if ((tctx->con = SSL_new(ssl_ctx)) == 0
2186 || !SSL_set_ex_data(tctx->con, TLScontext_index, tctx)) {
2188 msg_fatal(
"Error allocating SSL connection");
2190 SSL_set_connect_state(tctx->con);
2191 add_tlsa((TLS_DANE *) tctx->dane, argv);
2192 tls_dane_set_callback(ssl_ctx, tctx);
2195 chain = load_chain(argv[6]);
2196 verify_chain(tctx->con, chain, tctx);
2197 check_peer(tctx, sk_X509_value(chain, 0), argc - 7, argv + 7);
2200 msg_info(
"%s %s", TLS_CERT_IS_MATCHED(tctx) ?
"Verified" :
2201 TLS_CERT_IS_TRUSTED(tctx) ?
"Trusted" :
"Untrusted", argv[7]);
2203 return (TLS_CERT_IS_MATCHED(tctx) ? 0 : 1);
#define DNS_TLSA_SELECTOR_FULL_CERTIFICATE
#define DNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION
char * mystrdup(const char *str)
void set_mail_conf_str(const char *, const char *)
ARGV * argv_free(ARGV *argvp)
NORETURN msg_panic(const char *fmt,...)
int main(int argc, char **argv)
const void * ctable_locate(CTABLE *cache, const char *key)
void argv_add(ARGV *argvp,...)
int timecmp(time_t t1, time_t t2)
char * mystrtok(char **src, const char *sep)
ARGV * argv_alloc(ssize_t len)
#define DNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE
#define VAR_TLS_DANE_DIGESTS
const void * ctable_refresh(CTABLE *cache, const char *key)
void msg_warn(const char *fmt,...)
CTABLE * ctable_create(ssize_t limit, CTABLE_CREATE_FN create, CTABLE_DELETE_FN delete, void *context)
VSTRING * vstring_alloc(ssize_t len)
#define DNS_TLSA_MATCHING_TYPE_NO_HASH_USED
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
unsigned long safe_strtoul(const char *start, char **end, int base)
char * lowercase(char *string)
NORETURN msg_fatal(const char *fmt,...)
#define DNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO
ARGV * argv_split(const char *, const char *)
char * var_tls_dane_digests
int strcasecmp(const char *s1, const char *s2)
unsigned int dnssec_valid
ARGV * argv_split_append(ARGV *, const char *, const char *)
char * split_at(char *string, int delimiter)
void msg_vstream_init(const char *name, VSTREAM *vp)
#define DNS_TLSA_MATCHING_TYPE_SHA256
DNS_RR * dns_rr_sort(DNS_RR *, int(*)(DNS_RR *, DNS_RR *))
bool var_tls_multi_wildcard
#define DNS_TLSA_MATCHING_TYPE_SHA512
void ctable_free(CTABLE *cache)
void dns_rr_free(DNS_RR *)
#define dns_lookup(name, type, rflags, list, fqdn, why)
void * mymalloc(ssize_t len)
void msg_info(const char *fmt,...)