1 #include <ldns/config.h>
9 /* this entire file is rather useless when you don't have
12 #include <openssl/ssl.h>
13 #include <openssl/evp.h>
14 #include <openssl/rand.h>
15 #include <openssl/err.h>
16 #include <openssl/md5.h>
18 ldns_dnssec_data_chain *
19 ldns_dnssec_data_chain_new()
21 ldns_dnssec_data_chain *nc = LDNS_XMALLOC(ldns_dnssec_data_chain, 1);
25 nc->signatures = NULL;
28 nc->packet_nodata = false;
33 ldns_dnssec_data_chain_free(ldns_dnssec_data_chain *chain)
39 ldns_dnssec_data_chain_deep_free(ldns_dnssec_data_chain *chain)
41 ldns_rr_list_deep_free(chain->rrset);
42 ldns_rr_list_deep_free(chain->signatures);
44 ldns_dnssec_data_chain_deep_free(chain->parent);
50 ldns_dnssec_data_chain_print(FILE *out, const ldns_dnssec_data_chain *chain)
52 ldns_lookup_table *rcode;
53 const ldns_rr_descriptor *rr_descriptor;
55 ldns_dnssec_data_chain_print(out, chain->parent);
56 if (ldns_rr_list_rr_count(chain->rrset) > 0) {
57 rcode = ldns_lookup_by_id(ldns_rcodes,
58 (int) chain->packet_rcode);
60 fprintf(out, ";; rcode: %s\n", rcode->name);
63 rr_descriptor = ldns_rr_descript(chain->packet_qtype);
64 if (rr_descriptor && rr_descriptor->_name) {
65 fprintf(out, ";; qtype: %s\n", rr_descriptor->_name);
66 } else if (chain->packet_qtype != 0) {
67 fprintf(out, "TYPE%u",
70 if (chain->packet_nodata) {
71 fprintf(out, ";; NODATA response\n");
73 fprintf(out, "rrset:\n");
74 ldns_rr_list_print(out, chain->rrset);
75 fprintf(out, "sigs:\n");
76 ldns_rr_list_print(out, chain->signatures);
77 fprintf(out, "---\n");
79 fprintf(out, "<no data>\n");
85 ldns_dnssec_build_data_chain_dnskey(ldns_resolver *res,
88 ldns_rr_list *signatures,
89 ldns_dnssec_data_chain *new_chain,
94 if (signatures && ldns_rr_list_rr_count(signatures) > 0) {
95 new_chain->signatures = ldns_rr_list_clone(signatures);
96 new_chain->parent_type = 0;
98 keys = ldns_pkt_rr_list_by_name_and_type(
102 LDNS_SECTION_ANY_NOQUESTION
105 my_pkt = ldns_resolver_query(res,
110 keys = ldns_pkt_rr_list_by_name_and_type(
114 LDNS_SECTION_ANY_NOQUESTION
116 new_chain->parent = ldns_dnssec_build_data_chain(res,
121 new_chain->parent->packet_qtype = LDNS_RR_TYPE_DNSKEY;
122 ldns_pkt_free(my_pkt);
124 new_chain->parent = ldns_dnssec_build_data_chain(res,
129 new_chain->parent->packet_qtype = LDNS_RR_TYPE_DNSKEY;
131 ldns_rr_list_deep_free(keys);
136 ldns_dnssec_build_data_chain_other(ldns_resolver *res,
138 ldns_dnssec_data_chain *new_chain,
143 /* 'self-signed', parent is a DS */
145 /* okay, either we have other keys signing the current one,
147 * one should have a DS record in the parent zone.
148 * How do we find this out? Try both?
150 * request DNSKEYS for current zone,
151 * add all signatures to current level
154 ldns_rr_list *signatures2;
156 new_chain->parent_type = 1;
158 my_pkt = ldns_resolver_query(res,
163 dss = ldns_pkt_rr_list_by_name_and_type(my_pkt,
166 LDNS_SECTION_ANY_NOQUESTION
169 new_chain->parent = ldns_dnssec_build_data_chain(res,
174 new_chain->parent->packet_qtype = LDNS_RR_TYPE_DS;
175 ldns_rr_list_deep_free(dss);
177 ldns_pkt_free(my_pkt);
179 my_pkt = ldns_resolver_query(res,
184 signatures2 = ldns_pkt_rr_list_by_name_and_type(my_pkt,
187 LDNS_SECTION_ANSWER);
189 if (new_chain->signatures) {
190 printf("There were already sigs!\n");
191 ldns_rr_list_deep_free(new_chain->signatures);
192 printf("replacing the old sigs\n");
194 new_chain->signatures = signatures2;
196 ldns_pkt_free(my_pkt);
199 ldns_dnssec_data_chain *
200 ldns_dnssec_build_data_chain_nokeyname(ldns_resolver *res,
203 const ldns_rr_list *rrset,
204 ldns_dnssec_data_chain *new_chain)
206 ldns_rdf *possible_parent_name;
208 /* apparently we were not able to find a signing key, so
209 we assume the chain ends here
211 /* try parents for auth denial of DS */
213 possible_parent_name = ldns_rr_owner(orig_rr);
214 } else if (rrset && ldns_rr_list_rr_count(rrset) > 0) {
215 possible_parent_name = ldns_rr_owner(ldns_rr_list_rr(rrset, 0));
217 /* no information to go on, give up */
221 my_pkt = ldns_resolver_query(res,
222 possible_parent_name,
227 if (ldns_pkt_ancount(my_pkt) > 0) {
228 /* add error, no sigs but DS in parent */
229 /*ldns_pkt_print(stdout, my_pkt);*/
230 ldns_pkt_free(my_pkt);
232 /* are there signatures? */
233 new_chain->parent = ldns_dnssec_build_data_chain(res,
239 new_chain->parent->packet_qtype = LDNS_RR_TYPE_DS;
246 ldns_dnssec_data_chain *
247 ldns_dnssec_build_data_chain(ldns_resolver *res,
249 const ldns_rr_list *rrset,
253 ldns_rr_list *signatures = NULL;
254 ldns_rr_list *dss = NULL;
256 ldns_rr_list *my_rrset;
260 ldns_rdf *name = NULL, *key_name = NULL;
261 ldns_rr_type type = 0;
264 bool other_rrset = false;
266 ldns_dnssec_data_chain *new_chain = ldns_dnssec_data_chain_new();
268 if (!ldns_dnssec_pkt_has_rrsigs(pkt)) {
269 /* hmm. no dnssec data in the packet. go up to try and deny
275 new_chain->rrset = ldns_rr_list_new();
276 ldns_rr_list_push_rr(new_chain->rrset, orig_rr);
277 new_chain->parent = ldns_dnssec_build_data_chain(res,
282 new_chain->packet_rcode = ldns_pkt_get_rcode(pkt);
283 new_chain->packet_qtype = ldns_rr_get_type(orig_rr);
284 if (ldns_pkt_ancount(pkt) == 0) {
285 new_chain->packet_nodata = true;
290 if (!rrset || ldns_rr_list_rr_count(rrset) < 1) {
291 /* hmm, no data, do we have denial? only works if pkt was given,
292 otherwise caller has to do the check himself */
293 new_chain->packet_nodata = true;
295 my_rrset = ldns_pkt_rr_list_by_type(pkt,
297 LDNS_SECTION_ANY_NOQUESTION
300 if (ldns_rr_list_rr_count(my_rrset) > 0) {
301 type = LDNS_RR_TYPE_NSEC;
304 ldns_rr_list_deep_free(my_rrset);
308 /* nothing, try nsec3 */
309 my_rrset = ldns_pkt_rr_list_by_type(pkt,
311 LDNS_SECTION_ANY_NOQUESTION);
313 if (ldns_rr_list_rr_count(my_rrset) > 0) {
314 type = LDNS_RR_TYPE_NSEC3;
317 ldns_rr_list_deep_free(my_rrset);
322 /* try parent zone? for denied insecure? */
330 my_rrset = (ldns_rr_list *) rrset;
333 if (my_rrset && ldns_rr_list_rr_count(my_rrset) > 0) {
334 new_chain->rrset = ldns_rr_list_clone(my_rrset);
335 name = ldns_rr_owner(ldns_rr_list_rr(my_rrset, 0));
336 type = ldns_rr_get_type(ldns_rr_list_rr(my_rrset, 0));
337 c = ldns_rr_get_class(ldns_rr_list_rr(my_rrset, 0));
341 ldns_rr_list_deep_free(my_rrset);
344 /* normally there will only be 1 signature 'set'
345 but there can be more than 1 denial (wildcards)
348 if (type == LDNS_RR_TYPE_NSEC || type == LDNS_RR_TYPE_NSEC3) {
349 /* just throw in all signatures, the tree builder must sort
352 signatures = ldns_dnssec_pkt_get_rrsigs_for_type(pkt, type);
354 my_pkt = ldns_resolver_query(res, name, type, c, qflags);
355 signatures = ldns_dnssec_pkt_get_rrsigs_for_type(pkt, type);
356 ldns_pkt_free(my_pkt);
361 ldns_dnssec_pkt_get_rrsigs_for_name_and_type(pkt,
366 my_pkt = ldns_resolver_query(res, name, type, c, qflags);
368 ldns_dnssec_pkt_get_rrsigs_for_name_and_type(my_pkt,
371 ldns_pkt_free(my_pkt);
375 if (signatures && ldns_rr_list_rr_count(signatures) > 0) {
376 key_name = ldns_rr_rdf(ldns_rr_list_rr(signatures, 0), 7);
380 return ldns_dnssec_build_data_chain_nokeyname(res,
387 if (type != LDNS_RR_TYPE_DNSKEY) {
388 ldns_dnssec_build_data_chain_dnskey(res,
397 ldns_dnssec_build_data_chain_other(res,
407 ldns_rr_list_deep_free(signatures);
413 ldns_dnssec_trust_tree *
414 ldns_dnssec_trust_tree_new()
416 ldns_dnssec_trust_tree *new_tree = LDNS_XMALLOC(ldns_dnssec_trust_tree,
419 new_tree->rrset = NULL;
420 new_tree->parent_count = 0;
426 ldns_dnssec_trust_tree_free(ldns_dnssec_trust_tree *tree)
430 for (i = 0; i < tree->parent_count; i++) {
431 ldns_dnssec_trust_tree_free(tree->parents[i]);
438 ldns_dnssec_trust_tree_depth(ldns_dnssec_trust_tree *tree)
444 for (i = 0; i < tree->parent_count; i++) {
445 parent = ldns_dnssec_trust_tree_depth(tree->parents[i]);
446 if (parent > result) {
455 print_tabs(FILE *out, size_t nr, uint8_t *map, size_t treedepth)
458 for (i = 0; i < nr; i++) {
460 fprintf(out, "|---");
461 } else if (map && i < treedepth && map[i] == 1) {
470 ldns_dnssec_trust_tree_print_sm(FILE *out,
471 ldns_dnssec_trust_tree *tree,
478 const ldns_rr_descriptor *descriptor;
482 treedepth = ldns_dnssec_trust_tree_depth(tree);
483 sibmap = malloc(treedepth);
484 memset(sibmap, 0, treedepth);
490 print_tabs(out, tabs, sibmap, treedepth);
491 ldns_rdf_print(out, ldns_rr_owner(tree->rr));
492 descriptor = ldns_rr_descript(ldns_rr_get_type(tree->rr));
494 if (descriptor->_name) {
495 fprintf(out, " (%s", descriptor->_name);
497 fprintf(out, " (TYPE%d",
498 ldns_rr_get_type(tree->rr));
501 if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_DNSKEY) {
502 fprintf(out, " keytag: %u",
503 (unsigned int) ldns_calc_keytag(tree->rr));
504 fprintf(out, " alg: ");
505 ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 2));
506 fprintf(out, " flags: ");
507 ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 0));
508 } else if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_DS) {
509 fprintf(out, " keytag: ");
510 ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 0));
511 fprintf(out, " digest type: ");
512 ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 2));
514 if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_NSEC) {
516 ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 0));
518 ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 1));
523 for (i = 0; i < tree->parent_count; i++) {
524 if (tree->parent_count > 1 && i < tree->parent_count - 1) {
529 /* only print errors */
530 if (ldns_rr_get_type(tree->parents[i]->rr) ==
532 ldns_rr_get_type(tree->parents[i]->rr) ==
533 LDNS_RR_TYPE_NSEC3) {
534 if (tree->parent_status[i] == LDNS_STATUS_OK) {
535 print_tabs(out, tabs + 1, sibmap, treedepth);
537 ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_NS &&
538 ldns_rr_rd_count(tree->rr) > 0) {
539 fprintf(out, "Existence of DS is denied by:\n");
541 fprintf(out, "Existence is denied by:\n");
544 /* NS records aren't signed */
545 if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_NS) {
546 fprintf(out, "Existence of DS is denied by:\n");
548 print_tabs(out, tabs + 1, sibmap, treedepth);
550 "Error in denial of existence: %s\n",
551 ldns_get_errorstr_by_id(
552 tree->parent_status[i]));
556 if (tree->parent_status[i] != LDNS_STATUS_OK) {
557 print_tabs(out, tabs + 1, sibmap, treedepth);
560 ldns_get_errorstr_by_id(
561 tree->parent_status[i]));
562 if (tree->parent_status[i]
563 == LDNS_STATUS_SSL_ERR) {
564 printf("; SSL Error: ");
565 ERR_load_crypto_strings();
566 ERR_print_errors_fp(stdout);
569 ldns_rr_print(out, tree->parent_signature[i]);
570 printf("For RRset:\n");
571 ldns_rr_list_print(out, tree->rrset);
572 printf("With key:\n");
573 ldns_rr_print(out, tree->parents[i]->rr);
575 ldns_dnssec_trust_tree_print_sm(out,
583 print_tabs(out, tabs, sibmap, treedepth);
584 fprintf(out, "<no data>\n");
587 fprintf(out, "<null pointer>\n");
596 ldns_dnssec_trust_tree_print(FILE *out,
597 ldns_dnssec_trust_tree *tree,
601 ldns_dnssec_trust_tree_print_sm(out, tree, tabs, extended, NULL, 0);
605 ldns_dnssec_trust_tree_add_parent(ldns_dnssec_trust_tree *tree,
606 const ldns_dnssec_trust_tree *parent,
607 const ldns_rr *signature,
608 const ldns_status parent_status)
612 && tree->parent_count < LDNS_DNSSEC_TRUST_TREE_MAX_PARENTS) {
614 printf("Add parent for: ");
615 ldns_rr_print(stdout, tree->rr);
617 ldns_rr_print(stdout, parent->rr);
619 tree->parents[tree->parent_count] =
620 (ldns_dnssec_trust_tree *) parent;
621 tree->parent_status[tree->parent_count] = parent_status;
622 tree->parent_signature[tree->parent_count] = (ldns_rr *) signature;
623 tree->parent_count++;
624 return LDNS_STATUS_OK;
626 return LDNS_STATUS_ERR;
630 /* if rr is null, take the first from the rrset */
631 ldns_dnssec_trust_tree *
632 ldns_dnssec_derive_trust_tree(ldns_dnssec_data_chain *data_chain, ldns_rr *rr)
634 ldns_rr_list *cur_rrset;
635 ldns_rr_list *cur_sigs;
636 ldns_rr *cur_rr = NULL;
641 ldns_dnssec_trust_tree *new_tree = ldns_dnssec_trust_tree_new();
643 if (data_chain && data_chain->rrset) {
644 cur_rrset = data_chain->rrset;
646 cur_sigs = data_chain->signatures;
652 if (!cur_rr && ldns_rr_list_rr_count(cur_rrset) > 0) {
653 cur_rr = ldns_rr_list_rr(cur_rrset, 0);
657 new_tree->rr = cur_rr;
658 new_tree->rrset = cur_rrset;
659 /* there are three possibilities:
660 1 - 'normal' rrset, signed by a key
661 2 - dnskey signed by other dnskey
662 3 - dnskey proven by higher level DS
663 (data denied by nsec is a special case that can
664 occur in multiple places)
668 for (i = 0; i < ldns_rr_list_rr_count(cur_sigs); i++) {
669 /* find the appropriate key in the parent list */
670 cur_sig_rr = ldns_rr_list_rr(cur_sigs, i);
672 ldns_rdf2native_int16(
673 ldns_rr_rrsig_keytag(cur_sig_rr));
675 if (ldns_rr_get_type(cur_rr) == LDNS_RR_TYPE_NSEC) {
676 if (ldns_dname_compare(ldns_rr_owner(cur_sig_rr),
677 ldns_rr_owner(cur_rr)))
679 /* find first that does match */
682 j < ldns_rr_list_rr_count(cur_rrset) &&
683 ldns_dname_compare(ldns_rr_owner(cur_sig_rr),ldns_rr_owner(cur_rr)) != 0;
685 cur_rr = ldns_rr_list_rr(cur_rrset, j);
688 if (ldns_dname_compare(ldns_rr_owner(cur_sig_rr),
689 ldns_rr_owner(cur_rr)))
697 if (data_chain->parent) {
698 ldns_dnssec_derive_trust_tree_normal_rrset(
705 ldns_dnssec_derive_trust_tree_dnskey_rrset(
712 ldns_dnssec_derive_trust_tree_ds_rrset(new_tree,
716 /* no signatures? maybe it's nsec data */
718 /* just add every rr from parent as new parent */
719 ldns_dnssec_derive_trust_tree_no_sig(new_tree, data_chain);
728 ldns_dnssec_derive_trust_tree_normal_rrset(ldns_dnssec_trust_tree *new_tree,
729 ldns_dnssec_data_chain *data_chain,
733 ldns_rr_list *cur_rrset = ldns_rr_list_clone(data_chain->rrset);
734 ldns_dnssec_trust_tree *cur_parent_tree;
735 ldns_rr *cur_parent_rr;
737 ldns_rr_list *tmp_rrset = NULL;
738 ldns_status cur_status;
740 cur_keytag = ldns_rdf2native_int16(ldns_rr_rrsig_keytag(cur_sig_rr));
742 for (j = 0; j < ldns_rr_list_rr_count(data_chain->parent->rrset); j++) {
743 cur_parent_rr = ldns_rr_list_rr(data_chain->parent->rrset, j);
744 if (ldns_rr_get_type(cur_parent_rr) == LDNS_RR_TYPE_DNSKEY) {
745 if (ldns_calc_keytag(cur_parent_rr) == cur_keytag) {
747 /* TODO: check wildcard nsec too */
748 if (cur_rrset && ldns_rr_list_rr_count(cur_rrset) > 0) {
749 tmp_rrset = cur_rrset;
750 if (ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0))
751 == LDNS_RR_TYPE_NSEC ||
752 ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0))
753 == LDNS_RR_TYPE_NSEC3) {
754 /* might contain different names!
756 ldns_rr_list_sort(cur_rrset);
757 if (tmp_rrset && tmp_rrset != cur_rrset) {
758 ldns_rr_list_deep_free(tmp_rrset);
761 tmp_rrset = ldns_rr_list_pop_rrset(cur_rrset);
763 /* with nsecs, this might be the wrong one */
765 ldns_rr_list_rr_count(cur_rrset) > 0 &&
767 ldns_rr_owner(ldns_rr_list_rr(
769 ldns_rr_owner(cur_sig_rr)) != 0) {
770 ldns_rr_list_deep_free(tmp_rrset);
772 ldns_rr_list_pop_rrset(cur_rrset);
775 cur_status = ldns_verify_rrsig(tmp_rrset,
779 for (i = 0; i < new_tree->parent_count; i++) {
780 if (cur_parent_rr == new_tree->parents[i]->rr) {
786 ldns_dnssec_derive_trust_tree(data_chain->parent,
788 (void)ldns_dnssec_trust_tree_add_parent(new_tree,
797 if (tmp_rrset && tmp_rrset != cur_rrset) {
798 ldns_rr_list_deep_free(tmp_rrset);
800 ldns_rr_list_deep_free(cur_rrset);
804 ldns_dnssec_derive_trust_tree_dnskey_rrset(ldns_dnssec_trust_tree *new_tree,
805 ldns_dnssec_data_chain *data_chain,
810 ldns_rr_list *cur_rrset = data_chain->rrset;
811 ldns_dnssec_trust_tree *cur_parent_tree;
812 ldns_rr *cur_parent_rr;
814 ldns_status cur_status;
816 cur_keytag = ldns_rdf2native_int16(ldns_rr_rrsig_keytag(cur_sig_rr));
818 for (j = 0; j < ldns_rr_list_rr_count(cur_rrset); j++) {
819 cur_parent_rr = ldns_rr_list_rr(cur_rrset, j);
820 if (cur_parent_rr != cur_rr &&
821 ldns_rr_get_type(cur_parent_rr) == LDNS_RR_TYPE_DNSKEY) {
822 if (ldns_calc_keytag(cur_parent_rr) == cur_keytag
824 cur_parent_tree = ldns_dnssec_trust_tree_new();
825 cur_parent_tree->rr = cur_parent_rr;
826 cur_parent_tree->rrset = cur_rrset;
827 cur_status = ldns_verify_rrsig(cur_rrset,
830 (void) ldns_dnssec_trust_tree_add_parent(new_tree,
831 cur_parent_tree, cur_sig_rr, cur_status);
838 ldns_dnssec_derive_trust_tree_ds_rrset(ldns_dnssec_trust_tree *new_tree,
839 ldns_dnssec_data_chain *data_chain,
843 ldns_rr_list *cur_rrset = data_chain->rrset;
844 ldns_dnssec_trust_tree *cur_parent_tree;
845 ldns_rr *cur_parent_rr;
847 /* try the parent to see whether there are DSs there */
848 if (ldns_rr_get_type(cur_rr) == LDNS_RR_TYPE_DNSKEY &&
849 data_chain->parent &&
850 data_chain->parent->rrset
853 j < ldns_rr_list_rr_count(data_chain->parent->rrset);
855 cur_parent_rr = ldns_rr_list_rr(data_chain->parent->rrset, j);
856 if (ldns_rr_get_type(cur_parent_rr) == LDNS_RR_TYPE_DS) {
857 for (h = 0; h < ldns_rr_list_rr_count(cur_rrset); h++) {
858 cur_rr = ldns_rr_list_rr(cur_rrset, h);
859 if (ldns_rr_compare_ds(cur_rr, cur_parent_rr)) {
861 ldns_dnssec_derive_trust_tree(
862 data_chain->parent, cur_parent_rr);
863 (void) ldns_dnssec_trust_tree_add_parent(
869 /*ldns_rr_print(stdout, cur_parent_rr);*/
872 cur_rr = ldns_rr_list_rr(cur_rrset, 0);
879 ldns_dnssec_derive_trust_tree_no_sig(ldns_dnssec_trust_tree *new_tree,
880 ldns_dnssec_data_chain *data_chain)
883 ldns_rr_list *cur_rrset;
884 ldns_rr *cur_parent_rr;
885 ldns_dnssec_trust_tree *cur_parent_tree;
888 if (data_chain->parent && data_chain->parent->rrset) {
889 cur_rrset = data_chain->parent->rrset;
891 if (cur_rrset && ldns_rr_list_rr_count(cur_rrset) > 0) {
892 if (ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0)) ==
893 LDNS_RR_TYPE_NSEC3) {
894 result = ldns_dnssec_verify_denial_nsec3(
897 data_chain->parent->signatures,
898 data_chain->packet_rcode,
899 data_chain->packet_qtype,
900 data_chain->packet_nodata);
901 } else if (ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0)) ==
902 LDNS_RR_TYPE_NSEC3) {
903 result = ldns_dnssec_verify_denial(
906 data_chain->parent->signatures);
908 /* unsigned zone, unsigned parent */
909 result = LDNS_STATUS_OK;
912 result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED;
914 for (i = 0; i < ldns_rr_list_rr_count(cur_rrset); i++) {
915 cur_parent_rr = ldns_rr_list_rr(cur_rrset, i);
917 ldns_dnssec_derive_trust_tree(data_chain->parent,
919 (void) ldns_dnssec_trust_tree_add_parent(new_tree,
920 cur_parent_tree, NULL, result);
926 * returns OK if there is a path from tree to key with only OK
927 * the (first) error in between otherwise
928 * or NOT_FOUND if the key wasn't present at all
931 ldns_dnssec_trust_tree_contains_keys(ldns_dnssec_trust_tree *tree,
932 ldns_rr_list *trusted_keys)
935 ldns_status result = LDNS_STATUS_CRYPTO_NO_DNSKEY;
937 ldns_status parent_result;
939 if (tree && trusted_keys && ldns_rr_list_rr_count(trusted_keys) > 0)
941 for (i = 0; i < ldns_rr_list_rr_count(trusted_keys); i++) {
942 equal = ldns_rr_compare_ds(
944 ldns_rr_list_rr(trusted_keys, i));
946 result = LDNS_STATUS_OK;
951 for (i = 0; i < tree->parent_count; i++) {
953 ldns_dnssec_trust_tree_contains_keys(tree->parents[i],
955 if (parent_result != LDNS_STATUS_CRYPTO_NO_DNSKEY) {
956 if (tree->parent_status[i] != LDNS_STATUS_OK) {
957 result = tree->parent_status[i];
959 if (ldns_rr_get_type(tree->rr)
960 == LDNS_RR_TYPE_NSEC &&
961 parent_result == LDNS_STATUS_OK
964 LDNS_STATUS_DNSSEC_EXISTENCE_DENIED;
966 result = parent_result;
972 result = LDNS_STATUS_ERR;
979 ldns_verify(ldns_rr_list *rrset, ldns_rr_list *rrsig, const ldns_rr_list *keys,
980 ldns_rr_list *good_keys)
983 ldns_status verify_result = LDNS_STATUS_ERR;
985 if (!rrset || !rrsig || !keys) {
986 return LDNS_STATUS_ERR;
989 if (ldns_rr_list_rr_count(rrset) < 1) {
990 return LDNS_STATUS_ERR;
993 if (ldns_rr_list_rr_count(rrsig) < 1) {
994 return LDNS_STATUS_CRYPTO_NO_RRSIG;
997 if (ldns_rr_list_rr_count(keys) < 1) {
998 verify_result = LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY;
1000 for (i = 0; i < ldns_rr_list_rr_count(rrsig); i++) {
1001 ldns_status s = ldns_verify_rrsig_keylist(rrset,
1002 ldns_rr_list_rr(rrsig, i), keys, good_keys);
1003 /* try a little to get more descriptive error */
1004 if(s == LDNS_STATUS_OK) {
1005 verify_result = LDNS_STATUS_OK;
1006 } else if(verify_result == LDNS_STATUS_ERR)
1008 else if(s != LDNS_STATUS_ERR && verify_result ==
1009 LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY)
1013 return verify_result;
1017 ldns_verify_notime(ldns_rr_list *rrset, ldns_rr_list *rrsig,
1018 const ldns_rr_list *keys, ldns_rr_list *good_keys)
1021 ldns_status verify_result = LDNS_STATUS_ERR;
1023 if (!rrset || !rrsig || !keys) {
1024 return LDNS_STATUS_ERR;
1027 if (ldns_rr_list_rr_count(rrset) < 1) {
1028 return LDNS_STATUS_ERR;
1031 if (ldns_rr_list_rr_count(rrsig) < 1) {
1032 return LDNS_STATUS_CRYPTO_NO_RRSIG;
1035 if (ldns_rr_list_rr_count(keys) < 1) {
1036 verify_result = LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY;
1038 for (i = 0; i < ldns_rr_list_rr_count(rrsig); i++) {
1039 ldns_status s = ldns_verify_rrsig_keylist_notime(rrset,
1040 ldns_rr_list_rr(rrsig, i), keys, good_keys);
1042 /* try a little to get more descriptive error */
1043 if (s == LDNS_STATUS_OK) {
1044 verify_result = LDNS_STATUS_OK;
1045 } else if (verify_result == LDNS_STATUS_ERR) {
1047 } else if (s != LDNS_STATUS_ERR && verify_result ==
1048 LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY) {
1053 return verify_result;
1057 ldns_fetch_valid_domain_keys(const ldns_resolver *res,
1058 const ldns_rdf *domain,
1059 const ldns_rr_list *keys,
1060 ldns_status *status)
1062 ldns_rr_list * trusted_keys = NULL;
1063 ldns_rr_list * ds_keys = NULL;
1065 if (res && domain && keys) {
1067 if ((trusted_keys = ldns_validate_domain_dnskey(res,
1070 *status = LDNS_STATUS_OK;
1072 /* No trusted keys in this domain, we'll have to find some in the parent domain */
1073 *status = LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY;
1075 if (ldns_rdf_size(domain) > 1) {
1076 /* Fail if we are at the root */
1077 ldns_rr_list * parent_keys;
1078 ldns_rdf * parent_domain = ldns_dname_left_chop(domain);
1081 ldns_fetch_valid_domain_keys(res,
1085 /* Check DS records */
1087 ldns_validate_domain_ds(res,
1091 ldns_fetch_valid_domain_keys(res,
1095 ldns_rr_list_deep_free(ds_keys);
1097 /* No valid DS at the parent -- fail */
1098 *status = LDNS_STATUS_CRYPTO_NO_TRUSTED_DS ;
1100 ldns_rr_list_deep_free(parent_keys);
1102 ldns_rdf_deep_free(parent_domain);
1106 return trusted_keys;
1110 ldns_validate_domain_dnskey(const ldns_resolver * res,
1111 const ldns_rdf * domain,
1112 const ldns_rr_list * keys)
1117 uint16_t key_i; uint16_t key_j; uint16_t key_k;
1118 uint16_t sig_i; ldns_rr * cur_sig;
1120 ldns_rr_list * domain_keys = NULL;
1121 ldns_rr_list * domain_sigs = NULL;
1122 ldns_rr_list * trusted_keys = NULL;
1124 /* Fetch keys for the domain */
1125 if ((keypkt = ldns_resolver_query(res,
1127 LDNS_RR_TYPE_DNSKEY,
1131 domain_keys = ldns_pkt_rr_list_by_type(keypkt,
1132 LDNS_RR_TYPE_DNSKEY,
1133 LDNS_SECTION_ANSWER);
1134 domain_sigs = ldns_pkt_rr_list_by_type(keypkt,
1136 LDNS_SECTION_ANSWER);
1138 /* Try to validate the record using our keys */
1139 for (key_i=0; key_i< ldns_rr_list_rr_count(domain_keys); key_i++) {
1141 cur_key = ldns_rr_list_rr(domain_keys, key_i);
1142 for (key_j=0; key_j<ldns_rr_list_rr_count(keys); key_j++) {
1143 if (ldns_rr_compare_ds(ldns_rr_list_rr(keys, key_j),
1146 /* Current key is trusted -- validate */
1147 trusted_keys = ldns_rr_list_new();
1150 sig_i<ldns_rr_list_rr_count(domain_sigs);
1152 cur_sig = ldns_rr_list_rr(domain_sigs, sig_i);
1153 /* Avoid non-matching sigs */
1154 if (ldns_rdf2native_int16(
1155 ldns_rr_rrsig_keytag(cur_sig))
1156 == ldns_calc_keytag(cur_key)) {
1158 ldns_verify_rrsig(domain_keys,
1161 == LDNS_STATUS_OK) {
1163 /* Push the whole rrset
1164 -- we can't do much more */
1166 key_k<ldns_rr_list_rr_count(
1169 ldns_rr_list_push_rr(
1177 ldns_rr_list_deep_free(domain_keys);
1178 ldns_rr_list_deep_free(domain_sigs);
1179 ldns_pkt_free(keypkt);
1180 return trusted_keys;
1185 /* Only push our trusted key */
1186 ldns_rr_list_push_rr(trusted_keys,
1187 ldns_rr_clone(cur_key));
1192 ldns_rr_list_deep_free(domain_keys);
1193 ldns_rr_list_deep_free(domain_sigs);
1194 ldns_pkt_free(keypkt);
1197 status = LDNS_STATUS_CRYPTO_NO_DNSKEY;
1200 return trusted_keys;
1204 ldns_validate_domain_ds(const ldns_resolver *res,
1205 const ldns_rdf * domain,
1206 const ldns_rr_list * keys)
1211 ldns_rr_list * rrset = NULL;
1212 ldns_rr_list * sigs = NULL;
1213 ldns_rr_list * trusted_keys = NULL;
1215 /* Fetch DS for the domain */
1216 if ((dspkt = ldns_resolver_query(res,
1222 rrset = ldns_pkt_rr_list_by_type(dspkt,
1224 LDNS_SECTION_ANSWER);
1225 sigs = ldns_pkt_rr_list_by_type(dspkt,
1227 LDNS_SECTION_ANSWER);
1230 if ((status = ldns_verify(rrset, sigs, keys, NULL))
1231 == LDNS_STATUS_OK) {
1232 trusted_keys = ldns_rr_list_new();
1233 for (key_i=0; key_i<ldns_rr_list_rr_count(rrset); key_i++) {
1234 ldns_rr_list_push_rr(trusted_keys,
1235 ldns_rr_clone(ldns_rr_list_rr(rrset,
1242 ldns_rr_list_deep_free(rrset);
1243 ldns_rr_list_deep_free(sigs);
1244 ldns_pkt_free(dspkt);
1247 status = LDNS_STATUS_CRYPTO_NO_DS;
1250 return trusted_keys;
1254 ldns_verify_trusted(ldns_resolver *res,
1255 ldns_rr_list *rrset,
1256 ldns_rr_list * rrsigs,
1257 ldns_rr_list * validating_keys)
1259 uint16_t sig_i; uint16_t key_i;
1260 ldns_rr * cur_sig; ldns_rr * cur_key;
1261 ldns_rr_list * trusted_keys = NULL;
1262 ldns_status result = LDNS_STATUS_ERR;
1264 if (!res || !rrset || !rrsigs) {
1265 return LDNS_STATUS_ERR;
1268 if (ldns_rr_list_rr_count(rrset) < 1) {
1269 return LDNS_STATUS_ERR;
1272 if (ldns_rr_list_rr_count(rrsigs) < 1) {
1273 return LDNS_STATUS_CRYPTO_NO_RRSIG;
1276 /* Look at each sig */
1277 for (sig_i=0; sig_i < ldns_rr_list_rr_count(rrsigs); sig_i++) {
1279 cur_sig = ldns_rr_list_rr(rrsigs, sig_i);
1280 /* Get a valid signer key and validate the sig */
1281 if ((trusted_keys = ldns_fetch_valid_domain_keys(
1283 ldns_rr_rrsig_signame(cur_sig),
1284 ldns_resolver_dnssec_anchors(res),
1288 key_i < ldns_rr_list_rr_count(trusted_keys);
1290 cur_key = ldns_rr_list_rr(trusted_keys, key_i);
1292 if ((result = ldns_verify_rrsig(rrset,
1295 == LDNS_STATUS_OK) {
1296 if (validating_keys) {
1297 ldns_rr_list_push_rr(validating_keys,
1298 ldns_rr_clone(cur_key));
1300 ldns_rr_list_deep_free(trusted_keys);
1301 return LDNS_STATUS_OK;
1303 ldns_rr_list_print(stdout, rrset);
1304 ldns_rr_print(stdout, cur_sig);
1305 ldns_rr_print(stdout, cur_key);
1312 ldns_rr_list_deep_free(trusted_keys);
1317 ldns_dnssec_verify_denial(ldns_rr *rr,
1318 ldns_rr_list *nsecs,
1319 ldns_rr_list *rrsigs)
1322 ldns_rdf *wildcard_name;
1323 ldns_rdf *chopped_dname;
1327 /* needed for wildcard check on exact match */
1329 bool name_covered = false;
1330 bool type_covered = false;
1331 bool wildcard_covered = false;
1332 bool wildcard_type_covered = false;
1334 wildcard_name = ldns_dname_new_frm_str("*");
1335 rr_name = ldns_rr_owner(rr);
1336 chopped_dname = ldns_dname_left_chop(rr_name);
1337 result = ldns_dname_cat(wildcard_name, chopped_dname);
1338 if (result != LDNS_STATUS_OK) {
1342 ldns_rdf_deep_free(chopped_dname);
1344 for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) {
1345 cur_nsec = ldns_rr_list_rr(nsecs, i);
1346 if (ldns_dname_compare(rr_name, ldns_rr_owner(cur_nsec)) == 0) {
1347 /* see section 5.4 of RFC4035, if the label count of the NSEC's
1348 RRSIG is equal, then it is proven that wildcard expansion
1349 could not have been used to match the request */
1350 rrsig = ldns_dnssec_get_rrsig_for_name_and_type(
1351 ldns_rr_owner(cur_nsec),
1352 ldns_rr_get_type(cur_nsec),
1354 if (rrsig && ldns_rdf2native_int8(ldns_rr_rrsig_labels(rrsig))
1355 == ldns_dname_label_count(rr_name)) {
1356 wildcard_covered = true;
1359 if (ldns_nsec_bitmap_covers_type(ldns_nsec_get_bitmap(cur_nsec),
1360 ldns_rr_get_type(rr))) {
1361 type_covered = true;
1364 if (ldns_nsec_covers_name(cur_nsec, rr_name)) {
1365 name_covered = true;
1368 if (ldns_dname_compare(wildcard_name,
1369 ldns_rr_owner(cur_nsec)) == 0) {
1370 if (ldns_nsec_bitmap_covers_type(ldns_nsec_get_bitmap(cur_nsec),
1371 ldns_rr_get_type(rr))) {
1372 wildcard_type_covered = true;
1376 if (ldns_nsec_covers_name(cur_nsec, wildcard_name)) {
1377 wildcard_covered = true;
1382 ldns_rdf_deep_free(wildcard_name);
1384 if (type_covered || !name_covered) {
1385 return LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED;
1388 if (wildcard_type_covered || !wildcard_covered) {
1389 return LDNS_STATUS_DNSSEC_NSEC_WILDCARD_NOT_COVERED;
1392 return LDNS_STATUS_OK;
1397 ldns_dnssec_verify_denial_nsec3(ldns_rr *rr,
1398 ldns_rr_list *nsecs,
1399 ldns_rr_list *rrsigs,
1400 ldns_pkt_rcode packet_rcode,
1401 ldns_rr_type packet_qtype,
1404 ldns_rdf *closest_encloser;
1406 ldns_rdf *hashed_wildcard_name;
1407 bool wildcard_covered = false;
1408 ldns_rdf *zone_name;
1409 ldns_rdf *hashed_name;
1411 ldns_status result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED;
1415 zone_name = ldns_dname_left_chop(ldns_rr_owner(ldns_rr_list_rr(nsecs,0)));
1418 if (packet_rcode == LDNS_RCODE_NXDOMAIN) {
1419 closest_encloser = ldns_dnssec_nsec3_closest_encloser(
1421 ldns_rr_get_type(rr),
1424 wildcard = ldns_dname_new_frm_str("*");
1425 (void) ldns_dname_cat(wildcard, closest_encloser);
1427 for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) {
1428 hashed_wildcard_name =
1429 ldns_nsec3_hash_name_frm_nsec3(ldns_rr_list_rr(nsecs, 0),
1432 (void) ldns_dname_cat(hashed_wildcard_name, zone_name);
1434 if (ldns_nsec_covers_name(ldns_rr_list_rr(nsecs, i),
1435 hashed_wildcard_name)) {
1436 wildcard_covered = true;
1438 ldns_rdf_deep_free(hashed_wildcard_name);
1441 ldns_rdf_deep_free(closest_encloser);
1442 ldns_rdf_deep_free(wildcard);
1444 if (!wildcard_covered) {
1445 result = LDNS_STATUS_DNSSEC_NSEC_WILDCARD_NOT_COVERED;
1446 } else if (closest_encloser && wildcard_covered) {
1447 result = LDNS_STATUS_OK;
1449 result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED;
1451 } else if (packet_nodata && packet_qtype != LDNS_RR_TYPE_DS) {
1453 hashed_name = ldns_nsec3_hash_name_frm_nsec3(
1454 ldns_rr_list_rr(nsecs, 0),
1456 (void) ldns_dname_cat(hashed_name, zone_name);
1457 for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) {
1458 if (ldns_dname_compare(hashed_name,
1459 ldns_rr_owner(ldns_rr_list_rr(nsecs, i)))
1461 if (!ldns_nsec_bitmap_covers_type(
1462 ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)),
1465 !ldns_nsec_bitmap_covers_type(
1466 ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)),
1467 LDNS_RR_TYPE_CNAME)) {
1468 result = LDNS_STATUS_OK;
1473 result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED;
1474 } else if (packet_nodata && packet_qtype == LDNS_RR_TYPE_DS) {
1476 /* note: up to XXX this is the same as for 8.5 */
1477 hashed_name = ldns_nsec3_hash_name_frm_nsec3(ldns_rr_list_rr(nsecs,
1481 (void) ldns_dname_cat(hashed_name, zone_name);
1482 for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) {
1483 if (ldns_dname_compare(hashed_name,
1484 ldns_rr_owner(ldns_rr_list_rr(nsecs,
1487 if (!ldns_nsec_bitmap_covers_type(
1488 ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)),
1491 !ldns_nsec_bitmap_covers_type(
1492 ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)),
1493 LDNS_RR_TYPE_CNAME)) {
1494 result = LDNS_STATUS_OK;
1500 /* XXX see note above */
1502 ldns_dnssec_nsec3_closest_encloser(ldns_rr_owner(rr),
1503 ldns_rr_get_type(rr),
1506 result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED;
1510 ldns_rdf_deep_free(zone_name);
1513 #endif /* HAVE_SSL */
1517 ldns_gost2pkey_raw(unsigned char* key, size_t keylen)
1519 /* prefix header for X509 encoding */
1520 uint8_t asn[37] = { 0x30, 0x63, 0x30, 0x1c, 0x06, 0x06, 0x2a, 0x85,
1521 0x03, 0x02, 0x02, 0x13, 0x30, 0x12, 0x06, 0x07, 0x2a, 0x85,
1522 0x03, 0x02, 0x02, 0x23, 0x01, 0x06, 0x07, 0x2a, 0x85, 0x03,
1523 0x02, 0x02, 0x1e, 0x01, 0x03, 0x43, 0x00, 0x04, 0x40};
1524 unsigned char encoded[37+64];
1525 const unsigned char* pp;
1527 /* key wrong size */
1530 if(key[0] != 0 || key[1] != 0) {
1531 /* unsupported GOST algo or digest paramset */
1535 /* create evp_key */
1536 memmove(encoded, asn, 37);
1537 memmove(encoded+37, key+2, 64);
1538 pp = (unsigned char*)&encoded[0];
1540 return d2i_PUBKEY(NULL, &pp, sizeof(encoded));
1544 ldns_verify_rrsig_gost_raw(unsigned char* sig, size_t siglen,
1545 ldns_buffer* rrset, unsigned char* key, size_t keylen)
1550 (void) ldns_key_EVP_load_gost_id();
1551 evp_key = ldns_gost2pkey_raw(key, keylen);
1553 /* could not convert key */
1554 return LDNS_STATUS_CRYPTO_BOGUS;
1557 /* verify signature */
1558 result = ldns_verify_rrsig_evp_raw(sig, siglen, rrset,
1559 evp_key, EVP_get_digestbyname("md_gost94"));
1560 EVP_PKEY_free(evp_key);
1568 ldns_verify_rrsig_buffers(ldns_buffer *rawsig_buf, ldns_buffer *verify_buf,
1569 ldns_buffer *key_buf, uint8_t algo)
1571 return ldns_verify_rrsig_buffers_raw(
1572 (unsigned char*)ldns_buffer_begin(rawsig_buf),
1573 ldns_buffer_position(rawsig_buf),
1575 (unsigned char*)ldns_buffer_begin(key_buf),
1576 ldns_buffer_position(key_buf), algo);
1580 ldns_verify_rrsig_buffers_raw(unsigned char* sig, size_t siglen,
1581 ldns_buffer *verify_buf, unsigned char* key, size_t keylen,
1584 /* check for right key */
1587 case LDNS_DSA_NSEC3:
1588 return ldns_verify_rrsig_dsa_raw(sig,
1595 case LDNS_RSASHA1_NSEC3:
1596 return ldns_verify_rrsig_rsasha1_raw(sig,
1603 case LDNS_RSASHA256:
1604 return ldns_verify_rrsig_rsasha256_raw(sig,
1610 case LDNS_RSASHA512:
1611 return ldns_verify_rrsig_rsasha512_raw(sig,
1620 return ldns_verify_rrsig_gost_raw(sig, siglen, verify_buf,
1625 return ldns_verify_rrsig_rsamd5_raw(sig,
1632 /* do you know this alg?! */
1633 return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO;
1639 * Reset the ttl in the rrset with the orig_ttl from the sig
1640 * and update owner name if it was wildcard
1641 * Also canonicalizes the rrset.
1642 * @param rrset: rrset to modify
1643 * @param sig: signature to take TTL and wildcard values from
1646 ldns_rrset_use_signature_ttl(ldns_rr_list* rrset_clone, ldns_rr* rrsig)
1650 uint8_t label_count;
1651 ldns_rdf *wildcard_name;
1652 ldns_rdf *wildcard_chopped;
1653 ldns_rdf *wildcard_chopped_tmp;
1655 orig_ttl = ldns_rdf2native_int32( ldns_rr_rdf(rrsig, 3));
1656 label_count = ldns_rdf2native_int8(ldns_rr_rdf(rrsig, 2));
1658 for(i = 0; i < ldns_rr_list_rr_count(rrset_clone); i++) {
1660 ldns_dname_label_count(
1661 ldns_rr_owner(ldns_rr_list_rr(rrset_clone, i)))) {
1662 (void) ldns_str2rdf_dname(&wildcard_name, "*");
1663 wildcard_chopped = ldns_rdf_clone(ldns_rr_owner(
1664 ldns_rr_list_rr(rrset_clone, i)));
1665 while (label_count < ldns_dname_label_count(wildcard_chopped)) {
1666 wildcard_chopped_tmp = ldns_dname_left_chop(
1668 ldns_rdf_deep_free(wildcard_chopped);
1669 wildcard_chopped = wildcard_chopped_tmp;
1671 (void) ldns_dname_cat(wildcard_name, wildcard_chopped);
1672 ldns_rdf_deep_free(wildcard_chopped);
1673 ldns_rdf_deep_free(ldns_rr_owner(ldns_rr_list_rr(
1675 ldns_rr_set_owner(ldns_rr_list_rr(rrset_clone, i),
1678 ldns_rr_set_ttl(ldns_rr_list_rr(rrset_clone, i), orig_ttl);
1679 /* convert to lowercase */
1680 ldns_rr2canonical(ldns_rr_list_rr(rrset_clone, i));
1685 * Make raw signature buffer out of rrsig
1686 * @param rawsig_buf: raw signature buffer for result
1687 * @param rrsig: signature to convert
1688 * @return OK or more specific error.
1691 ldns_rrsig2rawsig_buffer(ldns_buffer* rawsig_buf, ldns_rr* rrsig)
1693 uint8_t sig_algo = ldns_rdf2native_int8(ldns_rr_rdf(rrsig, 1));
1694 /* check for known and implemented algo's now (otherwise
1695 * the function could return a wrong error
1697 /* create a buffer with signature rdata */
1698 /* for some algorithms we need other data than for others... */
1699 /* (the DSA API wants DER encoding for instance) */
1704 case LDNS_RSASHA1_NSEC3:
1706 case LDNS_RSASHA256:
1707 case LDNS_RSASHA512:
1712 if (ldns_rdf2buffer_wire(rawsig_buf,
1713 ldns_rr_rdf(rrsig, 8)) != LDNS_STATUS_OK) {
1714 return LDNS_STATUS_MEM_ERR;
1718 case LDNS_DSA_NSEC3:
1719 /* EVP takes rfc2459 format, which is a tad longer than dns format */
1720 if (ldns_convert_dsa_rrsig_rdf2asn1(rawsig_buf,
1721 ldns_rr_rdf(rrsig, 8)) != LDNS_STATUS_OK) {
1723 if (ldns_rdf2buffer_wire(rawsig_buf,
1724 ldns_rr_rdf(rrsig, 8)) != LDNS_STATUS_OK) {
1726 return LDNS_STATUS_MEM_ERR;
1732 return LDNS_STATUS_CRYPTO_ALGO_NOT_IMPL;
1734 return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO;
1736 return LDNS_STATUS_OK;
1740 * Check RRSIG timestamps against the given 'now' time.
1741 * @param rrsig: signature to check.
1742 * @param now: the current time in seconds epoch.
1743 * @return status code LDNS_STATUS_OK if all is fine.
1746 ldns_rrsig_check_timestamps(ldns_rr* rrsig, int32_t now)
1748 int32_t inception, expiration;
1750 /* check the signature time stamps */
1751 inception = (int32_t)ldns_rdf2native_time_t(
1752 ldns_rr_rrsig_inception(rrsig));
1753 expiration = (int32_t)ldns_rdf2native_time_t(
1754 ldns_rr_rrsig_expiration(rrsig));
1756 if (expiration - inception < 0) {
1757 /* bad sig, expiration before inception?? Tsssg */
1758 return LDNS_STATUS_CRYPTO_EXPIRATION_BEFORE_INCEPTION;
1760 if (now - inception < 0) {
1761 /* bad sig, inception date has not yet come to pass */
1762 return LDNS_STATUS_CRYPTO_SIG_NOT_INCEPTED;
1764 if (expiration - now < 0) {
1765 /* bad sig, expiration date has passed */
1766 return LDNS_STATUS_CRYPTO_SIG_EXPIRED;
1768 return LDNS_STATUS_OK;
1772 * Prepare for verification.
1773 * @param rawsig_buf: raw signature buffer made ready.
1774 * @param verify_buf: data for verification buffer made ready.
1775 * @param rrset_clone: made ready.
1776 * @param rrsig: signature to prepare for.
1777 * @return LDNS_STATUS_OK is all went well. Otherwise specific error.
1780 ldns_prepare_for_verify(ldns_buffer* rawsig_buf, ldns_buffer* verify_buf,
1781 ldns_rr_list* rrset_clone, ldns_rr* rrsig)
1785 /* canonicalize the sig */
1786 ldns_dname2canonical(ldns_rr_owner(rrsig));
1788 /* check if the typecovered is equal to the type checked */
1789 if (ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rrsig)) !=
1790 ldns_rr_get_type(ldns_rr_list_rr(rrset_clone, 0)))
1791 return LDNS_STATUS_CRYPTO_TYPE_COVERED_ERR;
1793 /* create a buffer with b64 signature rdata */
1794 result = ldns_rrsig2rawsig_buffer(rawsig_buf, rrsig);
1795 if(result != LDNS_STATUS_OK)
1798 /* use TTL from signature. Use wildcard names for wildcards */
1799 /* also canonicalizes rrset_clone */
1800 ldns_rrset_use_signature_ttl(rrset_clone, rrsig);
1802 /* sort the rrset in canonical order */
1803 ldns_rr_list_sort(rrset_clone);
1805 /* put the signature rr (without the b64) to the verify_buf */
1806 if (ldns_rrsig2buffer_wire(verify_buf, rrsig) != LDNS_STATUS_OK)
1807 return LDNS_STATUS_MEM_ERR;
1809 /* add the rrset in verify_buf */
1810 if(ldns_rr_list2buffer_wire(verify_buf, rrset_clone)
1812 return LDNS_STATUS_MEM_ERR;
1814 return LDNS_STATUS_OK;
1818 * Check if a key matches a signature.
1819 * Checks keytag, sigalgo and signature.
1820 * @param rawsig_buf: raw signature buffer for verify
1821 * @param verify_buf: raw data buffer for verify
1822 * @param rrsig: the rrsig
1823 * @param key: key to attempt.
1824 * @return LDNS_STATUS_OK if OK, else some specific error.
1827 ldns_verify_test_sig_key(ldns_buffer* rawsig_buf, ldns_buffer* verify_buf,
1828 ldns_rr* rrsig, ldns_rr* key)
1830 uint8_t sig_algo = ldns_rdf2native_int8(ldns_rr_rdf(rrsig, 1));
1832 /* before anything, check if the keytags match */
1833 if (ldns_calc_keytag(key)
1835 ldns_rdf2native_int16(ldns_rr_rrsig_keytag(rrsig))
1837 ldns_buffer* key_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1838 ldns_status result = LDNS_STATUS_ERR;
1840 /* put the key-data in a buffer, that's the third rdf, with
1841 * the base64 encoded key data */
1842 if (ldns_rdf2buffer_wire(key_buf, ldns_rr_rdf(key, 3))
1843 != LDNS_STATUS_OK) {
1844 ldns_buffer_free(key_buf);
1845 /* returning is bad might screw up
1846 good keys later in the list
1848 return LDNS_STATUS_ERR;
1851 if (sig_algo == ldns_rdf2native_int8(ldns_rr_rdf(key, 2))) {
1852 result = ldns_verify_rrsig_buffers(rawsig_buf,
1853 verify_buf, key_buf, sig_algo);
1855 /* No keys with the corresponding algorithm are found */
1856 result = LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY;
1859 ldns_buffer_free(key_buf);
1863 /* No keys with the corresponding keytag are found */
1864 return LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY;
1870 * - create the wire fmt of the b64 key rdata
1871 * - create the wire fmt of the sorted rrset
1872 * - create the wire fmt of the b64 sig rdata
1873 * - create the wire fmt of the sig without the b64 rdata
1874 * - cat the sig data (without b64 rdata) to the rrset
1875 * - verify the rrset+sig, with the b64 data and the b64 key data
1878 ldns_verify_rrsig_keylist(ldns_rr_list *rrset,
1880 const ldns_rr_list *keys,
1881 ldns_rr_list *good_keys)
1884 ldns_rr_list *valid = ldns_rr_list_new();
1886 return LDNS_STATUS_MEM_ERR;
1888 result = ldns_verify_rrsig_keylist_notime(rrset, rrsig, keys, valid);
1889 if(result != LDNS_STATUS_OK) {
1890 ldns_rr_list_free(valid);
1894 /* check timestamps last; its OK except time */
1895 result = ldns_rrsig_check_timestamps(rrsig, (int32_t)time(NULL));
1896 if(result != LDNS_STATUS_OK) {
1897 ldns_rr_list_free(valid);
1901 ldns_rr_list_cat(good_keys, valid);
1902 ldns_rr_list_free(valid);
1903 return LDNS_STATUS_OK;
1907 ldns_verify_rrsig_keylist_notime(ldns_rr_list *rrset,
1909 const ldns_rr_list *keys,
1910 ldns_rr_list *good_keys)
1912 ldns_buffer *rawsig_buf;
1913 ldns_buffer *verify_buf;
1915 ldns_status result, status;
1916 ldns_rr_list *rrset_clone;
1917 ldns_rr_list *validkeys;
1920 return LDNS_STATUS_ERR;
1923 validkeys = ldns_rr_list_new();
1925 return LDNS_STATUS_MEM_ERR;
1928 /* clone the rrset so that we can fiddle with it */
1929 rrset_clone = ldns_rr_list_clone(rrset);
1931 /* create the buffers which will certainly hold the raw data */
1932 rawsig_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1933 verify_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1935 result = ldns_prepare_for_verify(rawsig_buf, verify_buf,
1936 rrset_clone, rrsig);
1937 if(result != LDNS_STATUS_OK) {
1938 ldns_buffer_free(verify_buf);
1939 ldns_buffer_free(rawsig_buf);
1940 ldns_rr_list_deep_free(rrset_clone);
1941 ldns_rr_list_free(validkeys);
1944 result = LDNS_STATUS_ERR;
1946 for(i = 0; i < ldns_rr_list_rr_count(keys); i++) {
1947 status = ldns_verify_test_sig_key(rawsig_buf, verify_buf,
1948 rrsig, ldns_rr_list_rr(keys, i));
1949 if (status == LDNS_STATUS_OK) {
1950 /* one of the keys has matched, don't break
1951 * here, instead put the 'winning' key in
1952 * the validkey list and return the list
1954 if (!ldns_rr_list_push_rr(validkeys,
1955 ldns_rr_list_rr(keys,i))) {
1956 /* couldn't push the key?? */
1957 ldns_buffer_free(rawsig_buf);
1958 ldns_buffer_free(verify_buf);
1959 ldns_rr_list_deep_free(rrset_clone);
1960 ldns_rr_list_free(validkeys);
1961 return LDNS_STATUS_MEM_ERR;
1963 /* reset no keytag match error */
1964 result = LDNS_STATUS_ERR;
1966 if (result == LDNS_STATUS_ERR) {
1971 /* no longer needed */
1972 ldns_rr_list_deep_free(rrset_clone);
1973 ldns_buffer_free(rawsig_buf);
1974 ldns_buffer_free(verify_buf);
1976 if (ldns_rr_list_rr_count(validkeys) == 0) {
1977 /* no keys were added, return last error */
1978 ldns_rr_list_free(validkeys);
1982 /* do not check timestamps */
1984 ldns_rr_list_cat(good_keys, validkeys);
1985 ldns_rr_list_free(validkeys);
1986 return LDNS_STATUS_OK;
1990 ldns_verify_rrsig(ldns_rr_list *rrset, ldns_rr *rrsig, ldns_rr *key)
1992 ldns_buffer *rawsig_buf;
1993 ldns_buffer *verify_buf;
1995 ldns_rr_list *rrset_clone;
1998 return LDNS_STATUS_NO_DATA;
2000 /* clone the rrset so that we can fiddle with it */
2001 rrset_clone = ldns_rr_list_clone(rrset);
2002 /* create the buffers which will certainly hold the raw data */
2003 rawsig_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2004 verify_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2006 result = ldns_prepare_for_verify(rawsig_buf, verify_buf,
2007 rrset_clone, rrsig);
2008 if(result != LDNS_STATUS_OK) {
2009 ldns_rr_list_deep_free(rrset_clone);
2010 ldns_buffer_free(rawsig_buf);
2011 ldns_buffer_free(verify_buf);
2014 result = ldns_verify_test_sig_key(rawsig_buf, verify_buf,
2016 /* no longer needed */
2017 ldns_rr_list_deep_free(rrset_clone);
2018 ldns_buffer_free(rawsig_buf);
2019 ldns_buffer_free(verify_buf);
2021 /* check timestamp last, apart from time its OK */
2022 if(result == LDNS_STATUS_OK)
2023 result = ldns_rrsig_check_timestamps(rrsig,
2024 (int32_t)time(NULL));
2030 ldns_verify_rrsig_evp(ldns_buffer *sig,
2033 const EVP_MD *digest_type)
2035 return ldns_verify_rrsig_evp_raw(
2036 (unsigned char*)ldns_buffer_begin(sig),
2037 ldns_buffer_position(sig),
2044 ldns_verify_rrsig_evp_raw(unsigned char *sig, size_t siglen,
2045 ldns_buffer *rrset, EVP_PKEY *key, const EVP_MD *digest_type)
2050 EVP_MD_CTX_init(&ctx);
2052 EVP_VerifyInit(&ctx, digest_type);
2053 EVP_VerifyUpdate(&ctx,
2054 ldns_buffer_begin(rrset),
2055 ldns_buffer_position(rrset));
2056 res = EVP_VerifyFinal(&ctx, sig, (unsigned int) siglen, key);
2058 EVP_MD_CTX_cleanup(&ctx);
2061 return LDNS_STATUS_OK;
2062 } else if (res == 0) {
2063 return LDNS_STATUS_CRYPTO_BOGUS;
2065 /* TODO how to communicate internal SSL error?
2066 let caller use ssl's get_error() */
2067 return LDNS_STATUS_SSL_ERR;
2071 ldns_verify_rrsig_dsa(ldns_buffer *sig, ldns_buffer *rrset, ldns_buffer *key)
2073 return ldns_verify_rrsig_dsa_raw(
2074 (unsigned char*) ldns_buffer_begin(sig),
2075 ldns_buffer_position(sig),
2077 (unsigned char*) ldns_buffer_begin(key),
2078 ldns_buffer_position(key));
2082 ldns_verify_rrsig_rsasha1(ldns_buffer *sig, ldns_buffer *rrset, ldns_buffer *key)
2084 return ldns_verify_rrsig_rsasha1_raw(
2085 (unsigned char*)ldns_buffer_begin(sig),
2086 ldns_buffer_position(sig),
2088 (unsigned char*) ldns_buffer_begin(key),
2089 ldns_buffer_position(key));
2093 ldns_verify_rrsig_rsamd5(ldns_buffer *sig, ldns_buffer *rrset, ldns_buffer *key)
2095 return ldns_verify_rrsig_rsamd5_raw(
2096 (unsigned char*)ldns_buffer_begin(sig),
2097 ldns_buffer_position(sig),
2099 (unsigned char*) ldns_buffer_begin(key),
2100 ldns_buffer_position(key));
2104 ldns_verify_rrsig_dsa_raw(unsigned char* sig, size_t siglen,
2105 ldns_buffer* rrset, unsigned char* key, size_t keylen)
2110 evp_key = EVP_PKEY_new();
2111 EVP_PKEY_assign_DSA(evp_key, ldns_key_buf2dsa_raw(key, keylen));
2112 result = ldns_verify_rrsig_evp_raw(sig,
2117 EVP_PKEY_free(evp_key);
2123 ldns_verify_rrsig_rsasha1_raw(unsigned char* sig, size_t siglen,
2124 ldns_buffer* rrset, unsigned char* key, size_t keylen)
2129 evp_key = EVP_PKEY_new();
2130 EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen));
2131 result = ldns_verify_rrsig_evp_raw(sig,
2136 EVP_PKEY_free(evp_key);
2142 ldns_verify_rrsig_rsasha256_raw(unsigned char* sig,
2152 evp_key = EVP_PKEY_new();
2153 EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen));
2154 result = ldns_verify_rrsig_evp_raw(sig,
2159 EVP_PKEY_free(evp_key);
2163 /* touch these to prevent compiler warnings */
2169 return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO;
2174 ldns_verify_rrsig_rsasha512_raw(unsigned char* sig,
2184 evp_key = EVP_PKEY_new();
2185 EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen));
2186 result = ldns_verify_rrsig_evp_raw(sig,
2191 EVP_PKEY_free(evp_key);
2195 /* touch these to prevent compiler warnings */
2201 return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO;
2207 ldns_verify_rrsig_rsamd5_raw(unsigned char* sig,
2216 evp_key = EVP_PKEY_new();
2217 EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen));
2218 result = ldns_verify_rrsig_evp_raw(sig,
2223 EVP_PKEY_free(evp_key);