xref: /dragonfly/contrib/ldns/dane.c (revision 7733acb50455a11cc2ee36edd926ff0fa3361e9a)
1 /*
2  * Verify or create TLS authentication with DANE (RFC6698)
3  *
4  * (c) NLnetLabs 2012-2020
5  *
6  * See the file LICENSE for the license.
7  *
8  */
9 
10 #include <ldns/config.h>
11 #ifdef USE_DANE
12 
13 #include <ldns/ldns.h>
14 #include <ldns/dane.h>
15 
16 #include <unistd.h>
17 #include <stdlib.h>
18 #include <sys/types.h>
19 #ifdef HAVE_SYS_SOCKET_H
20 #include <sys/socket.h>
21 #endif
22 #ifdef HAVE_NETDB_H
23 #include <netdb.h>
24 #endif
25 
26 #ifdef HAVE_SSL
27 #include <openssl/ssl.h>
28 #include <openssl/err.h>
29 #include <openssl/x509v3.h>
30 #endif
31 
32 /* OpenSSL context options. At the moment, disable SSLv2, SSLv3
33  * and Compression, if available. TLSv1.0 is allowed at the moment.
34  * TLSv1.1 is the first to provide elliptic curves, so it is usually
35  * allowed in a TLS stack. TLSv1.2 is the first to provide authentication
36  * modes of operation, like GCM. The defines below are a moving
37  * target based on OpenSSL library version. Grep is useful to find
38  * the defines: grep -IR SSL_OP_NO_ /usr/include/openssl.
39  */
40 #ifdef HAVE_SSL
41 # ifdef SSL_OP_NO_SSLv2
42           const long NoOpenSSLv2 = SSL_OP_NO_SSLv2;
43 # else
44           const long NoOpenSSLv2 = 0L;
45 # endif
46 # ifdef SSL_OP_NO_SSLv3
47           const long NoOpenSSLv3 = SSL_OP_NO_SSLv3;
48 # else
49           const long NoOpenSSLv3 = 0L;
50 # endif
51 # ifdef SSL_OP_NO_TLSv1
52           const long NoOpenTLSv1 = SSL_OP_NO_TLSv1;
53 # else
54           const long NoOpenTLSv1 = 0L;
55 # endif
56 # ifdef SSL_OP_NO_DTLSv1
57           const long NoOpenDTLSv1 = SSL_OP_NO_DTLSv1;
58 # else
59           const long NoOpenDTLSv1 = 0L;
60 # endif
61 # ifdef SSL_OP_NO_COMPRESSION
62           const long NoOpenSSLCompression = SSL_OP_NO_COMPRESSION;
63 # else
64           const long NoOpenSSLCompression = 0L;
65 # endif
66 #endif
67 
68 #if defined(USE_DANE_VERIFY) && defined(USE_DANE_TA_USAGE)
69 static SSL_CTX*
ldns_dane_new_ssl_context(void)70 ldns_dane_new_ssl_context(void)
71 {
72           SSL_CTX* ssl_ctx;
73 
74           ssl_ctx = SSL_CTX_new(TLS_client_method());
75           if (ssl_ctx != NULL)
76           {
77                     /* ldns allows TLS and DTLS v1.0 at the moment. Some may disagree.
78                      * Sometime in the future they may be disabled, too. Maybe
79                      * --disable-tlsv1 and --disable-dtlsv1 should be configure options.
80                      */
81                     long flags = NoOpenSSLv2 | NoOpenSSLv3 | NoOpenSSLCompression;
82                     SSL_CTX_set_options(ssl_ctx, flags);
83           }
84 
85           return ssl_ctx;
86 }
87 #endif
88 
89 ldns_status
ldns_dane_create_tlsa_owner(ldns_rdf ** tlsa_owner,const ldns_rdf * name,uint16_t port,ldns_dane_transport transport)90 ldns_dane_create_tlsa_owner(ldns_rdf** tlsa_owner, const ldns_rdf* name,
91                     uint16_t port, ldns_dane_transport transport)
92 {
93           char buf[LDNS_MAX_DOMAINLEN];
94           size_t s;
95 
96           assert(tlsa_owner != NULL);
97           assert(name != NULL);
98           assert(ldns_rdf_get_type(name) == LDNS_RDF_TYPE_DNAME);
99 
100           s = (size_t)snprintf(buf, LDNS_MAX_DOMAINLEN, "X_%d", (int)port);
101           buf[0] = (char)(s - 1);
102 
103           switch(transport) {
104           case LDNS_DANE_TRANSPORT_TCP:
105                     s += snprintf(buf + s, LDNS_MAX_DOMAINLEN - s, "\004_tcp");
106                     break;
107 
108           case LDNS_DANE_TRANSPORT_UDP:
109                     s += snprintf(buf + s, LDNS_MAX_DOMAINLEN - s, "\004_udp");
110                     break;
111 
112           case LDNS_DANE_TRANSPORT_SCTP:
113                     s += snprintf(buf + s, LDNS_MAX_DOMAINLEN - s, "\005_sctp");
114                     break;
115 
116           default:
117                     return LDNS_STATUS_DANE_UNKNOWN_TRANSPORT;
118           }
119           if (s + ldns_rdf_size(name) > LDNS_MAX_DOMAINLEN) {
120                     return LDNS_STATUS_DOMAINNAME_OVERFLOW;
121           }
122           memcpy(buf + s, ldns_rdf_data(name), ldns_rdf_size(name));
123           *tlsa_owner = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME,
124                               s + ldns_rdf_size(name), buf);
125           if (*tlsa_owner == NULL) {
126                     return LDNS_STATUS_MEM_ERR;
127           }
128           return LDNS_STATUS_OK;
129 }
130 
131 
132 #ifdef HAVE_SSL
133 ldns_status
ldns_dane_cert2rdf(ldns_rdf ** rdf,X509 * cert,ldns_tlsa_selector selector,ldns_tlsa_matching_type matching_type)134 ldns_dane_cert2rdf(ldns_rdf** rdf, X509* cert,
135                     ldns_tlsa_selector      selector,
136                     ldns_tlsa_matching_type matching_type)
137 {
138           unsigned char* buf = NULL;
139           size_t len;
140 
141           X509_PUBKEY* xpubkey;
142           EVP_PKEY* epubkey;
143 
144           unsigned char* digest;
145 
146           assert(rdf != NULL);
147           assert(cert != NULL);
148 
149           switch(selector) {
150           case LDNS_TLSA_SELECTOR_FULL_CERTIFICATE:
151 
152                     len = (size_t)i2d_X509(cert, &buf);
153                     break;
154 
155           case LDNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO:
156 
157 #ifndef S_SPLINT_S
158                     xpubkey = X509_get_X509_PUBKEY(cert);
159 #endif
160                     if (! xpubkey) {
161                               return LDNS_STATUS_SSL_ERR;
162                     }
163                     epubkey = X509_PUBKEY_get(xpubkey);
164                     if (! epubkey) {
165                               return LDNS_STATUS_SSL_ERR;
166                     }
167                     len = (size_t)i2d_PUBKEY(epubkey, &buf);
168                     break;
169 
170           default:
171                     return LDNS_STATUS_DANE_UNKNOWN_SELECTOR;
172           }
173 
174           switch(matching_type) {
175           case LDNS_TLSA_MATCHING_TYPE_NO_HASH_USED:
176 
177                     *rdf = ldns_rdf_new(LDNS_RDF_TYPE_HEX, len, buf);
178 
179                     return *rdf ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR;
180                     break;
181 
182           case LDNS_TLSA_MATCHING_TYPE_SHA256:
183 
184                     digest = LDNS_XMALLOC(unsigned char, LDNS_SHA256_DIGEST_LENGTH);
185                     if (digest == NULL) {
186                               LDNS_FREE(buf);
187                               return LDNS_STATUS_MEM_ERR;
188                     }
189                     (void) ldns_sha256(buf, (unsigned int)len, digest);
190                     *rdf = ldns_rdf_new(LDNS_RDF_TYPE_HEX, LDNS_SHA256_DIGEST_LENGTH,
191                                         digest);
192                     LDNS_FREE(buf);
193 
194                     return *rdf ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR;
195                     break;
196 
197           case LDNS_TLSA_MATCHING_TYPE_SHA512:
198 
199                     digest = LDNS_XMALLOC(unsigned char, LDNS_SHA512_DIGEST_LENGTH);
200                     if (digest == NULL) {
201                               LDNS_FREE(buf);
202                               return LDNS_STATUS_MEM_ERR;
203                     }
204                     (void) ldns_sha512(buf, (unsigned int)len, digest);
205                     *rdf = ldns_rdf_new(LDNS_RDF_TYPE_HEX, LDNS_SHA512_DIGEST_LENGTH,
206                                         digest);
207                     LDNS_FREE(buf);
208 
209                     return *rdf ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR;
210                     break;
211 
212           default:
213                     LDNS_FREE(buf);
214                     return LDNS_STATUS_DANE_UNKNOWN_MATCHING_TYPE;
215           }
216 }
217 
218 
219 /* Ordinary PKIX validation of cert (with extra_certs to help)
220  * against the CA's in store
221  */
222 static ldns_status
ldns_dane_pkix_validate(X509 * cert,STACK_OF (X509)* extra_certs,X509_STORE * store)223 ldns_dane_pkix_validate(X509* cert, STACK_OF(X509)* extra_certs,
224                     X509_STORE* store)
225 {
226           X509_STORE_CTX* vrfy_ctx;
227           ldns_status s;
228 
229           if (! store) {
230                     return LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE;
231           }
232           vrfy_ctx = X509_STORE_CTX_new();
233           if (! vrfy_ctx) {
234 
235                     return LDNS_STATUS_SSL_ERR;
236 
237           } else if (X509_STORE_CTX_init(vrfy_ctx, store,
238                                         cert, extra_certs) != 1) {
239                     s = LDNS_STATUS_SSL_ERR;
240 
241           } else if (X509_verify_cert(vrfy_ctx) == 1) {
242 
243                     s = LDNS_STATUS_OK;
244 
245           } else {
246                     s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE;
247           }
248           X509_STORE_CTX_free(vrfy_ctx);
249           return s;
250 }
251 
252 
253 /* Ordinary PKIX validation of cert (with extra_certs to help)
254  * against the CA's in store, but also return the validation chain.
255  */
256 static ldns_status
ldns_dane_pkix_validate_and_get_chain(STACK_OF (X509)** chain,X509 * cert,STACK_OF (X509)* extra_certs,X509_STORE * store)257 ldns_dane_pkix_validate_and_get_chain(STACK_OF(X509)** chain, X509* cert,
258                     STACK_OF(X509)* extra_certs, X509_STORE* store)
259 {
260           ldns_status s;
261           X509_STORE* empty_store = NULL;
262           X509_STORE_CTX* vrfy_ctx;
263 
264           assert(chain != NULL);
265 
266           if (! store) {
267                     store = empty_store = X509_STORE_new();
268           }
269           s = LDNS_STATUS_SSL_ERR;
270           vrfy_ctx = X509_STORE_CTX_new();
271           if (! vrfy_ctx) {
272 
273                     goto exit_free_empty_store;
274 
275           } else if (X509_STORE_CTX_init(vrfy_ctx, store,
276                                                   cert, extra_certs) != 1) {
277                     goto exit_free_vrfy_ctx;
278 
279           } else if (X509_verify_cert(vrfy_ctx) == 1) {
280 
281                     s = LDNS_STATUS_OK;
282 
283           } else {
284                     s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE;
285           }
286           *chain = X509_STORE_CTX_get1_chain(vrfy_ctx);
287           if (! *chain) {
288                     s = LDNS_STATUS_SSL_ERR;
289           }
290 
291 exit_free_vrfy_ctx:
292           X509_STORE_CTX_free(vrfy_ctx);
293 
294 exit_free_empty_store:
295           if (empty_store) {
296                     X509_STORE_free(empty_store);
297           }
298           return s;
299 }
300 
301 
302 /* Return the validation chain that can be build out of cert, with extra_certs.
303  */
304 static ldns_status
ldns_dane_pkix_get_chain(STACK_OF (X509)** chain,X509 * cert,STACK_OF (X509)* extra_certs)305 ldns_dane_pkix_get_chain(STACK_OF(X509)** chain,
306                     X509* cert, STACK_OF(X509)* extra_certs)
307 {
308           ldns_status s;
309           X509_STORE* empty_store = NULL;
310           X509_STORE_CTX* vrfy_ctx;
311 
312           assert(chain != NULL);
313 
314           empty_store = X509_STORE_new();
315           s = LDNS_STATUS_SSL_ERR;
316           vrfy_ctx = X509_STORE_CTX_new();
317           if (! vrfy_ctx) {
318 
319                     goto exit_free_empty_store;
320 
321           } else if (X509_STORE_CTX_init(vrfy_ctx, empty_store,
322                                                   cert, extra_certs) != 1) {
323                     goto exit_free_vrfy_ctx;
324           }
325           (void) X509_verify_cert(vrfy_ctx);
326           *chain = X509_STORE_CTX_get1_chain(vrfy_ctx);
327           if (! *chain) {
328                     s = LDNS_STATUS_SSL_ERR;
329           } else {
330                     s = LDNS_STATUS_OK;
331           }
332 exit_free_vrfy_ctx:
333           X509_STORE_CTX_free(vrfy_ctx);
334 
335 exit_free_empty_store:
336           X509_STORE_free(empty_store);
337           return s;
338 }
339 
340 
341 /* Pop n+1 certs and return the last popped.
342  */
343 static ldns_status
ldns_dane_get_nth_cert_from_validation_chain(X509 ** cert,STACK_OF (X509)* chain,int n,bool ca)344 ldns_dane_get_nth_cert_from_validation_chain(
345                     X509** cert, STACK_OF(X509)* chain, int n, bool ca)
346 {
347           if (n >= sk_X509_num(chain) || n < 0) {
348                     return LDNS_STATUS_DANE_OFFSET_OUT_OF_RANGE;
349           }
350           *cert = sk_X509_pop(chain);
351           while (n-- > 0) {
352                     X509_free(*cert);
353                     *cert = sk_X509_pop(chain);
354           }
355           if (ca && ! X509_check_ca(*cert)) {
356                     return LDNS_STATUS_DANE_NON_CA_CERTIFICATE;
357           }
358           return LDNS_STATUS_OK;
359 }
360 
361 
362 /* Create validation chain with cert and extra_certs and returns the last
363  * self-signed (if present).
364  */
365 static ldns_status
ldns_dane_pkix_get_last_self_signed(X509 ** out_cert,X509 * cert,STACK_OF (X509)* extra_certs)366 ldns_dane_pkix_get_last_self_signed(X509** out_cert,
367                     X509* cert, STACK_OF(X509)* extra_certs)
368 {
369           ldns_status s;
370           X509_STORE* empty_store = NULL;
371           X509_STORE_CTX* vrfy_ctx;
372 
373           assert(out_cert != NULL);
374 
375           empty_store = X509_STORE_new();
376           s = LDNS_STATUS_SSL_ERR;
377           vrfy_ctx = X509_STORE_CTX_new();
378           if (! vrfy_ctx) {
379                     goto exit_free_empty_store;
380 
381           } else if (X509_STORE_CTX_init(vrfy_ctx, empty_store,
382                                                   cert, extra_certs) != 1) {
383                     goto exit_free_vrfy_ctx;
384 
385           }
386           (void) X509_verify_cert(vrfy_ctx);
387           if (X509_STORE_CTX_get_error(vrfy_ctx) == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN ||
388               X509_STORE_CTX_get_error(vrfy_ctx) == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT){
389 
390                     *out_cert = X509_STORE_CTX_get_current_cert( vrfy_ctx);
391                     s = LDNS_STATUS_OK;
392           } else {
393                     s = LDNS_STATUS_DANE_PKIX_NO_SELF_SIGNED_TRUST_ANCHOR;
394           }
395 exit_free_vrfy_ctx:
396           X509_STORE_CTX_free(vrfy_ctx);
397 
398 exit_free_empty_store:
399           X509_STORE_free(empty_store);
400           return s;
401 }
402 
403 
404 ldns_status
ldns_dane_select_certificate(X509 ** selected_cert,X509 * cert,STACK_OF (X509)* extra_certs,X509_STORE * pkix_validation_store,ldns_tlsa_certificate_usage cert_usage,int offset)405 ldns_dane_select_certificate(X509** selected_cert,
406                     X509* cert, STACK_OF(X509)* extra_certs,
407                     X509_STORE* pkix_validation_store,
408                     ldns_tlsa_certificate_usage cert_usage, int offset)
409 {
410           ldns_status s;
411           STACK_OF(X509)* pkix_validation_chain = NULL;
412 
413           assert(selected_cert != NULL);
414           assert(cert != NULL);
415 
416           /* With PKIX validation explicitly turned off (pkix_validation_store
417            *  == NULL), treat the "CA constraint" and "Service certificate
418            * constraint" the same as "Trust anchor assertion" and "Domain issued
419            * certificate" respectively.
420            */
421           if (pkix_validation_store == NULL) {
422                     switch (cert_usage) {
423 
424                     case LDNS_TLSA_USAGE_CA_CONSTRAINT:
425 
426                               cert_usage = LDNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION;
427                               break;
428 
429                     case LDNS_TLSA_USAGE_SERVICE_CERTIFICATE_CONSTRAINT:
430 
431                               cert_usage = LDNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE;
432                               break;
433 
434                     default:
435                               break;
436                     }
437           }
438 
439           /* Now what to do with each Certificate usage...
440            */
441           switch (cert_usage) {
442 
443           case LDNS_TLSA_USAGE_CA_CONSTRAINT:
444 
445                     s = ldns_dane_pkix_validate_and_get_chain(
446                                         &pkix_validation_chain,
447                                         cert, extra_certs,
448                                         pkix_validation_store);
449                     if (! pkix_validation_chain) {
450                               return s;
451                     }
452                     if (s == LDNS_STATUS_OK) {
453                               if (offset == -1) {
454                                         offset = 0;
455                               }
456                               s = ldns_dane_get_nth_cert_from_validation_chain(
457                                                   selected_cert, pkix_validation_chain,
458                                                   offset, true);
459                     }
460                     sk_X509_pop_free(pkix_validation_chain, X509_free);
461                     return s;
462                     break;
463 
464 
465           case LDNS_TLSA_USAGE_SERVICE_CERTIFICATE_CONSTRAINT:
466 
467                     *selected_cert = cert;
468                     return ldns_dane_pkix_validate(cert, extra_certs,
469                                         pkix_validation_store);
470                     break;
471 
472 
473           case LDNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION:
474 
475                     if (offset == -1) {
476                               s = ldns_dane_pkix_get_last_self_signed(
477                                                   selected_cert, cert, extra_certs);
478                               return s;
479                     } else {
480                               s = ldns_dane_pkix_get_chain(
481                                                   &pkix_validation_chain,
482                                                   cert, extra_certs);
483                               if (s == LDNS_STATUS_OK) {
484                                         s =
485                                         ldns_dane_get_nth_cert_from_validation_chain(
486                                                   selected_cert, pkix_validation_chain,
487                                                   offset, false);
488                               } else if (! pkix_validation_chain) {
489                                         return s;
490                               }
491                               sk_X509_pop_free(pkix_validation_chain, X509_free);
492                               return s;
493                     }
494                     break;
495 
496 
497           case LDNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE:
498 
499                     *selected_cert = cert;
500                     return LDNS_STATUS_OK;
501                     break;
502 
503           default:
504                     return LDNS_STATUS_DANE_UNKNOWN_CERTIFICATE_USAGE;
505                     break;
506           }
507 }
508 
509 
510 ldns_status
ldns_dane_create_tlsa_rr(ldns_rr ** tlsa,ldns_tlsa_certificate_usage certificate_usage,ldns_tlsa_selector selector,ldns_tlsa_matching_type matching_type,X509 * cert)511 ldns_dane_create_tlsa_rr(ldns_rr** tlsa,
512                     ldns_tlsa_certificate_usage certificate_usage,
513                     ldns_tlsa_selector          selector,
514                     ldns_tlsa_matching_type     matching_type,
515                     X509* cert)
516 {
517           ldns_rdf* rdf;
518           ldns_status s;
519 
520           assert(tlsa != NULL);
521           assert(cert != NULL);
522 
523           /* create rr */
524           *tlsa = ldns_rr_new_frm_type(LDNS_RR_TYPE_TLSA);
525           if (*tlsa == NULL) {
526                     return LDNS_STATUS_MEM_ERR;
527           }
528 
529           rdf = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8,
530                               (uint8_t)certificate_usage);
531           if (rdf == NULL) {
532                     goto memerror;
533           }
534           (void) ldns_rr_set_rdf(*tlsa, rdf, 0);
535 
536           rdf = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t)selector);
537           if (rdf == NULL) {
538                     goto memerror;
539           }
540           (void) ldns_rr_set_rdf(*tlsa, rdf, 1);
541 
542           rdf = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t)matching_type);
543           if (rdf == NULL) {
544                     goto memerror;
545           }
546           (void) ldns_rr_set_rdf(*tlsa, rdf, 2);
547 
548           s = ldns_dane_cert2rdf(&rdf, cert, selector, matching_type);
549           if (s == LDNS_STATUS_OK) {
550                     (void) ldns_rr_set_rdf(*tlsa, rdf, 3);
551                     return LDNS_STATUS_OK;
552           }
553           ldns_rr_free(*tlsa);
554           *tlsa = NULL;
555           return s;
556 
557 memerror:
558           ldns_rr_free(*tlsa);
559           *tlsa = NULL;
560           return LDNS_STATUS_MEM_ERR;
561 }
562 
563 
564 #ifdef USE_DANE_VERIFY
565 /* Return tlsas that actually are TLSA resource records with known values
566  * for the Certificate usage, Selector and Matching type rdata fields.
567  */
568 static ldns_rr_list*
ldns_dane_filter_unusable_records(const ldns_rr_list * tlsas)569 ldns_dane_filter_unusable_records(const ldns_rr_list* tlsas)
570 {
571           size_t i;
572           ldns_rr_list* r = ldns_rr_list_new();
573           ldns_rr* tlsa_rr;
574 
575           if (! r) {
576                     return NULL;
577           }
578           for (i = 0; i < ldns_rr_list_rr_count(tlsas); i++) {
579                     tlsa_rr = ldns_rr_list_rr(tlsas, i);
580                     if (ldns_rr_get_type(tlsa_rr) == LDNS_RR_TYPE_TLSA &&
581                         ldns_rr_rd_count(tlsa_rr) == 4 &&
582                         ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 0)) <= 3 &&
583                         ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 1)) <= 1 &&
584                         ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 2)) <= 2) {
585 
586                               if (! ldns_rr_list_push_rr(r, tlsa_rr)) {
587                                         ldns_rr_list_free(r);
588                                         return NULL;
589                               }
590                     }
591           }
592           return r;
593 }
594 
595 
596 #if !defined(USE_DANE_TA_USAGE)
597 /* Return whether cert/selector/matching_type matches data.
598  */
599 static ldns_status
ldns_dane_match_cert_with_data(X509 * cert,ldns_tlsa_selector selector,ldns_tlsa_matching_type matching_type,ldns_rdf * data)600 ldns_dane_match_cert_with_data(X509* cert, ldns_tlsa_selector selector,
601                     ldns_tlsa_matching_type matching_type, ldns_rdf* data)
602 {
603           ldns_status s;
604           ldns_rdf* match_data;
605 
606           s = ldns_dane_cert2rdf(&match_data, cert, selector, matching_type);
607           if (s == LDNS_STATUS_OK) {
608                     if (ldns_rdf_compare(data, match_data) != 0) {
609                               s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH;
610                     }
611                     ldns_rdf_free(match_data);
612           }
613           return s;
614 }
615 
616 
617 /* Return whether any certificate from the chain with selector/matching_type
618  * matches data.
619  * ca should be true if the certificate has to be a CA certificate too.
620  */
621 static ldns_status
ldns_dane_match_any_cert_with_data(STACK_OF (X509)* chain,ldns_tlsa_selector selector,ldns_tlsa_matching_type matching_type,ldns_rdf * data,bool ca)622 ldns_dane_match_any_cert_with_data(STACK_OF(X509)* chain,
623                     ldns_tlsa_selector      selector,
624                     ldns_tlsa_matching_type matching_type,
625                     ldns_rdf* data, bool ca)
626 {
627           ldns_status s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH;
628           size_t n, i;
629           X509* cert;
630 
631           n = (size_t)sk_X509_num(chain);
632           for (i = 0; i < n; i++) {
633                     cert = sk_X509_pop(chain);
634                     if (! cert) {
635                               s = LDNS_STATUS_SSL_ERR;
636                               break;
637                     }
638                     s = ldns_dane_match_cert_with_data(cert,
639                                         selector, matching_type, data);
640                     if (ca && s == LDNS_STATUS_OK && ! X509_check_ca(cert)) {
641                               s = LDNS_STATUS_DANE_NON_CA_CERTIFICATE;
642                     }
643                     X509_free(cert);
644                     if (s != LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH) {
645                               break;
646                     }
647                     /* when s == LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH,
648                      * try to match the next certificate
649                      */
650           }
651           return s;
652 }
653 #endif /* !defined(USE_DANE_TA_USAGE) */
654 #endif /* USE_DANE_VERIFY */
655 
656 #ifdef USE_DANE_VERIFY
657 ldns_status
ldns_dane_verify_rr(const ldns_rr * tlsa_rr,X509 * cert,STACK_OF (X509)* extra_certs,X509_STORE * pkix_validation_store)658 ldns_dane_verify_rr(const ldns_rr* tlsa_rr,
659                     X509* cert, STACK_OF(X509)* extra_certs,
660                     X509_STORE* pkix_validation_store)
661 {
662 #if defined(USE_DANE_TA_USAGE)
663           SSL_CTX *ssl_ctx = NULL;
664           SSL *ssl = NULL;
665           X509_STORE_CTX *store_ctx = NULL;
666 #else
667           STACK_OF(X509)* pkix_validation_chain = NULL;
668 #endif
669           ldns_status s = LDNS_STATUS_OK;
670 
671           ldns_tlsa_certificate_usage usage;
672           ldns_tlsa_selector          selector;
673           ldns_tlsa_matching_type     mtype;
674           ldns_rdf*                   data;
675 
676           if (! tlsa_rr || ldns_rr_get_type(tlsa_rr) != LDNS_RR_TYPE_TLSA ||
677                               ldns_rr_rd_count(tlsa_rr) != 4 ||
678                               ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 0)) > 3 ||
679                               ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 1)) > 1 ||
680                               ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 2)) > 2 ) {
681                     /* No (usable) TLSA, so regular PKIX validation
682                      */
683                     return ldns_dane_pkix_validate(cert, extra_certs,
684                                         pkix_validation_store);
685           }
686           usage    = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 0));
687           selector = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 1));
688           mtype    = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 2));
689           data     =                      ldns_rr_rdf(tlsa_rr, 3) ;
690 
691 #if defined(USE_DANE_TA_USAGE)
692           /* Rely on OpenSSL dane functions.
693            *
694            * OpenSSL does not provide offline dane verification.  The dane unit
695            * tests within openssl use the undocumented SSL_get0_dane() and
696            * X509_STORE_CTX_set0_dane() to convey dane parameters set on SSL and
697            * SSL_CTX to a X509_STORE_CTX that can be used to do offline
698            * verification.  We use these undocumented means with the ldns
699            * dane function prototypes which did only offline dane verification.
700            */
701           if (!(ssl_ctx = ldns_dane_new_ssl_context()))
702                     s = LDNS_STATUS_MEM_ERR;
703 
704           else if (SSL_CTX_dane_enable(ssl_ctx) <= 0)
705                     s = LDNS_STATUS_SSL_ERR;
706 
707           else if (SSL_CTX_dane_set_flags(
708                                         ssl_ctx, DANE_FLAG_NO_DANE_EE_NAMECHECKS),
709                               !(ssl = SSL_new(ssl_ctx)))
710                     s = LDNS_STATUS_MEM_ERR;
711 
712           else if (SSL_set_connect_state(ssl),
713                               (SSL_dane_enable(ssl, NULL) <= 0))
714                     s = LDNS_STATUS_SSL_ERR;
715 
716           else if (SSL_dane_tlsa_add(ssl, usage, selector, mtype,
717                                         ldns_rdf_data(data), ldns_rdf_size(data)) <= 0)
718                     s = LDNS_STATUS_SSL_ERR;
719 
720           else if (!(store_ctx =  X509_STORE_CTX_new()))
721                     s = LDNS_STATUS_MEM_ERR;
722 
723           else if (!X509_STORE_CTX_init(store_ctx, pkix_validation_store, cert, extra_certs))
724                     s = LDNS_STATUS_SSL_ERR;
725 
726           else {
727                     int ret;
728 
729                     X509_STORE_CTX_set_default(store_ctx,
730                                         SSL_is_server(ssl) ? "ssl_client" : "ssl_server");
731                     X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(store_ctx),
732                                         SSL_get0_param(ssl));
733                     X509_STORE_CTX_set0_dane(store_ctx, SSL_get0_dane(ssl));
734                     if (SSL_get_verify_callback(ssl))
735                               X509_STORE_CTX_set_verify_cb(store_ctx, SSL_get_verify_callback(ssl));
736 
737                     ret = X509_verify_cert(store_ctx);
738                     if (!ret) {
739                               if (X509_STORE_CTX_get_error(store_ctx) == X509_V_ERR_DANE_NO_MATCH)
740                                         s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH;
741                               else
742                                         s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE;
743                     }
744                     X509_STORE_CTX_cleanup(store_ctx);
745           }
746           if (store_ctx)
747                     X509_STORE_CTX_free(store_ctx);
748           if (ssl)
749                     SSL_free(ssl);
750           if (ssl_ctx)
751                     SSL_CTX_free(ssl_ctx);
752           return s;
753 #else
754           switch (usage) {
755           case LDNS_TLSA_USAGE_CA_CONSTRAINT:
756                     s = ldns_dane_pkix_validate_and_get_chain(
757                                         &pkix_validation_chain,
758                                         cert, extra_certs,
759                                         pkix_validation_store);
760                     if (! pkix_validation_chain) {
761                               return s;
762                     }
763                     if (s == LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE) {
764                               /*
765                                * NO PKIX validation. We still try to match *any*
766                                * certificate from the chain, so we return
767                                * TLSA errors over PKIX errors.
768                                *
769                                * i.e. When the TLSA matches no certificate, we return
770                                * TLSA_DID_NOT_MATCH and not PKIX_DID_NOT_VALIDATE
771                                */
772                               s = ldns_dane_match_any_cert_with_data(
773                                                   pkix_validation_chain,
774                                                   selector, mtype, data, true);
775 
776                               if (s == LDNS_STATUS_OK) {
777                                         /* A TLSA record did match a cert from the
778                                          * chain, thus the error is failed PKIX
779                                          * validation.
780                                          */
781                                         s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE;
782                               }
783 
784                     } else if (s == LDNS_STATUS_OK) {
785                               /* PKIX validated, does the TLSA match too? */
786 
787                               s = ldns_dane_match_any_cert_with_data(
788                                                   pkix_validation_chain,
789                                                   selector, mtype, data, true);
790                     }
791                     sk_X509_pop_free(pkix_validation_chain, X509_free);
792                     return s;
793                     break;
794 
795           case LDNS_TLSA_USAGE_SERVICE_CERTIFICATE_CONSTRAINT:
796 
797                     s = ldns_dane_match_cert_with_data(cert,
798                                         selector, mtype, data);
799 
800                     if (s == LDNS_STATUS_OK) {
801                               return ldns_dane_pkix_validate(cert, extra_certs,
802                                                   pkix_validation_store);
803                     }
804                     return s;
805                     break;
806 
807           case LDNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION:
808 #if 0
809                     s = ldns_dane_pkix_get_chain(&pkix_validation_chain,
810                                         cert, extra_certs);
811 
812                     if (s == LDNS_STATUS_OK) {
813                               s = ldns_dane_match_any_cert_with_data(
814                                                   pkix_validation_chain,
815                                                   selector, mtype, data, false);
816 
817                     } else if (! pkix_validation_chain) {
818                               return s;
819                     }
820                     sk_X509_pop_free(pkix_validation_chain, X509_free);
821                     return s;
822 #else
823                     return LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA;
824 #endif
825                     break;
826 
827           case LDNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE:
828                     return ldns_dane_match_cert_with_data(cert,
829                                         selector, mtype, data);
830                     break;
831 
832           default:
833                     break;
834           }
835 #endif
836           return LDNS_STATUS_DANE_UNKNOWN_CERTIFICATE_USAGE;
837 }
838 
839 
840 ldns_status
ldns_dane_verify(const ldns_rr_list * tlsas,X509 * cert,STACK_OF (X509)* extra_certs,X509_STORE * pkix_validation_store)841 ldns_dane_verify(const ldns_rr_list* tlsas,
842                     X509* cert, STACK_OF(X509)* extra_certs,
843                     X509_STORE* pkix_validation_store)
844 {
845 #if defined(USE_DANE_TA_USAGE)
846           SSL_CTX *ssl_ctx = NULL;
847           ldns_rdf *basename_rdf = NULL;
848           char *basename = NULL;
849           SSL *ssl = NULL;
850           X509_STORE_CTX *store_ctx = NULL;
851 #else
852           ldns_status ps;
853 #endif
854           size_t i;
855           ldns_rr* tlsa_rr;
856           ldns_rr_list *usable_tlsas;
857           ldns_status s = LDNS_STATUS_OK;
858 
859           assert(cert != NULL);
860 
861           if (! tlsas || ldns_rr_list_rr_count(tlsas) == 0)
862                     /* No TLSA's, so regular PKIX validation
863                      */
864                     return ldns_dane_pkix_validate(cert, extra_certs,
865                                         pkix_validation_store);
866 
867 /* To enable name checks (which we don't) */
868 #if defined(USE_DANE_TA_USAGE) && 0
869           else if (!(basename_rdf = ldns_dname_clone_from(
870                                                   ldns_rr_list_owner(tlsas), 2)))
871                     /* Could nog get DANE base name */
872                     s = LDNS_STATUS_ERR;
873 
874           else if (!(basename = ldns_rdf2str(basename_rdf)))
875                     s = LDNS_STATUS_MEM_ERR;
876 
877           else if (strlen(basename) && (basename[strlen(basename)-1]  = 0))
878                     s = LDNS_STATUS_ERR; /* Intended to be unreachable */
879 #endif
880 
881           else if (!(usable_tlsas = ldns_dane_filter_unusable_records(tlsas)))
882                     return LDNS_STATUS_MEM_ERR;
883 
884           else if (ldns_rr_list_rr_count(usable_tlsas) == 0) {
885                     /* No TLSA's, so regular PKIX validation
886                      */
887                     ldns_rr_list_free(usable_tlsas);
888                     return ldns_dane_pkix_validate(cert, extra_certs,
889                                         pkix_validation_store);
890           }
891 #if defined(USE_DANE_TA_USAGE)
892           /* Rely on OpenSSL dane functions.
893            *
894            * OpenSSL does not provide offline dane verification.  The dane unit
895            * tests within openssl use the undocumented SSL_get0_dane() and
896            * X509_STORE_CTX_set0_dane() to convey dane parameters set on SSL and
897            * SSL_CTX to a X509_STORE_CTX that can be used to do offline
898            * verification.  We use these undocumented means with the ldns
899            * dane function prototypes which did only offline dane verification.
900            */
901           if (!(ssl_ctx = ldns_dane_new_ssl_context()))
902                     s = LDNS_STATUS_MEM_ERR;
903 
904           else if (SSL_CTX_dane_enable(ssl_ctx) <= 0)
905                     s = LDNS_STATUS_SSL_ERR;
906 
907           else if (SSL_CTX_dane_set_flags(
908                                         ssl_ctx, DANE_FLAG_NO_DANE_EE_NAMECHECKS),
909                               !(ssl = SSL_new(ssl_ctx)))
910                     s = LDNS_STATUS_MEM_ERR;
911 
912           else if (SSL_set_connect_state(ssl),
913                               (SSL_dane_enable(ssl, basename) <= 0))
914                     s = LDNS_STATUS_SSL_ERR;
915 
916           else for (i = 0; i < ldns_rr_list_rr_count(usable_tlsas); i++) {
917                     ldns_tlsa_certificate_usage usage;
918                     ldns_tlsa_selector          selector;
919                     ldns_tlsa_matching_type     mtype;
920                     ldns_rdf*                   data;
921 
922                     tlsa_rr = ldns_rr_list_rr(usable_tlsas, i);
923                     usage   = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr,0));
924                     selector= ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr,1));
925                     mtype   = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr,2));
926                     data    =                      ldns_rr_rdf(tlsa_rr,3) ;
927 
928                     if (SSL_dane_tlsa_add(ssl, usage, selector, mtype,
929                                                   ldns_rdf_data(data),
930                                                   ldns_rdf_size(data)) <= 0) {
931                               s = LDNS_STATUS_SSL_ERR;
932                               break;
933                     }
934           }
935           if (!s && !(store_ctx =  X509_STORE_CTX_new()))
936                     s = LDNS_STATUS_MEM_ERR;
937 
938           else if (!X509_STORE_CTX_init(store_ctx, pkix_validation_store, cert, extra_certs))
939                     s = LDNS_STATUS_SSL_ERR;
940 
941           else {
942                     int ret;
943 
944                     X509_STORE_CTX_set_default(store_ctx,
945                                         SSL_is_server(ssl) ? "ssl_client" : "ssl_server");
946                     X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(store_ctx),
947                                         SSL_get0_param(ssl));
948                     X509_STORE_CTX_set0_dane(store_ctx, SSL_get0_dane(ssl));
949                     if (SSL_get_verify_callback(ssl))
950                               X509_STORE_CTX_set_verify_cb(store_ctx, SSL_get_verify_callback(ssl));
951 
952                     ret = X509_verify_cert(store_ctx);
953                     if (!ret) {
954                               if (X509_STORE_CTX_get_error(store_ctx) == X509_V_ERR_DANE_NO_MATCH)
955                                         s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH;
956                               else
957                                         s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE;
958                     }
959                     X509_STORE_CTX_cleanup(store_ctx);
960           }
961           if (store_ctx)
962                     X509_STORE_CTX_free(store_ctx);
963           if (ssl)
964                     SSL_free(ssl);
965           if (ssl_ctx)
966                     SSL_CTX_free(ssl_ctx);
967           if (basename)
968                     free(basename);
969           ldns_rdf_deep_free(basename_rdf);
970 #else
971           for (i = 0; i < ldns_rr_list_rr_count(usable_tlsas); i++) {
972                     tlsa_rr = ldns_rr_list_rr(usable_tlsas, i);
973                     ps = s;
974                     s = ldns_dane_verify_rr(tlsa_rr, cert, extra_certs,
975                                         pkix_validation_store);
976 
977                     if (s != LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH &&
978                         s != LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE &&
979                         s != LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA) {
980 
981                               /* which would be LDNS_STATUS_OK (match)
982                                * or some fatal error preventing use from
983                                * trying the next TLSA record.
984                                */
985                               break;
986                     }
987                     s = (s > ps ? s : ps); /* pref NEED_OPENSSL_GE_1_1_FOR_DANE_TA
988                                             * over PKIX_DID_NOT_VALIDATE
989                                                   * over TLSA_DID_NOT_MATCH
990                                                   */
991           }
992 #endif
993           ldns_rr_list_free(usable_tlsas);
994           return s;
995 }
996 #endif /* USE_DANE_VERIFY */
997 #endif /* HAVE_SSL */
998 #endif /* USE_DANE */
999