xref: /dflybsd-src/contrib/ldns/drill/securetrace.c (revision ac996e71e808f370dc3bfe7295c565effb4db708)
1825eb42bSJan Lentfer /*
2825eb42bSJan Lentfer  * securechasetrace.c
3825eb42bSJan Lentfer  * Where all the hard work concerning secure tracing is done
4825eb42bSJan Lentfer  *
5825eb42bSJan Lentfer  * (c) 2005, 2006 NLnet Labs
6825eb42bSJan Lentfer  *
7825eb42bSJan Lentfer  * See the file LICENSE for the license
8825eb42bSJan Lentfer  *
9825eb42bSJan Lentfer  */
10825eb42bSJan Lentfer 
11825eb42bSJan Lentfer #include "drill.h"
12825eb42bSJan Lentfer #include <ldns/ldns.h>
13825eb42bSJan Lentfer 
14825eb42bSJan Lentfer #define SELF "[S]"  /* self sig ok */
15825eb42bSJan Lentfer #define TRUST "[T]" /* chain from parent */
16825eb42bSJan Lentfer #define BOGUS "[B]" /* bogus */
17825eb42bSJan Lentfer #define UNSIGNED "[U]" /* no relevant dnssec data found */
18825eb42bSJan Lentfer 
19825eb42bSJan Lentfer #if 0
20825eb42bSJan Lentfer /* See if there is a key/ds in trusted that matches
21825eb42bSJan Lentfer  * a ds in *ds.
22825eb42bSJan Lentfer  */
23825eb42bSJan Lentfer static ldns_rr_list *
24825eb42bSJan Lentfer ds_key_match(ldns_rr_list *ds, ldns_rr_list *trusted)
25825eb42bSJan Lentfer {
26825eb42bSJan Lentfer 	size_t i, j;
27825eb42bSJan Lentfer 	bool match;
28825eb42bSJan Lentfer 	ldns_rr *rr_i, *rr_j;
29825eb42bSJan Lentfer 	ldns_rr_list *keys;
30825eb42bSJan Lentfer 
31825eb42bSJan Lentfer 	if (!trusted || !ds) {
32825eb42bSJan Lentfer 		return NULL;
33825eb42bSJan Lentfer 	}
34825eb42bSJan Lentfer 
35825eb42bSJan Lentfer 	match = false;
36825eb42bSJan Lentfer 	keys = ldns_rr_list_new();
37825eb42bSJan Lentfer 	if (!keys) {
38825eb42bSJan Lentfer 		return NULL;
39825eb42bSJan Lentfer 	}
40825eb42bSJan Lentfer 
41825eb42bSJan Lentfer 	if (!ds || !trusted) {
42825eb42bSJan Lentfer 		return NULL;
43825eb42bSJan Lentfer 	}
44825eb42bSJan Lentfer 
45825eb42bSJan Lentfer 	for (i = 0; i < ldns_rr_list_rr_count(trusted); i++) {
46825eb42bSJan Lentfer 		rr_i = ldns_rr_list_rr(trusted, i);
47825eb42bSJan Lentfer 		for (j = 0; j < ldns_rr_list_rr_count(ds); j++) {
48825eb42bSJan Lentfer 
49825eb42bSJan Lentfer 			rr_j = ldns_rr_list_rr(ds, j);
50825eb42bSJan Lentfer 			if (ldns_rr_compare_ds(rr_i, rr_j)) {
51825eb42bSJan Lentfer 				match = true;
52825eb42bSJan Lentfer 				/* only allow unique RRs to match */
53825eb42bSJan Lentfer 				ldns_rr_set_push_rr(keys, rr_i);
54825eb42bSJan Lentfer 			}
55825eb42bSJan Lentfer 		}
56825eb42bSJan Lentfer 	}
57825eb42bSJan Lentfer 	if (match) {
58825eb42bSJan Lentfer 		return keys;
59825eb42bSJan Lentfer 	} else {
60825eb42bSJan Lentfer 		return NULL;
61825eb42bSJan Lentfer 	}
62825eb42bSJan Lentfer }
63825eb42bSJan Lentfer #endif
64825eb42bSJan Lentfer 
65825eb42bSJan Lentfer ldns_pkt *
66825eb42bSJan Lentfer get_dnssec_pkt(ldns_resolver *r, ldns_rdf *name, ldns_rr_type t)
67825eb42bSJan Lentfer {
68825eb42bSJan Lentfer 	ldns_pkt *p = NULL;
69825eb42bSJan Lentfer 	p = ldns_resolver_query(r, name, t, LDNS_RR_CLASS_IN, 0);
70825eb42bSJan Lentfer 	if (!p) {
71825eb42bSJan Lentfer 		return NULL;
72825eb42bSJan Lentfer 	} else {
73825eb42bSJan Lentfer 		if (verbosity >= 5) {
74825eb42bSJan Lentfer 			ldns_pkt_print(stdout, p);
75825eb42bSJan Lentfer 		}
76825eb42bSJan Lentfer 		return p;
77825eb42bSJan Lentfer 	}
78825eb42bSJan Lentfer }
79825eb42bSJan Lentfer 
80825eb42bSJan Lentfer #ifdef HAVE_SSL
81825eb42bSJan Lentfer /*
82825eb42bSJan Lentfer  * retrieve keys for this zone
83825eb42bSJan Lentfer  */
84825eb42bSJan Lentfer static ldns_pkt_type
85825eb42bSJan Lentfer get_key(ldns_pkt *p, ldns_rdf *apexname, ldns_rr_list **rrlist, ldns_rr_list **opt_sig)
86825eb42bSJan Lentfer {
87825eb42bSJan Lentfer 	return get_dnssec_rr(p, apexname, LDNS_RR_TYPE_DNSKEY, rrlist, opt_sig);
88825eb42bSJan Lentfer }
89825eb42bSJan Lentfer 
90825eb42bSJan Lentfer /*
91825eb42bSJan Lentfer  * check to see if we can find a DS rrset here which we can then follow
92825eb42bSJan Lentfer  */
93825eb42bSJan Lentfer static ldns_pkt_type
94825eb42bSJan Lentfer get_ds(ldns_pkt *p, ldns_rdf *ownername, ldns_rr_list **rrlist, ldns_rr_list **opt_sig)
95825eb42bSJan Lentfer {
96825eb42bSJan Lentfer 	return get_dnssec_rr(p, ownername, LDNS_RR_TYPE_DS, rrlist, opt_sig);
97825eb42bSJan Lentfer }
98825eb42bSJan Lentfer #endif /* HAVE_SSL */
99825eb42bSJan Lentfer 
100825eb42bSJan Lentfer void
101825eb42bSJan Lentfer remove_resolver_nameservers(ldns_resolver *res)
102825eb42bSJan Lentfer {
103825eb42bSJan Lentfer 	ldns_rdf *pop;
104825eb42bSJan Lentfer 
105825eb42bSJan Lentfer 	/* remove the old nameserver from the resolver */
106825eb42bSJan Lentfer 	while((pop = ldns_resolver_pop_nameserver(res))) {
107825eb42bSJan Lentfer 		ldns_rdf_deep_free(pop);
108825eb42bSJan Lentfer 	}
109825eb42bSJan Lentfer 
110825eb42bSJan Lentfer }
111825eb42bSJan Lentfer 
112825eb42bSJan Lentfer void
113825eb42bSJan Lentfer show_current_nameservers(FILE *out, ldns_resolver *res)
114825eb42bSJan Lentfer {
115825eb42bSJan Lentfer 	size_t i;
116825eb42bSJan Lentfer 	fprintf(out, "Current nameservers for resolver object:\n");
117825eb42bSJan Lentfer 	for (i = 0; i < ldns_resolver_nameserver_count(res); i++) {
118825eb42bSJan Lentfer 		ldns_rdf_print(out, ldns_resolver_nameservers(res)[i]);
119825eb42bSJan Lentfer 		fprintf(out, "\n");
120825eb42bSJan Lentfer 	}
121825eb42bSJan Lentfer }
122825eb42bSJan Lentfer 
123825eb42bSJan Lentfer /*ldns_pkt **/
124825eb42bSJan Lentfer #ifdef HAVE_SSL
125825eb42bSJan Lentfer int
126825eb42bSJan Lentfer do_secure_trace(ldns_resolver *local_res, ldns_rdf *name, ldns_rr_type t,
127825eb42bSJan Lentfer                 ldns_rr_class c, ldns_rr_list *trusted_keys, ldns_rdf *start_name
128825eb42bSJan Lentfer                )
129825eb42bSJan Lentfer {
130825eb42bSJan Lentfer 	ldns_resolver *res;
131825eb42bSJan Lentfer 	ldns_pkt *p, *local_p;
132825eb42bSJan Lentfer 	ldns_rr_list *new_nss_a;
133825eb42bSJan Lentfer 	ldns_rr_list *new_nss_aaaa;
134825eb42bSJan Lentfer 	ldns_rr_list *new_nss;
135825eb42bSJan Lentfer 	ldns_rr_list *ns_addr;
136825eb42bSJan Lentfer 	uint16_t loop_count;
137825eb42bSJan Lentfer 	ldns_rdf *pop;
138825eb42bSJan Lentfer 	ldns_rdf **labels = NULL;
139825eb42bSJan Lentfer 	ldns_status status, st;
140825eb42bSJan Lentfer 	ssize_t i;
141825eb42bSJan Lentfer 	size_t j;
142825eb42bSJan Lentfer 	size_t k;
143825eb42bSJan Lentfer 	size_t l;
144825eb42bSJan Lentfer 	uint8_t labels_count;
145825eb42bSJan Lentfer 	ldns_pkt_type pt;
146825eb42bSJan Lentfer 
147825eb42bSJan Lentfer 	/* dnssec */
148825eb42bSJan Lentfer 	ldns_rr_list *key_list;
149825eb42bSJan Lentfer 	ldns_rr_list *key_sig_list;
150825eb42bSJan Lentfer 	ldns_rr_list *ds_list;
151825eb42bSJan Lentfer 	ldns_rr_list *ds_sig_list;
152825eb42bSJan Lentfer 	ldns_rr_list *correct_key_list;
153825eb42bSJan Lentfer 	ldns_rr_list *trusted_ds_rrs;
154825eb42bSJan Lentfer 	bool new_keys_trusted = false;
155825eb42bSJan Lentfer 	ldns_rr_list *current_correct_keys;
156825eb42bSJan Lentfer 	ldns_rr_list *dataset;
157825eb42bSJan Lentfer 
158825eb42bSJan Lentfer 	ldns_rr_list *nsec_rrs = NULL;
159825eb42bSJan Lentfer 	ldns_rr_list *nsec_rr_sigs = NULL;
160825eb42bSJan Lentfer 
161825eb42bSJan Lentfer 	/* empty non-terminal check */
162825eb42bSJan Lentfer 	bool ent;
163825eb42bSJan Lentfer 
164825eb42bSJan Lentfer 	/* glue handling */
165825eb42bSJan Lentfer 	ldns_rr_list *new_ns_addr;
166825eb42bSJan Lentfer 	ldns_rr_list *old_ns_addr;
167825eb42bSJan Lentfer 	ldns_rr *ns_rr;
168825eb42bSJan Lentfer 
169825eb42bSJan Lentfer 	int result = 0;
170825eb42bSJan Lentfer 
171825eb42bSJan Lentfer 	/* printing niceness */
172825eb42bSJan Lentfer 	const ldns_rr_descriptor *descriptor;
173825eb42bSJan Lentfer 
174825eb42bSJan Lentfer 	descriptor = ldns_rr_descript(t);
175825eb42bSJan Lentfer 
176825eb42bSJan Lentfer 	loop_count = 0;
177825eb42bSJan Lentfer 	new_nss_a = NULL;
178825eb42bSJan Lentfer 	new_nss_aaaa = NULL;
179825eb42bSJan Lentfer 	new_nss = NULL;
180825eb42bSJan Lentfer 	ns_addr = NULL;
181825eb42bSJan Lentfer 	key_list = NULL;
182825eb42bSJan Lentfer 	ds_list = NULL;
183825eb42bSJan Lentfer 	pt = LDNS_PACKET_UNKNOWN;
184825eb42bSJan Lentfer 
185825eb42bSJan Lentfer 	p = NULL;
186825eb42bSJan Lentfer 	local_p = NULL;
187825eb42bSJan Lentfer 	res = ldns_resolver_new();
188825eb42bSJan Lentfer 	key_sig_list = NULL;
189825eb42bSJan Lentfer 	ds_sig_list = NULL;
190825eb42bSJan Lentfer 
191825eb42bSJan Lentfer 	if (!res) {
192825eb42bSJan Lentfer 		error("Memory allocation failed");
193825eb42bSJan Lentfer 		result = -1;
194825eb42bSJan Lentfer 		return result;
195825eb42bSJan Lentfer 	}
196825eb42bSJan Lentfer 
197825eb42bSJan Lentfer 	correct_key_list = ldns_rr_list_new();
198825eb42bSJan Lentfer 	if (!correct_key_list) {
199825eb42bSJan Lentfer 		error("Memory allocation failed");
200825eb42bSJan Lentfer 		result = -1;
201825eb42bSJan Lentfer 		return result;
202825eb42bSJan Lentfer 	}
203825eb42bSJan Lentfer 
204825eb42bSJan Lentfer 	trusted_ds_rrs = ldns_rr_list_new();
205825eb42bSJan Lentfer 	if (!trusted_ds_rrs) {
206825eb42bSJan Lentfer 		error("Memory allocation failed");
207825eb42bSJan Lentfer 		result = -1;
208825eb42bSJan Lentfer 		return result;
209825eb42bSJan Lentfer 	}
210*ac996e71SJan Lentfer         /* Add all preset trusted DS signatures to the list of trusted DS RRs. */
211*ac996e71SJan Lentfer         for (j = 0; j < ldns_rr_list_rr_count(trusted_keys); j++) {
212*ac996e71SJan Lentfer             ldns_rr* one_rr = ldns_rr_list_rr(trusted_keys, j);
213*ac996e71SJan Lentfer             if (ldns_rr_get_type(one_rr)  == LDNS_RR_TYPE_DS) {
214*ac996e71SJan Lentfer                 ldns_rr_list_push_rr(trusted_ds_rrs, ldns_rr_clone(one_rr));
215*ac996e71SJan Lentfer             }
216*ac996e71SJan Lentfer         }
217825eb42bSJan Lentfer 
218825eb42bSJan Lentfer 	/* transfer some properties of local_res to res */
219825eb42bSJan Lentfer 	ldns_resolver_set_ip6(res,
220825eb42bSJan Lentfer 			ldns_resolver_ip6(local_res));
221825eb42bSJan Lentfer 	ldns_resolver_set_port(res,
222825eb42bSJan Lentfer 			ldns_resolver_port(local_res));
223825eb42bSJan Lentfer 	ldns_resolver_set_debug(res,
224825eb42bSJan Lentfer 			ldns_resolver_debug(local_res));
225825eb42bSJan Lentfer 	ldns_resolver_set_fail(res,
226825eb42bSJan Lentfer 			ldns_resolver_fail(local_res));
227825eb42bSJan Lentfer 	ldns_resolver_set_usevc(res,
228825eb42bSJan Lentfer 			ldns_resolver_usevc(local_res));
229825eb42bSJan Lentfer 	ldns_resolver_set_random(res,
230825eb42bSJan Lentfer 			ldns_resolver_random(local_res));
231825eb42bSJan Lentfer 	ldns_resolver_set_recursive(local_res, true);
232825eb42bSJan Lentfer 
233825eb42bSJan Lentfer 	ldns_resolver_set_recursive(res, false);
234825eb42bSJan Lentfer 	ldns_resolver_set_dnssec_cd(res, false);
235825eb42bSJan Lentfer 	ldns_resolver_set_dnssec(res, true);
236825eb42bSJan Lentfer 
237825eb42bSJan Lentfer 	/* setup the root nameserver in the new resolver */
238825eb42bSJan Lentfer 	status = ldns_resolver_push_nameserver_rr_list(res, global_dns_root);
239825eb42bSJan Lentfer 	if (status != LDNS_STATUS_OK) {
240825eb42bSJan Lentfer 		printf("ERRRRR: %s\n", ldns_get_errorstr_by_id(status));
241825eb42bSJan Lentfer 		ldns_rr_list_print(stdout, global_dns_root);
242825eb42bSJan Lentfer 		return status;
243825eb42bSJan Lentfer 	}
244825eb42bSJan Lentfer 	labels_count = ldns_dname_label_count(name);
245825eb42bSJan Lentfer 	if (start_name) {
246825eb42bSJan Lentfer 		if (ldns_dname_is_subdomain(name, start_name)) {
247825eb42bSJan Lentfer 			labels_count -= ldns_dname_label_count(start_name);
248825eb42bSJan Lentfer 		} else {
249825eb42bSJan Lentfer 			fprintf(stderr, "Error; ");
250825eb42bSJan Lentfer 			ldns_rdf_print(stderr, name);
251825eb42bSJan Lentfer 			fprintf(stderr, " is not a subdomain of ");
252825eb42bSJan Lentfer 			ldns_rdf_print(stderr, start_name);
253825eb42bSJan Lentfer 			fprintf(stderr, "\n");
254825eb42bSJan Lentfer 			goto done;
255825eb42bSJan Lentfer 		}
256825eb42bSJan Lentfer 	}
257825eb42bSJan Lentfer 	labels = LDNS_XMALLOC(ldns_rdf*, labels_count + 2);
258825eb42bSJan Lentfer 	if (!labels) {
259825eb42bSJan Lentfer 		goto done;
260825eb42bSJan Lentfer 	}
261825eb42bSJan Lentfer 	labels[0] = ldns_dname_new_frm_str(LDNS_ROOT_LABEL_STR);
262825eb42bSJan Lentfer 	labels[1] = ldns_rdf_clone(name);
263825eb42bSJan Lentfer 	for(i = 2 ; i < (ssize_t)labels_count + 2; i++) {
264825eb42bSJan Lentfer 		labels[i] = ldns_dname_left_chop(labels[i - 1]);
265825eb42bSJan Lentfer 	}
266825eb42bSJan Lentfer 	/* if no servers is given with @, start by asking local resolver */
267825eb42bSJan Lentfer 	/* first part todo :) */
268825eb42bSJan Lentfer 	for (i = 0; i < (ssize_t) ldns_resolver_nameserver_count(local_res); i++) {
269825eb42bSJan Lentfer 		(void) ldns_resolver_push_nameserver(res, ldns_resolver_nameservers(local_res)[i]);
270825eb42bSJan Lentfer 	}
271825eb42bSJan Lentfer 
272825eb42bSJan Lentfer 	/* get the nameserver for the label
273825eb42bSJan Lentfer 	 * ask: dnskey and ds for the label
274825eb42bSJan Lentfer 	 */
275825eb42bSJan Lentfer 	for(i = (ssize_t)labels_count + 1; i > 0; i--) {
276825eb42bSJan Lentfer 		status = ldns_resolver_send(&local_p, res, labels[i], LDNS_RR_TYPE_NS, c, 0);
277825eb42bSJan Lentfer 
278825eb42bSJan Lentfer 		if (verbosity >= 5) {
279825eb42bSJan Lentfer 			ldns_pkt_print(stdout, local_p);
280825eb42bSJan Lentfer 		}
281825eb42bSJan Lentfer 
282825eb42bSJan Lentfer 		new_nss = ldns_pkt_rr_list_by_type(local_p,
283825eb42bSJan Lentfer 					LDNS_RR_TYPE_NS, LDNS_SECTION_ANSWER);
284825eb42bSJan Lentfer  		if (!new_nss) {
285825eb42bSJan Lentfer 			/* if it's a delegation, servers put them in the auth section */
286825eb42bSJan Lentfer 			new_nss = ldns_pkt_rr_list_by_type(local_p,
287825eb42bSJan Lentfer 					LDNS_RR_TYPE_NS, LDNS_SECTION_AUTHORITY);
288825eb42bSJan Lentfer 		}
289825eb42bSJan Lentfer 
290825eb42bSJan Lentfer 		/* if this is the final step there might not be nameserver records
291825eb42bSJan Lentfer 		   of course if the data is in the apex, there are, so cover both
292825eb42bSJan Lentfer 		   cases */
293825eb42bSJan Lentfer 		if (new_nss || i > 1) {
294825eb42bSJan Lentfer 			for(j = 0; j < ldns_rr_list_rr_count(new_nss); j++) {
295825eb42bSJan Lentfer 				ns_rr = ldns_rr_list_rr(new_nss, j);
296825eb42bSJan Lentfer 				pop = ldns_rr_rdf(ns_rr, 0);
297825eb42bSJan Lentfer 				if (!pop) {
298825eb42bSJan Lentfer 					printf("nopo\n");
299825eb42bSJan Lentfer 					break;
300825eb42bSJan Lentfer 				}
301825eb42bSJan Lentfer 				/* retrieve it's addresses */
302825eb42bSJan Lentfer 				/* trust glue? */
303825eb42bSJan Lentfer 				new_ns_addr = NULL;
304825eb42bSJan Lentfer 				if (ldns_dname_is_subdomain(pop, labels[i])) {
305825eb42bSJan Lentfer 					new_ns_addr = ldns_pkt_rr_list_by_name_and_type(local_p, pop, LDNS_RR_TYPE_A, LDNS_SECTION_ADDITIONAL);
306825eb42bSJan Lentfer 				}
307825eb42bSJan Lentfer 				if (!new_ns_addr || ldns_rr_list_rr_count(new_ns_addr) == 0) {
308825eb42bSJan Lentfer 					new_ns_addr = ldns_get_rr_list_addr_by_name(res, pop, c, 0);
309825eb42bSJan Lentfer 				}
310825eb42bSJan Lentfer 				if (!new_ns_addr || ldns_rr_list_rr_count(new_ns_addr) == 0) {
311825eb42bSJan Lentfer 					new_ns_addr = ldns_get_rr_list_addr_by_name(local_res, pop, c, 0);
312825eb42bSJan Lentfer 				}
313825eb42bSJan Lentfer 
314825eb42bSJan Lentfer 				if (new_ns_addr) {
315825eb42bSJan Lentfer 					old_ns_addr = ns_addr;
316825eb42bSJan Lentfer 					ns_addr = ldns_rr_list_cat_clone(ns_addr, new_ns_addr);
317825eb42bSJan Lentfer 					ldns_rr_list_deep_free(old_ns_addr);
318825eb42bSJan Lentfer 				}
319825eb42bSJan Lentfer 				ldns_rr_list_deep_free(new_ns_addr);
320825eb42bSJan Lentfer 			}
321825eb42bSJan Lentfer 			ldns_rr_list_deep_free(new_nss);
322825eb42bSJan Lentfer 
323825eb42bSJan Lentfer 			if (ns_addr) {
324825eb42bSJan Lentfer 				remove_resolver_nameservers(res);
325825eb42bSJan Lentfer 
326825eb42bSJan Lentfer 				if (ldns_resolver_push_nameserver_rr_list(res, ns_addr) !=
327825eb42bSJan Lentfer 						LDNS_STATUS_OK) {
328825eb42bSJan Lentfer 					error("Error adding new nameservers");
329825eb42bSJan Lentfer 					ldns_pkt_free(local_p);
330825eb42bSJan Lentfer 					goto done;
331825eb42bSJan Lentfer 				}
332825eb42bSJan Lentfer 				ldns_rr_list_deep_free(ns_addr);
333825eb42bSJan Lentfer 			} else {
334825eb42bSJan Lentfer 				status = ldns_verify_denial(local_p, labels[i], LDNS_RR_TYPE_NS, &nsec_rrs, &nsec_rr_sigs);
335825eb42bSJan Lentfer 
336825eb42bSJan Lentfer 				/* verify the nsec3 themselves*/
337825eb42bSJan Lentfer 				if (verbosity >= 4) {
338825eb42bSJan Lentfer 					printf("NSEC(3) Records to verify:\n");
339825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, nsec_rrs);
340825eb42bSJan Lentfer 					printf("With signatures:\n");
341825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, nsec_rr_sigs);
342825eb42bSJan Lentfer 					printf("correct keys:\n");
343825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, correct_key_list);
344825eb42bSJan Lentfer 				}
345825eb42bSJan Lentfer 
346825eb42bSJan Lentfer 				if (status == LDNS_STATUS_OK) {
347825eb42bSJan Lentfer 					if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, trusted_keys, NULL)) == LDNS_STATUS_OK) {
348825eb42bSJan Lentfer 						fprintf(stdout, "%s ", TRUST);
349825eb42bSJan Lentfer 						fprintf(stdout, "Existence denied: ");
350825eb42bSJan Lentfer 						ldns_rdf_print(stdout, labels[i]);
351825eb42bSJan Lentfer 	/*
352825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
353825eb42bSJan Lentfer 							printf(" %s", descriptor->_name);
354825eb42bSJan Lentfer 						} else {
355825eb42bSJan Lentfer 							printf(" TYPE%u", t);
356825eb42bSJan Lentfer 						}
357825eb42bSJan Lentfer 	*/					fprintf(stdout, " NS\n");
358825eb42bSJan Lentfer 					} else if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, correct_key_list, NULL)) == LDNS_STATUS_OK) {
359825eb42bSJan Lentfer 						fprintf(stdout, "%s ", SELF);
360825eb42bSJan Lentfer 						fprintf(stdout, "Existence denied: ");
361825eb42bSJan Lentfer 						ldns_rdf_print(stdout, labels[i]);
362825eb42bSJan Lentfer 	/*
363825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
364825eb42bSJan Lentfer 							printf(" %s", descriptor->_name);
365825eb42bSJan Lentfer 						} else {
366825eb42bSJan Lentfer 							printf(" TYPE%u", t);
367825eb42bSJan Lentfer 						}
368825eb42bSJan Lentfer 	*/
369825eb42bSJan Lentfer 						fprintf(stdout, " NS\n");
370825eb42bSJan Lentfer 					} else {
371825eb42bSJan Lentfer 						fprintf(stdout, "%s ", BOGUS);
372825eb42bSJan Lentfer 						result = 1;
373825eb42bSJan Lentfer 						printf(";; Error verifying denial of existence for name ");
374825eb42bSJan Lentfer 						ldns_rdf_print(stdout, labels[i]);
375825eb42bSJan Lentfer 	/*
376825eb42bSJan Lentfer 						printf(" type ");
377825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
378825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
379825eb42bSJan Lentfer 						} else {
380825eb42bSJan Lentfer 							printf("TYPE%u", t);
381825eb42bSJan Lentfer 						}
382825eb42bSJan Lentfer 	*/					printf("NS: %s\n", ldns_get_errorstr_by_id(st));
383825eb42bSJan Lentfer 					}
384825eb42bSJan Lentfer 				} else {
385825eb42bSJan Lentfer 					fprintf(stdout, "%s ", BOGUS);
386825eb42bSJan Lentfer 					result = 1;
387825eb42bSJan Lentfer 					printf(";; Error verifying denial of existence for name ");
388825eb42bSJan Lentfer 					ldns_rdf_print(stdout, labels[i]);
389825eb42bSJan Lentfer 					printf("NS: %s\n", ldns_get_errorstr_by_id(status));
390825eb42bSJan Lentfer 				}
391825eb42bSJan Lentfer 
392825eb42bSJan Lentfer 				/* there might be an empty non-terminal, in which case we need to continue */
393825eb42bSJan Lentfer 				ent = false;
394825eb42bSJan Lentfer 				for (j = 0; j < ldns_rr_list_rr_count(nsec_rrs); j++) {
395825eb42bSJan Lentfer 					if (ldns_dname_is_subdomain(ldns_rr_rdf(ldns_rr_list_rr(nsec_rrs, j), 0), labels[i])) {
396825eb42bSJan Lentfer 						ent = true;
397825eb42bSJan Lentfer 					}
398825eb42bSJan Lentfer 				}
399825eb42bSJan Lentfer 				if (!ent) {
400825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rrs);
401825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rr_sigs);
402825eb42bSJan Lentfer 					ldns_pkt_free(local_p);
403825eb42bSJan Lentfer 					goto done;
404825eb42bSJan Lentfer 				} else {
405825eb42bSJan Lentfer 					printf(";; There is an empty non-terminal here, continue\n");
406*ac996e71SJan Lentfer 					continue;
407825eb42bSJan Lentfer 				}
408825eb42bSJan Lentfer 				goto done;
409825eb42bSJan Lentfer 			}
410825eb42bSJan Lentfer 
411825eb42bSJan Lentfer 			if (ldns_resolver_nameserver_count(res) == 0) {
412825eb42bSJan Lentfer 				error("No nameservers found for this node");
413825eb42bSJan Lentfer 				goto done;
414825eb42bSJan Lentfer 			}
415825eb42bSJan Lentfer 		}
416825eb42bSJan Lentfer 		ldns_pkt_free(local_p);
417825eb42bSJan Lentfer 
418825eb42bSJan Lentfer 		fprintf(stdout, ";; Domain: ");
419825eb42bSJan Lentfer 		ldns_rdf_print(stdout, labels[i]);
420825eb42bSJan Lentfer 		fprintf(stdout, "\n");
421825eb42bSJan Lentfer 
422825eb42bSJan Lentfer 		/* retrieve keys for current domain, and verify them
423825eb42bSJan Lentfer 		   if they match an already trusted DS, or if one of the
424825eb42bSJan Lentfer 		   keys used to sign these is trusted, add the keys to
425825eb42bSJan Lentfer 		   the trusted list */
426825eb42bSJan Lentfer 		p = get_dnssec_pkt(res, labels[i], LDNS_RR_TYPE_DNSKEY);
427825eb42bSJan Lentfer 		pt = get_key(p, labels[i], &key_list, &key_sig_list);
428825eb42bSJan Lentfer 		if (key_sig_list) {
429825eb42bSJan Lentfer 			if (key_list) {
430825eb42bSJan Lentfer 				current_correct_keys = ldns_rr_list_new();
431825eb42bSJan Lentfer 				if ((st = ldns_verify(key_list, key_sig_list, key_list, current_correct_keys)) ==
432825eb42bSJan Lentfer 						LDNS_STATUS_OK) {
433825eb42bSJan Lentfer 					/* add all signed keys (don't just add current_correct, you'd miss
434825eb42bSJan Lentfer 					 * the zsk's then */
435825eb42bSJan Lentfer 					for (j = 0; j < ldns_rr_list_rr_count(key_list); j++) {
436825eb42bSJan Lentfer 						ldns_rr_list_push_rr(correct_key_list, ldns_rr_clone(ldns_rr_list_rr(key_list, j)));
437825eb42bSJan Lentfer 					}
438825eb42bSJan Lentfer 
439825eb42bSJan Lentfer 					/* check whether these keys were signed
440825eb42bSJan Lentfer 					 * by a trusted keys. if so, these
441825eb42bSJan Lentfer 					 * keys are also trusted */
442825eb42bSJan Lentfer 					new_keys_trusted = false;
443825eb42bSJan Lentfer 					for (k = 0; k < ldns_rr_list_rr_count(current_correct_keys); k++) {
444825eb42bSJan Lentfer 						for (j = 0; j < ldns_rr_list_rr_count(trusted_ds_rrs); j++) {
445825eb42bSJan Lentfer 							if (ldns_rr_compare_ds(ldns_rr_list_rr(current_correct_keys, k),
446825eb42bSJan Lentfer 								    ldns_rr_list_rr(trusted_ds_rrs, j))) {
447825eb42bSJan Lentfer 								new_keys_trusted = true;
448825eb42bSJan Lentfer 							}
449825eb42bSJan Lentfer 						}
450825eb42bSJan Lentfer 					}
451825eb42bSJan Lentfer 
452825eb42bSJan Lentfer 					/* also all keys are trusted if one of the current correct keys is trusted */
453825eb42bSJan Lentfer 					for (k = 0; k < ldns_rr_list_rr_count(current_correct_keys); k++) {
454825eb42bSJan Lentfer 						for (j = 0; j < ldns_rr_list_rr_count(trusted_keys); j++) {
455825eb42bSJan Lentfer 							if (ldns_rr_compare(ldns_rr_list_rr(current_correct_keys, k),
456825eb42bSJan Lentfer 								            ldns_rr_list_rr(trusted_keys, j)) == 0) {
457825eb42bSJan Lentfer 								            new_keys_trusted = true;
458825eb42bSJan Lentfer 							}
459825eb42bSJan Lentfer 						}
460825eb42bSJan Lentfer 					}
461825eb42bSJan Lentfer 
462825eb42bSJan Lentfer 
463825eb42bSJan Lentfer 					if (new_keys_trusted) {
464825eb42bSJan Lentfer 						ldns_rr_list_push_rr_list(trusted_keys, key_list);
465825eb42bSJan Lentfer 						print_rr_list_abbr(stdout, key_list, TRUST);
466825eb42bSJan Lentfer 						ldns_rr_list_free(key_list);
467825eb42bSJan Lentfer 						key_list = NULL;
468825eb42bSJan Lentfer 					} else {
469825eb42bSJan Lentfer 						if (verbosity >= 2) {
470825eb42bSJan Lentfer 							printf(";; Signature ok but no chain to a trusted key or ds record\n");
471825eb42bSJan Lentfer 						}
472825eb42bSJan Lentfer 						print_rr_list_abbr(stdout, key_list, SELF);
473825eb42bSJan Lentfer 						ldns_rr_list_deep_free(key_list);
474825eb42bSJan Lentfer 						key_list = NULL;
475825eb42bSJan Lentfer 					}
476825eb42bSJan Lentfer 				} else {
477825eb42bSJan Lentfer 					print_rr_list_abbr(stdout, key_list, BOGUS);
478825eb42bSJan Lentfer 					result = 2;
479825eb42bSJan Lentfer 					ldns_rr_list_deep_free(key_list);
480825eb42bSJan Lentfer 					key_list = NULL;
481825eb42bSJan Lentfer 				}
482825eb42bSJan Lentfer 				ldns_rr_list_free(current_correct_keys);
483825eb42bSJan Lentfer 				current_correct_keys = NULL;
484825eb42bSJan Lentfer 			} else {
485825eb42bSJan Lentfer 				printf(";; No DNSKEY record found for ");
486825eb42bSJan Lentfer 				ldns_rdf_print(stdout, labels[i]);
487825eb42bSJan Lentfer 				printf("\n");
488825eb42bSJan Lentfer 			}
489825eb42bSJan Lentfer 		}
490825eb42bSJan Lentfer 
491825eb42bSJan Lentfer 		ldns_pkt_free(p);
492825eb42bSJan Lentfer 		ldns_rr_list_deep_free(key_sig_list);
493825eb42bSJan Lentfer 		key_sig_list = NULL;
494825eb42bSJan Lentfer 
495825eb42bSJan Lentfer 		/* check the DS records for the next child domain */
496825eb42bSJan Lentfer 		if (i > 1) {
497825eb42bSJan Lentfer 			p = get_dnssec_pkt(res, labels[i-1], LDNS_RR_TYPE_DS);
498825eb42bSJan Lentfer 			pt = get_ds(p, labels[i-1], &ds_list, &ds_sig_list);
499825eb42bSJan Lentfer 			if (!ds_list) {
500825eb42bSJan Lentfer 				ldns_pkt_free(p);
501825eb42bSJan Lentfer 				if (ds_sig_list) {
502825eb42bSJan Lentfer 					ldns_rr_list_deep_free(ds_sig_list);
503825eb42bSJan Lentfer 				}
504825eb42bSJan Lentfer 				p = get_dnssec_pkt(res, name, LDNS_RR_TYPE_DNSKEY);
505825eb42bSJan Lentfer 				pt = get_ds(p, NULL, &ds_list, &ds_sig_list);
506825eb42bSJan Lentfer 			}
507825eb42bSJan Lentfer 			if (ds_sig_list) {
508825eb42bSJan Lentfer 				if (ds_list) {
509825eb42bSJan Lentfer 					if (verbosity >= 4) {
510825eb42bSJan Lentfer 						printf("VERIFYING:\n");
511825eb42bSJan Lentfer 						printf("DS LIST:\n");
512825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, ds_list);
513825eb42bSJan Lentfer 						printf("SIGS:\n");
514825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, ds_sig_list);
515825eb42bSJan Lentfer 						printf("KEYS:\n");
516825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, correct_key_list);
517825eb42bSJan Lentfer 					}
518825eb42bSJan Lentfer 
519825eb42bSJan Lentfer 					current_correct_keys = ldns_rr_list_new();
520825eb42bSJan Lentfer 
521825eb42bSJan Lentfer 					if ((st = ldns_verify(ds_list, ds_sig_list, correct_key_list, current_correct_keys)) ==
522825eb42bSJan Lentfer 							LDNS_STATUS_OK) {
523825eb42bSJan Lentfer 						/* if the ds is signed by a trusted key and a key from correct keys
524825eb42bSJan Lentfer 						   matches that ds, add that key to the trusted keys */
525825eb42bSJan Lentfer 						new_keys_trusted = false;
526825eb42bSJan Lentfer 						if (verbosity >= 2) {
527825eb42bSJan Lentfer 							printf("Checking if signing key is trusted:\n");
528825eb42bSJan Lentfer 						}
529825eb42bSJan Lentfer 						for (j = 0; j < ldns_rr_list_rr_count(current_correct_keys); j++) {
530825eb42bSJan Lentfer 							if (verbosity >= 2) {
531825eb42bSJan Lentfer 								printf("New key: ");
532825eb42bSJan Lentfer 								ldns_rr_print(stdout, ldns_rr_list_rr(current_correct_keys, j));
533825eb42bSJan Lentfer 							}
534825eb42bSJan Lentfer 							for (k = 0; k < ldns_rr_list_rr_count(trusted_keys); k++) {
535825eb42bSJan Lentfer 								if (verbosity >= 2) {
536825eb42bSJan Lentfer 									printf("\tTrusted key: ");
537825eb42bSJan Lentfer 									ldns_rr_print(stdout, ldns_rr_list_rr(trusted_keys, k));
538825eb42bSJan Lentfer 								}
539825eb42bSJan Lentfer 								if (ldns_rr_compare(ldns_rr_list_rr(current_correct_keys, j),
540825eb42bSJan Lentfer 								    ldns_rr_list_rr(trusted_keys, k)) == 0) {
541825eb42bSJan Lentfer 								    	if (verbosity >= 2) {
542825eb42bSJan Lentfer 								    		printf("Key is now trusted!\n");
543825eb42bSJan Lentfer 									}
544825eb42bSJan Lentfer 									for (l = 0; l < ldns_rr_list_rr_count(ds_list); l++) {
545825eb42bSJan Lentfer 										ldns_rr_list_push_rr(trusted_ds_rrs, ldns_rr_clone(ldns_rr_list_rr(ds_list, l)));
546825eb42bSJan Lentfer 										new_keys_trusted = true;
547825eb42bSJan Lentfer 									}
548825eb42bSJan Lentfer 								}
549825eb42bSJan Lentfer 							}
550825eb42bSJan Lentfer 						}
551825eb42bSJan Lentfer 						if (new_keys_trusted) {
552825eb42bSJan Lentfer 							print_rr_list_abbr(stdout, ds_list, TRUST);
553825eb42bSJan Lentfer 						} else {
554825eb42bSJan Lentfer 							print_rr_list_abbr(stdout, ds_list, SELF);
555825eb42bSJan Lentfer 						}
556825eb42bSJan Lentfer 					} else {
557825eb42bSJan Lentfer 						result = 3;
558825eb42bSJan Lentfer 						print_rr_list_abbr(stdout, ds_list, BOGUS);
559825eb42bSJan Lentfer 					}
560825eb42bSJan Lentfer 
561825eb42bSJan Lentfer 					ldns_rr_list_free(current_correct_keys);
562825eb42bSJan Lentfer 					current_correct_keys = NULL;
563825eb42bSJan Lentfer 				} else {
564825eb42bSJan Lentfer 					/* wait apparently there were no keys either, go back to the ds packet */
565825eb42bSJan Lentfer 					ldns_pkt_free(p);
566825eb42bSJan Lentfer 					ldns_rr_list_deep_free(ds_sig_list);
567825eb42bSJan Lentfer 					p = get_dnssec_pkt(res, labels[i-1], LDNS_RR_TYPE_DS);
568825eb42bSJan Lentfer 					pt = get_ds(p, labels[i-1], &ds_list, &ds_sig_list);
569825eb42bSJan Lentfer 
570825eb42bSJan Lentfer 					status = ldns_verify_denial(p, labels[i-1], LDNS_RR_TYPE_DS, &nsec_rrs, &nsec_rr_sigs);
571825eb42bSJan Lentfer 
572825eb42bSJan Lentfer 					if (verbosity >= 4) {
573825eb42bSJan Lentfer 						printf("NSEC(3) Records to verify:\n");
574825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rrs);
575825eb42bSJan Lentfer 						printf("With signatures:\n");
576825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rr_sigs);
577825eb42bSJan Lentfer 						printf("correct keys:\n");
578825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, correct_key_list);
579825eb42bSJan Lentfer 					}
580825eb42bSJan Lentfer 
581825eb42bSJan Lentfer 					if (status == LDNS_STATUS_OK) {
582825eb42bSJan Lentfer 						if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, trusted_keys, NULL)) == LDNS_STATUS_OK) {
583825eb42bSJan Lentfer 							fprintf(stdout, "%s ", TRUST);
584825eb42bSJan Lentfer 							fprintf(stdout, "Existence denied: ");
585825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i-1]);
586825eb42bSJan Lentfer 							printf(" DS");
587825eb42bSJan Lentfer 							fprintf(stdout, "\n");
588825eb42bSJan Lentfer 						} else if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, correct_key_list, NULL)) == LDNS_STATUS_OK) {
589825eb42bSJan Lentfer 							fprintf(stdout, "%s ", SELF);
590825eb42bSJan Lentfer 							fprintf(stdout, "Existence denied: ");
591825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i-1]);
592825eb42bSJan Lentfer 							printf(" DS");
593825eb42bSJan Lentfer 							fprintf(stdout, "\n");
594825eb42bSJan Lentfer 						} else {
595825eb42bSJan Lentfer 							result = 4;
596825eb42bSJan Lentfer 							fprintf(stdout, "%s ", BOGUS);
597825eb42bSJan Lentfer 							printf("Error verifying denial of existence for ");
598825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i-1]);
599825eb42bSJan Lentfer 							printf(" DS");
600825eb42bSJan Lentfer 							printf(": %s\n", ldns_get_errorstr_by_id(st));
601825eb42bSJan Lentfer 						}
602825eb42bSJan Lentfer 
603825eb42bSJan Lentfer 
604825eb42bSJan Lentfer 					} else {
605825eb42bSJan Lentfer 						if (status == LDNS_STATUS_CRYPTO_NO_RRSIG) {
606825eb42bSJan Lentfer 							printf(";; No DS for ");
607825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i - 1]);
608825eb42bSJan Lentfer 						} else {
609825eb42bSJan Lentfer 							printf("[B] Unable to verify denial of existence for ");
610825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i - 1]);
611825eb42bSJan Lentfer 							printf(" DS: %s\n", ldns_get_errorstr_by_id(status));
612825eb42bSJan Lentfer 						}
613825eb42bSJan Lentfer 					}
614825eb42bSJan Lentfer 					if (verbosity >= 2) {
615825eb42bSJan Lentfer 						printf(";; No ds record for delegation\n");
616825eb42bSJan Lentfer 					}
617825eb42bSJan Lentfer 				}
618825eb42bSJan Lentfer 			}
619825eb42bSJan Lentfer 			ldns_rr_list_deep_free(ds_list);
620825eb42bSJan Lentfer 			ldns_pkt_free(p);
621825eb42bSJan Lentfer 		} else {
622825eb42bSJan Lentfer 			/* if this is the last label, just verify the data and stop */
623825eb42bSJan Lentfer 			p = get_dnssec_pkt(res, labels[i], t);
624825eb42bSJan Lentfer 			pt = get_dnssec_rr(p, labels[i], t, &dataset, &key_sig_list);
625825eb42bSJan Lentfer 			if (dataset && ldns_rr_list_rr_count(dataset) > 0) {
626825eb42bSJan Lentfer 				if (key_sig_list && ldns_rr_list_rr_count(key_sig_list) > 0) {
627825eb42bSJan Lentfer 
628825eb42bSJan Lentfer 					/* If this is a wildcard, you must be able to deny exact match */
629825eb42bSJan Lentfer 					if ((st = ldns_verify(dataset, key_sig_list, trusted_keys, NULL)) == LDNS_STATUS_OK) {
630825eb42bSJan Lentfer 						fprintf(stdout, "%s ", TRUST);
631825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, dataset);
632825eb42bSJan Lentfer 					} else if ((st = ldns_verify(dataset, key_sig_list, correct_key_list, NULL)) == LDNS_STATUS_OK) {
633825eb42bSJan Lentfer 						fprintf(stdout, "%s ", SELF);
634825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, dataset);
635825eb42bSJan Lentfer 					} else {
636825eb42bSJan Lentfer 						result = 5;
637825eb42bSJan Lentfer 						fprintf(stdout, "%s ", BOGUS);
638825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, dataset);
639825eb42bSJan Lentfer 						printf(";; Error: %s\n", ldns_get_errorstr_by_id(st));
640825eb42bSJan Lentfer 					}
641825eb42bSJan Lentfer 				} else {
642825eb42bSJan Lentfer 					fprintf(stdout, "%s ", UNSIGNED);
643825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, dataset);
644825eb42bSJan Lentfer 				}
645825eb42bSJan Lentfer 				ldns_rr_list_deep_free(dataset);
646825eb42bSJan Lentfer 			} else {
647825eb42bSJan Lentfer 				status = ldns_verify_denial(p, name, t, &nsec_rrs, &nsec_rr_sigs);
648825eb42bSJan Lentfer 				if (status == LDNS_STATUS_OK) {
649825eb42bSJan Lentfer 					/* verify the nsec3 themselves*/
650825eb42bSJan Lentfer 					if (verbosity >= 5) {
651825eb42bSJan Lentfer 						printf("NSEC(3) Records to verify:\n");
652825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rrs);
653825eb42bSJan Lentfer 						printf("With signatures:\n");
654825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rr_sigs);
655825eb42bSJan Lentfer 						printf("correct keys:\n");
656825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, correct_key_list);
657825eb42bSJan Lentfer /*
658825eb42bSJan Lentfer 						printf("trusted keys at %p:\n", trusted_keys);
659825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, trusted_keys);
660825eb42bSJan Lentfer */					}
661825eb42bSJan Lentfer 
662825eb42bSJan Lentfer 					if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, trusted_keys, NULL)) == LDNS_STATUS_OK) {
663825eb42bSJan Lentfer 						fprintf(stdout, "%s ", TRUST);
664825eb42bSJan Lentfer 						fprintf(stdout, "Existence denied: ");
665825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
666825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
667825eb42bSJan Lentfer 							printf(" %s", descriptor->_name);
668825eb42bSJan Lentfer 						} else {
669825eb42bSJan Lentfer 							printf(" TYPE%u", t);
670825eb42bSJan Lentfer 						}
671825eb42bSJan Lentfer 						fprintf(stdout, "\n");
672825eb42bSJan Lentfer 					} else if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, correct_key_list, NULL)) == LDNS_STATUS_OK) {
673825eb42bSJan Lentfer 						fprintf(stdout, "%s ", SELF);
674825eb42bSJan Lentfer 						fprintf(stdout, "Existence denied: ");
675825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
676825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
677825eb42bSJan Lentfer 							printf(" %s", descriptor->_name);
678825eb42bSJan Lentfer 						} else {
679825eb42bSJan Lentfer 							printf(" TYPE%u", t);
680825eb42bSJan Lentfer 						}
681825eb42bSJan Lentfer 						fprintf(stdout, "\n");
682825eb42bSJan Lentfer 					} else {
683825eb42bSJan Lentfer 						result = 6;
684825eb42bSJan Lentfer 						fprintf(stdout, "%s ", BOGUS);
685825eb42bSJan Lentfer 						printf("Error verifying denial of existence for ");
686825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
687825eb42bSJan Lentfer 						printf(" type ");
688825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
689825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
690825eb42bSJan Lentfer 						} else {
691825eb42bSJan Lentfer 							printf("TYPE%u", t);
692825eb42bSJan Lentfer 						}
693825eb42bSJan Lentfer 						printf(": %s\n", ldns_get_errorstr_by_id(st));
694825eb42bSJan Lentfer 					}
695825eb42bSJan Lentfer 
696825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rrs);
697825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rr_sigs);
698825eb42bSJan Lentfer 				} else {
699825eb42bSJan Lentfer /*
700825eb42bSJan Lentfer */
701825eb42bSJan Lentfer 					if (status == LDNS_STATUS_CRYPTO_NO_RRSIG) {
702825eb42bSJan Lentfer 						printf("%s ", UNSIGNED);
703825eb42bSJan Lentfer 						printf("No data found for: ");
704825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
705825eb42bSJan Lentfer 						printf(" type ");
706825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
707825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
708825eb42bSJan Lentfer 						} else {
709825eb42bSJan Lentfer 							printf("TYPE%u", t);
710825eb42bSJan Lentfer 						}
711825eb42bSJan Lentfer 						printf("\n");
712825eb42bSJan Lentfer 					} else {
713825eb42bSJan Lentfer 						printf("[B] Unable to verify denial of existence for ");
714825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
715825eb42bSJan Lentfer 						printf(" type ");
716825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
717825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
718825eb42bSJan Lentfer 						} else {
719825eb42bSJan Lentfer 							printf("TYPE%u", t);
720825eb42bSJan Lentfer 						}
721825eb42bSJan Lentfer 						printf("\n");
722825eb42bSJan Lentfer 					}
723825eb42bSJan Lentfer 
724825eb42bSJan Lentfer 				}
725825eb42bSJan Lentfer 			}
726825eb42bSJan Lentfer 			ldns_pkt_free(p);
727825eb42bSJan Lentfer 		}
728825eb42bSJan Lentfer 
729825eb42bSJan Lentfer 		new_nss_aaaa = NULL;
730825eb42bSJan Lentfer 		new_nss_a = NULL;
731825eb42bSJan Lentfer 		new_nss = NULL;
732825eb42bSJan Lentfer 		ns_addr = NULL;
733825eb42bSJan Lentfer 		ldns_rr_list_deep_free(key_list);
734825eb42bSJan Lentfer 		key_list = NULL;
735825eb42bSJan Lentfer 		ldns_rr_list_deep_free(key_sig_list);
736825eb42bSJan Lentfer 		key_sig_list = NULL;
737825eb42bSJan Lentfer 		ds_list = NULL;
738825eb42bSJan Lentfer 		ldns_rr_list_deep_free(ds_sig_list);
739825eb42bSJan Lentfer 		ds_sig_list = NULL;
740825eb42bSJan Lentfer 	}
741825eb42bSJan Lentfer 	printf(";;" SELF " self sig OK; " BOGUS " bogus; " TRUST " trusted\n");
742825eb42bSJan Lentfer 	/* verbose mode?
743825eb42bSJan Lentfer 	printf("Trusted keys:\n");
744825eb42bSJan Lentfer 	ldns_rr_list_print(stdout, trusted_keys);
745825eb42bSJan Lentfer 	printf("trusted dss:\n");
746825eb42bSJan Lentfer 	ldns_rr_list_print(stdout, trusted_ds_rrs);
747825eb42bSJan Lentfer 	*/
748825eb42bSJan Lentfer 
749825eb42bSJan Lentfer 	done:
750825eb42bSJan Lentfer 	ldns_rr_list_deep_free(trusted_ds_rrs);
751825eb42bSJan Lentfer 	ldns_rr_list_deep_free(correct_key_list);
752825eb42bSJan Lentfer 	ldns_resolver_deep_free(res);
753825eb42bSJan Lentfer 	if (labels) {
754825eb42bSJan Lentfer 		for(i = 0 ; i < (ssize_t)labels_count + 2; i++) {
755825eb42bSJan Lentfer 			ldns_rdf_deep_free(labels[i]);
756825eb42bSJan Lentfer 		}
757825eb42bSJan Lentfer 		LDNS_FREE(labels);
758825eb42bSJan Lentfer 	}
759825eb42bSJan Lentfer 	return result;
760825eb42bSJan Lentfer }
761825eb42bSJan Lentfer #endif /* HAVE_SSL */
762