summaryrefslogtreecommitdiff
path: root/usr.sbin/unbound/ldns/drill/chasetrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/unbound/ldns/drill/chasetrace.c')
-rw-r--r--usr.sbin/unbound/ldns/drill/chasetrace.c401
1 files changed, 0 insertions, 401 deletions
diff --git a/usr.sbin/unbound/ldns/drill/chasetrace.c b/usr.sbin/unbound/ldns/drill/chasetrace.c
deleted file mode 100644
index a1dfd44681e..00000000000
--- a/usr.sbin/unbound/ldns/drill/chasetrace.c
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * chasetrace.c
- * Where all the hard work concerning chasing
- * and tracing is done
- * (c) 2005, 2006 NLnet Labs
- *
- * See the file LICENSE for the license
- *
- */
-
-#include "drill.h"
-#include <ldns/ldns.h>
-
-/**
- * trace down from the root to name
- */
-
-/* same naive method as in drill0.9
- * We resolver _ALL_ the names, which is ofcourse not needed
- * We _do_ use the local resolver to do that, so it still is
- * fast, but it can be made to run much faster
- */
-ldns_pkt *
-do_trace(ldns_resolver *local_res, ldns_rdf *name, ldns_rr_type t,
- ldns_rr_class c)
-{
- ldns_resolver *res;
- ldns_pkt *p;
- ldns_rr_list *new_nss_a;
- ldns_rr_list *new_nss_aaaa;
- ldns_rr_list *final_answer;
- ldns_rr_list *new_nss;
- ldns_rr_list *hostnames;
- ldns_rr_list *ns_addr;
- uint16_t loop_count;
- ldns_rdf *pop;
- ldns_status status;
- size_t i;
-
- loop_count = 0;
- new_nss_a = NULL;
- new_nss_aaaa = NULL;
- new_nss = NULL;
- ns_addr = NULL;
- final_answer = NULL;
- p = ldns_pkt_new();
- res = ldns_resolver_new();
-
- if (!p || !res) {
- error("Memory allocation failed");
- return NULL;
- }
-
- /* transfer some properties of local_res to res,
- * because they were given on the commandline */
- ldns_resolver_set_ip6(res,
- ldns_resolver_ip6(local_res));
- ldns_resolver_set_port(res,
- ldns_resolver_port(local_res));
- ldns_resolver_set_debug(res,
- ldns_resolver_debug(local_res));
- ldns_resolver_set_dnssec(res,
- ldns_resolver_dnssec(local_res));
- ldns_resolver_set_fail(res,
- ldns_resolver_fail(local_res));
- ldns_resolver_set_usevc(res,
- ldns_resolver_usevc(local_res));
- ldns_resolver_set_random(res,
- ldns_resolver_random(local_res));
- ldns_resolver_set_recursive(res, false);
-
- /* setup the root nameserver in the new resolver */
- status = ldns_resolver_push_nameserver_rr_list(res, global_dns_root);
- if (status != LDNS_STATUS_OK) {
- fprintf(stderr, "Error adding root servers to resolver: %s\n", ldns_get_errorstr_by_id(status));
- ldns_rr_list_print(stdout, global_dns_root);
- return NULL;
- }
-
- /* this must be a real query to local_res */
- status = ldns_resolver_send(&p, res, ldns_dname_new_frm_str("."), LDNS_RR_TYPE_NS, c, 0);
- /* p can still be NULL */
-
-
- if (ldns_pkt_empty(p)) {
- warning("No root server information received");
- }
-
- if (status == LDNS_STATUS_OK) {
- if (!ldns_pkt_empty(p)) {
- drill_pkt_print(stdout, local_res, p);
- }
- } else {
- error("cannot use local resolver");
- return NULL;
- }
-
- status = ldns_resolver_send(&p, res, name, t, c, 0);
-
- while(status == LDNS_STATUS_OK &&
- ldns_pkt_reply_type(p) == LDNS_PACKET_REFERRAL) {
-
- if (!p) {
- /* some error occurred, bail out */
- return NULL;
- }
-
- new_nss_a = ldns_pkt_rr_list_by_type(p,
- LDNS_RR_TYPE_A, LDNS_SECTION_ADDITIONAL);
- new_nss_aaaa = ldns_pkt_rr_list_by_type(p,
- LDNS_RR_TYPE_AAAA, LDNS_SECTION_ADDITIONAL);
- new_nss = ldns_pkt_rr_list_by_type(p,
- LDNS_RR_TYPE_NS, LDNS_SECTION_AUTHORITY);
-
- if (verbosity != -1) {
- ldns_rr_list_print(stdout, new_nss);
- }
- /* checks itself for verbosity */
- drill_pkt_print_footer(stdout, local_res, p);
-
- /* remove the old nameserver from the resolver */
- while((pop = ldns_resolver_pop_nameserver(res))) { /* do it */ }
-
- /* also check for new_nss emptyness */
-
- if (!new_nss_aaaa && !new_nss_a) {
- /*
- * no nameserver found!!!
- * try to resolve the names we do got
- */
- for(i = 0; i < ldns_rr_list_rr_count(new_nss); i++) {
- /* get the name of the nameserver */
- pop = ldns_rr_rdf(ldns_rr_list_rr(new_nss, i), 0);
- if (!pop) {
- break;
- }
-
- ldns_rr_list_print(stdout, new_nss);
- ldns_rdf_print(stdout, pop);
- /* retrieve it's addresses */
- ns_addr = ldns_rr_list_cat_clone(ns_addr,
- ldns_get_rr_list_addr_by_name(local_res, pop, c, 0));
- }
-
- if (ns_addr) {
- if (ldns_resolver_push_nameserver_rr_list(res, ns_addr) !=
- LDNS_STATUS_OK) {
- error("Error adding new nameservers");
- ldns_pkt_free(p);
- return NULL;
- }
- ldns_rr_list_free(ns_addr);
- } else {
- ldns_rr_list_print(stdout, ns_addr);
- error("Could not find the nameserver ip addr; abort");
- ldns_pkt_free(p);
- return NULL;
- }
- }
-
- /* add the new ones */
- if (new_nss_aaaa) {
- if (ldns_resolver_push_nameserver_rr_list(res, new_nss_aaaa) !=
- LDNS_STATUS_OK) {
- error("adding new nameservers");
- ldns_pkt_free(p);
- return NULL;
- }
- }
- if (new_nss_a) {
- if (ldns_resolver_push_nameserver_rr_list(res, new_nss_a) !=
- LDNS_STATUS_OK) {
- error("adding new nameservers");
- ldns_pkt_free(p);
- return NULL;
- }
- }
-
- if (loop_count++ > 20) {
- /* unlikely that we are doing something usefull */
- error("Looks like we are looping");
- ldns_pkt_free(p);
- return NULL;
- }
-
- status = ldns_resolver_send(&p, res, name, t, c, 0);
- new_nss_aaaa = NULL;
- new_nss_a = NULL;
- ns_addr = NULL;
- }
-
- status = ldns_resolver_send(&p, res, name, t, c, 0);
-
- if (!p) {
- return NULL;
- }
-
- hostnames = ldns_get_rr_list_name_by_addr(local_res,
- ldns_pkt_answerfrom(p), 0, 0);
-
- new_nss = ldns_pkt_authority(p);
- final_answer = ldns_pkt_answer(p);
-
- if (verbosity != -1) {
- ldns_rr_list_print(stdout, final_answer);
- ldns_rr_list_print(stdout, new_nss);
-
- }
- drill_pkt_print_footer(stdout, local_res, p);
- ldns_pkt_free(p);
- return NULL;
-}
-
-
-/**
- * Chase the given rr to a known and trusted key
- *
- * Based on drill 0.9
- *
- * the last argument prev_key_list, if not null, and type == DS, then the ds
- * rr list we have must all be a ds for the keys in this list
- */
-#ifdef HAVE_SSL
-ldns_status
-do_chase(ldns_resolver *res,
- ldns_rdf *name,
- ldns_rr_type type,
- ldns_rr_class c,
- ldns_rr_list *trusted_keys,
- ldns_pkt *pkt_o,
- uint16_t qflags,
- ldns_rr_list *prev_key_list,
- int verbosity)
-{
- ldns_rr_list *rrset = NULL;
- ldns_status result;
- ldns_rr *orig_rr = NULL;
-
- bool cname_followed = false;
-/*
- ldns_rr_list *sigs;
- ldns_rr *cur_sig;
- uint16_t sig_i;
- ldns_rr_list *keys;
-*/
- ldns_pkt *pkt;
- ldns_status tree_result;
- ldns_dnssec_data_chain *chain;
- ldns_dnssec_trust_tree *tree;
-
- const ldns_rr_descriptor *descriptor;
- descriptor = ldns_rr_descript(type);
-
- ldns_dname2canonical(name);
-
- pkt = ldns_pkt_clone(pkt_o);
- if (!name) {
- mesg("No name to chase");
- ldns_pkt_free(pkt);
- return LDNS_STATUS_EMPTY_LABEL;
- }
- if (verbosity != -1) {
- printf(";; Chasing: ");
- ldns_rdf_print(stdout, name);
- if (descriptor && descriptor->_name) {
- printf(" %s\n", descriptor->_name);
- } else {
- printf(" type %d\n", type);
- }
- }
-
- if (!trusted_keys || ldns_rr_list_rr_count(trusted_keys) < 1) {
- warning("No trusted keys specified");
- }
-
- if (pkt) {
- rrset = ldns_pkt_rr_list_by_name_and_type(pkt,
- name,
- type,
- LDNS_SECTION_ANSWER
- );
- if (!rrset) {
- /* nothing in answer, try authority */
- rrset = ldns_pkt_rr_list_by_name_and_type(pkt,
- name,
- type,
- LDNS_SECTION_AUTHORITY
- );
- }
- /* answer might be a cname, chase that first, then chase
- cname target? (TODO) */
- if (!rrset) {
- cname_followed = true;
- rrset = ldns_pkt_rr_list_by_name_and_type(pkt,
- name,
- LDNS_RR_TYPE_CNAME,
- LDNS_SECTION_ANSWER
- );
- if (!rrset) {
- /* nothing in answer, try authority */
- rrset = ldns_pkt_rr_list_by_name_and_type(pkt,
- name,
- LDNS_RR_TYPE_CNAME,
- LDNS_SECTION_AUTHORITY
- );
- }
- }
- } else {
- /* no packet? */
- if (verbosity >= 0) {
- fprintf(stderr, "%s", ldns_get_errorstr_by_id(LDNS_STATUS_MEM_ERR));
- fprintf(stderr, "\n");
- }
- return LDNS_STATUS_MEM_ERR;
- }
-
- if (!rrset) {
- /* not found in original packet, try again */
- ldns_pkt_free(pkt);
- pkt = NULL;
- pkt = ldns_resolver_query(res, name, type, c, qflags);
-
- if (!pkt) {
- if (verbosity >= 0) {
- fprintf(stderr, "%s", ldns_get_errorstr_by_id(LDNS_STATUS_NETWORK_ERR));
- fprintf(stderr, "\n");
- }
- return LDNS_STATUS_NETWORK_ERR;
- }
- if (verbosity >= 5) {
- ldns_pkt_print(stdout, pkt);
- }
-
- rrset = ldns_pkt_rr_list_by_name_and_type(pkt,
- name,
- type,
- LDNS_SECTION_ANSWER
- );
- }
-
- orig_rr = ldns_rr_new();
-
-/* if the answer had no answer section, we need to construct our own rr (for instance if
- * the rr qe asked for doesn't exist. This rr will be destroyed when the chain is freed */
- if (ldns_pkt_ancount(pkt) < 1) {
- ldns_rr_set_type(orig_rr, type);
- ldns_rr_set_owner(orig_rr, ldns_rdf_clone(name));
-
- chain = ldns_dnssec_build_data_chain(res, qflags, rrset, pkt, ldns_rr_clone(orig_rr));
- } else {
- /* chase the first answer */
- chain = ldns_dnssec_build_data_chain(res, qflags, rrset, pkt, NULL);
- }
-
- if (verbosity >= 4) {
- printf("\n\nDNSSEC Data Chain:\n");
- ldns_dnssec_data_chain_print(stdout, chain);
- }
-
- result = LDNS_STATUS_OK;
-
- tree = ldns_dnssec_derive_trust_tree(chain, NULL);
-
- if (verbosity >= 2) {
- printf("\n\nDNSSEC Trust tree:\n");
- ldns_dnssec_trust_tree_print(stdout, tree, 0, true);
- }
-
- if (ldns_rr_list_rr_count(trusted_keys) > 0) {
- tree_result = ldns_dnssec_trust_tree_contains_keys(tree, trusted_keys);
-
- if (tree_result == LDNS_STATUS_DNSSEC_EXISTENCE_DENIED) {
- if (verbosity >= 1) {
- printf("Existence denied or verifiably insecure\n");
- }
- result = LDNS_STATUS_OK;
- } else if (tree_result != LDNS_STATUS_OK) {
- if (verbosity >= 1) {
- printf("No trusted keys found in tree: first error was: %s\n", ldns_get_errorstr_by_id(tree_result));
- }
- result = tree_result;
- }
-
- } else {
- if (verbosity >= 0) {
- printf("You have not provided any trusted keys.\n");
- }
- }
-
- ldns_rr_free(orig_rr);
- ldns_dnssec_trust_tree_free(tree);
- ldns_dnssec_data_chain_deep_free(chain);
-
- ldns_rr_list_deep_free(rrset);
- ldns_pkt_free(pkt);
- /* ldns_rr_free(orig_rr);*/
-
- return result;
-}
-#endif /* HAVE_SSL */
-