xref: /dflybsd-src/contrib/ldns/drill/securetrace.c (revision 7733acb50455a11cc2ee36edd926ff0fa3361e9a)
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 
655340022aSzrj static ldns_pkt *
get_dnssec_pkt(ldns_resolver * r,ldns_rdf * name,ldns_rr_type t)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
get_key(ldns_pkt * p,ldns_rdf * apexname,ldns_rr_list ** rrlist,ldns_rr_list ** opt_sig)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
get_ds(ldns_pkt * p,ldns_rdf * ownername,ldns_rr_list ** rrlist,ldns_rr_list ** opt_sig)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 
1005340022aSzrj static void
remove_resolver_nameservers(ldns_resolver * res)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 /*ldns_pkt **/
113825eb42bSJan Lentfer #ifdef HAVE_SSL
114825eb42bSJan Lentfer int
do_secure_trace(ldns_resolver * local_res,ldns_rdf * name,ldns_rr_type t,ldns_rr_class c,ldns_rr_list * trusted_keys,ldns_rdf * start_name)115825eb42bSJan Lentfer do_secure_trace(ldns_resolver *local_res, ldns_rdf *name, ldns_rr_type t,
116825eb42bSJan Lentfer                 ldns_rr_class c, ldns_rr_list *trusted_keys, ldns_rdf *start_name
117825eb42bSJan Lentfer                )
118825eb42bSJan Lentfer {
119825eb42bSJan Lentfer 	ldns_resolver *res;
120825eb42bSJan Lentfer 	ldns_pkt *p, *local_p;
121825eb42bSJan Lentfer 	ldns_rr_list *new_nss;
122825eb42bSJan Lentfer 	ldns_rr_list *ns_addr;
123825eb42bSJan Lentfer 	ldns_rdf *pop;
124825eb42bSJan Lentfer 	ldns_rdf **labels = NULL;
125825eb42bSJan Lentfer 	ldns_status status, st;
126825eb42bSJan Lentfer 	ssize_t i;
127825eb42bSJan Lentfer 	size_t j;
128825eb42bSJan Lentfer 	size_t k;
129825eb42bSJan Lentfer 	size_t l;
1305340022aSzrj 	uint8_t labels_count = 0;
131825eb42bSJan Lentfer 
132825eb42bSJan Lentfer 	/* dnssec */
133825eb42bSJan Lentfer 	ldns_rr_list *key_list;
134825eb42bSJan Lentfer 	ldns_rr_list *key_sig_list;
135825eb42bSJan Lentfer 	ldns_rr_list *ds_list;
136825eb42bSJan Lentfer 	ldns_rr_list *ds_sig_list;
137825eb42bSJan Lentfer 	ldns_rr_list *correct_key_list;
138825eb42bSJan Lentfer 	ldns_rr_list *trusted_ds_rrs;
139825eb42bSJan Lentfer 	bool new_keys_trusted = false;
140*ee791febSAntonio Huete Jimenez 	ldns_rr_list *current_correct_keys = NULL;
141825eb42bSJan Lentfer 	ldns_rr_list *dataset;
142825eb42bSJan Lentfer 
143825eb42bSJan Lentfer 	ldns_rr_list *nsec_rrs = NULL;
144825eb42bSJan Lentfer 	ldns_rr_list *nsec_rr_sigs = NULL;
145825eb42bSJan Lentfer 
146825eb42bSJan Lentfer 	/* empty non-terminal check */
147825eb42bSJan Lentfer 	bool ent;
1485340022aSzrj 	ldns_rr  *nsecrr;      /* The nsec that proofs the non-terminal */
1495340022aSzrj 	ldns_rdf *hashed_name; /* The query hashed with nsec3 params */
1505340022aSzrj 	ldns_rdf *label0;      /* The first label of an nsec3 owner name */
151825eb42bSJan Lentfer 
152825eb42bSJan Lentfer 	/* glue handling */
153825eb42bSJan Lentfer 	ldns_rr_list *new_ns_addr;
154825eb42bSJan Lentfer 	ldns_rr_list *old_ns_addr;
155825eb42bSJan Lentfer 	ldns_rr *ns_rr;
156825eb42bSJan Lentfer 
157825eb42bSJan Lentfer 	int result = 0;
158825eb42bSJan Lentfer 
159825eb42bSJan Lentfer 	/* printing niceness */
160825eb42bSJan Lentfer 	const ldns_rr_descriptor *descriptor;
161825eb42bSJan Lentfer 
162825eb42bSJan Lentfer 	descriptor = ldns_rr_descript(t);
163825eb42bSJan Lentfer 
164825eb42bSJan Lentfer 	new_nss = NULL;
165825eb42bSJan Lentfer 	ns_addr = NULL;
166825eb42bSJan Lentfer 	key_list = NULL;
167825eb42bSJan Lentfer 	ds_list = NULL;
168825eb42bSJan Lentfer 
169825eb42bSJan Lentfer 	p = NULL;
170825eb42bSJan Lentfer 	local_p = NULL;
171825eb42bSJan Lentfer 	res = ldns_resolver_new();
172825eb42bSJan Lentfer 	key_sig_list = NULL;
173825eb42bSJan Lentfer 	ds_sig_list = NULL;
174825eb42bSJan Lentfer 
175825eb42bSJan Lentfer 	if (!res) {
176825eb42bSJan Lentfer 		error("Memory allocation failed");
177825eb42bSJan Lentfer 		result = -1;
178825eb42bSJan Lentfer 		return result;
179825eb42bSJan Lentfer 	}
180825eb42bSJan Lentfer 
181825eb42bSJan Lentfer 	correct_key_list = ldns_rr_list_new();
182825eb42bSJan Lentfer 	if (!correct_key_list) {
183825eb42bSJan Lentfer 		error("Memory allocation failed");
184825eb42bSJan Lentfer 		result = -1;
185825eb42bSJan Lentfer 		return result;
186825eb42bSJan Lentfer 	}
187825eb42bSJan Lentfer 
188825eb42bSJan Lentfer 	trusted_ds_rrs = ldns_rr_list_new();
189825eb42bSJan Lentfer 	if (!trusted_ds_rrs) {
190825eb42bSJan Lentfer 		error("Memory allocation failed");
191825eb42bSJan Lentfer 		result = -1;
192825eb42bSJan Lentfer 		return result;
193825eb42bSJan Lentfer 	}
194ac996e71SJan Lentfer         /* Add all preset trusted DS signatures to the list of trusted DS RRs. */
195ac996e71SJan Lentfer         for (j = 0; j < ldns_rr_list_rr_count(trusted_keys); j++) {
196ac996e71SJan Lentfer             ldns_rr* one_rr = ldns_rr_list_rr(trusted_keys, j);
197ac996e71SJan Lentfer             if (ldns_rr_get_type(one_rr)  == LDNS_RR_TYPE_DS) {
198ac996e71SJan Lentfer                 ldns_rr_list_push_rr(trusted_ds_rrs, ldns_rr_clone(one_rr));
199ac996e71SJan Lentfer             }
200ac996e71SJan Lentfer         }
201825eb42bSJan Lentfer 
202825eb42bSJan Lentfer 	/* transfer some properties of local_res to res */
203825eb42bSJan Lentfer 	ldns_resolver_set_ip6(res,
204825eb42bSJan Lentfer 			ldns_resolver_ip6(local_res));
205825eb42bSJan Lentfer 	ldns_resolver_set_port(res,
206825eb42bSJan Lentfer 			ldns_resolver_port(local_res));
207825eb42bSJan Lentfer 	ldns_resolver_set_debug(res,
208825eb42bSJan Lentfer 			ldns_resolver_debug(local_res));
209825eb42bSJan Lentfer 	ldns_resolver_set_fail(res,
210825eb42bSJan Lentfer 			ldns_resolver_fail(local_res));
211825eb42bSJan Lentfer 	ldns_resolver_set_usevc(res,
212825eb42bSJan Lentfer 			ldns_resolver_usevc(local_res));
213825eb42bSJan Lentfer 	ldns_resolver_set_random(res,
214825eb42bSJan Lentfer 			ldns_resolver_random(local_res));
2155340022aSzrj 	ldns_resolver_set_source(res,
2165340022aSzrj 			ldns_resolver_source(local_res));
217825eb42bSJan Lentfer 	ldns_resolver_set_recursive(local_res, true);
218825eb42bSJan Lentfer 
219825eb42bSJan Lentfer 	ldns_resolver_set_recursive(res, false);
220825eb42bSJan Lentfer 	ldns_resolver_set_dnssec_cd(res, false);
221825eb42bSJan Lentfer 	ldns_resolver_set_dnssec(res, true);
222825eb42bSJan Lentfer 
223825eb42bSJan Lentfer 	/* setup the root nameserver in the new resolver */
224825eb42bSJan Lentfer 	status = ldns_resolver_push_nameserver_rr_list(res, global_dns_root);
225825eb42bSJan Lentfer 	if (status != LDNS_STATUS_OK) {
226825eb42bSJan Lentfer 		printf("ERRRRR: %s\n", ldns_get_errorstr_by_id(status));
227825eb42bSJan Lentfer 		ldns_rr_list_print(stdout, global_dns_root);
228d1b2b5caSJohn Marino 		result = status;
229d1b2b5caSJohn Marino 		goto done;
230825eb42bSJan Lentfer 	}
231825eb42bSJan Lentfer 	labels_count = ldns_dname_label_count(name);
232825eb42bSJan Lentfer 	if (start_name) {
233825eb42bSJan Lentfer 		if (ldns_dname_is_subdomain(name, start_name)) {
234825eb42bSJan Lentfer 			labels_count -= ldns_dname_label_count(start_name);
235825eb42bSJan Lentfer 		} else {
236825eb42bSJan Lentfer 			fprintf(stderr, "Error; ");
237825eb42bSJan Lentfer 			ldns_rdf_print(stderr, name);
238825eb42bSJan Lentfer 			fprintf(stderr, " is not a subdomain of ");
239825eb42bSJan Lentfer 			ldns_rdf_print(stderr, start_name);
240825eb42bSJan Lentfer 			fprintf(stderr, "\n");
241825eb42bSJan Lentfer 			goto done;
242825eb42bSJan Lentfer 		}
243825eb42bSJan Lentfer 	}
244819dec71SDaniel Fojt 	labels = LDNS_CALLOC(ldns_rdf*, labels_count + 2);
245825eb42bSJan Lentfer 	if (!labels) {
246825eb42bSJan Lentfer 		goto done;
247825eb42bSJan Lentfer 	}
248825eb42bSJan Lentfer 	labels[0] = ldns_dname_new_frm_str(LDNS_ROOT_LABEL_STR);
249825eb42bSJan Lentfer 	labels[1] = ldns_rdf_clone(name);
250825eb42bSJan Lentfer 	for(i = 2 ; i < (ssize_t)labels_count + 2; i++) {
251825eb42bSJan Lentfer 		labels[i] = ldns_dname_left_chop(labels[i - 1]);
252825eb42bSJan Lentfer 	}
253825eb42bSJan Lentfer 
254825eb42bSJan Lentfer 	/* get the nameserver for the label
255825eb42bSJan Lentfer 	 * ask: dnskey and ds for the label
256825eb42bSJan Lentfer 	 */
257825eb42bSJan Lentfer 	for(i = (ssize_t)labels_count + 1; i > 0; i--) {
258825eb42bSJan Lentfer 		status = ldns_resolver_send(&local_p, res, labels[i], LDNS_RR_TYPE_NS, c, 0);
259819dec71SDaniel Fojt 		if (status != LDNS_STATUS_OK) {
260819dec71SDaniel Fojt 			fprintf(stderr, "Error sending query: %s\n", ldns_get_errorstr_by_id(status));
261819dec71SDaniel Fojt 			result = status;
262819dec71SDaniel Fojt 			goto done;
263819dec71SDaniel Fojt 		}
264819dec71SDaniel Fojt 
265819dec71SDaniel Fojt 		/* TODO: handle status */
266825eb42bSJan Lentfer 
267825eb42bSJan Lentfer 		if (verbosity >= 5) {
268825eb42bSJan Lentfer 			ldns_pkt_print(stdout, local_p);
269825eb42bSJan Lentfer 		}
270825eb42bSJan Lentfer 
271825eb42bSJan Lentfer 		new_nss = ldns_pkt_rr_list_by_type(local_p,
272825eb42bSJan Lentfer 					LDNS_RR_TYPE_NS, LDNS_SECTION_ANSWER);
273825eb42bSJan Lentfer  		if (!new_nss) {
274825eb42bSJan Lentfer 			/* if it's a delegation, servers put them in the auth section */
275825eb42bSJan Lentfer 			new_nss = ldns_pkt_rr_list_by_type(local_p,
276825eb42bSJan Lentfer 					LDNS_RR_TYPE_NS, LDNS_SECTION_AUTHORITY);
277825eb42bSJan Lentfer 		}
278825eb42bSJan Lentfer 
279825eb42bSJan Lentfer 		/* if this is the final step there might not be nameserver records
280825eb42bSJan Lentfer 		   of course if the data is in the apex, there are, so cover both
281825eb42bSJan Lentfer 		   cases */
282825eb42bSJan Lentfer 		if (new_nss || i > 1) {
283825eb42bSJan Lentfer 			for(j = 0; j < ldns_rr_list_rr_count(new_nss); j++) {
284825eb42bSJan Lentfer 				ns_rr = ldns_rr_list_rr(new_nss, j);
285825eb42bSJan Lentfer 				pop = ldns_rr_rdf(ns_rr, 0);
286825eb42bSJan Lentfer 				if (!pop) {
287825eb42bSJan Lentfer 					printf("nopo\n");
288825eb42bSJan Lentfer 					break;
289825eb42bSJan Lentfer 				}
290825eb42bSJan Lentfer 				/* retrieve it's addresses */
291825eb42bSJan Lentfer 				/* trust glue? */
292825eb42bSJan Lentfer 				new_ns_addr = NULL;
293825eb42bSJan Lentfer 				if (ldns_dname_is_subdomain(pop, labels[i])) {
294825eb42bSJan Lentfer 					new_ns_addr = ldns_pkt_rr_list_by_name_and_type(local_p, pop, LDNS_RR_TYPE_A, LDNS_SECTION_ADDITIONAL);
295825eb42bSJan Lentfer 				}
296825eb42bSJan Lentfer 				if (!new_ns_addr || ldns_rr_list_rr_count(new_ns_addr) == 0) {
297825eb42bSJan Lentfer 					new_ns_addr = ldns_get_rr_list_addr_by_name(res, pop, c, 0);
298825eb42bSJan Lentfer 				}
299825eb42bSJan Lentfer 				if (!new_ns_addr || ldns_rr_list_rr_count(new_ns_addr) == 0) {
300825eb42bSJan Lentfer 					new_ns_addr = ldns_get_rr_list_addr_by_name(local_res, pop, c, 0);
301825eb42bSJan Lentfer 				}
302825eb42bSJan Lentfer 
303825eb42bSJan Lentfer 				if (new_ns_addr) {
304825eb42bSJan Lentfer 					old_ns_addr = ns_addr;
305825eb42bSJan Lentfer 					ns_addr = ldns_rr_list_cat_clone(ns_addr, new_ns_addr);
306825eb42bSJan Lentfer 					ldns_rr_list_deep_free(old_ns_addr);
307825eb42bSJan Lentfer 				}
308825eb42bSJan Lentfer 				ldns_rr_list_deep_free(new_ns_addr);
309825eb42bSJan Lentfer 			}
310825eb42bSJan Lentfer 			ldns_rr_list_deep_free(new_nss);
311825eb42bSJan Lentfer 
312825eb42bSJan Lentfer 			if (ns_addr) {
313825eb42bSJan Lentfer 				remove_resolver_nameservers(res);
314825eb42bSJan Lentfer 
315825eb42bSJan Lentfer 				if (ldns_resolver_push_nameserver_rr_list(res, ns_addr) !=
316825eb42bSJan Lentfer 						LDNS_STATUS_OK) {
317825eb42bSJan Lentfer 					error("Error adding new nameservers");
318825eb42bSJan Lentfer 					ldns_pkt_free(local_p);
319825eb42bSJan Lentfer 					goto done;
320825eb42bSJan Lentfer 				}
321825eb42bSJan Lentfer 				ldns_rr_list_deep_free(ns_addr);
322825eb42bSJan Lentfer 			} else {
323825eb42bSJan Lentfer 				status = ldns_verify_denial(local_p, labels[i], LDNS_RR_TYPE_NS, &nsec_rrs, &nsec_rr_sigs);
324825eb42bSJan Lentfer 
325825eb42bSJan Lentfer 				/* verify the nsec3 themselves*/
326825eb42bSJan Lentfer 				if (verbosity >= 4) {
327825eb42bSJan Lentfer 					printf("NSEC(3) Records to verify:\n");
328825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, nsec_rrs);
329825eb42bSJan Lentfer 					printf("With signatures:\n");
330825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, nsec_rr_sigs);
331825eb42bSJan Lentfer 					printf("correct keys:\n");
332825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, correct_key_list);
333825eb42bSJan Lentfer 				}
334825eb42bSJan Lentfer 
335825eb42bSJan Lentfer 				if (status == LDNS_STATUS_OK) {
336825eb42bSJan Lentfer 					if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, trusted_keys, NULL)) == LDNS_STATUS_OK) {
337825eb42bSJan Lentfer 						fprintf(stdout, "%s ", TRUST);
338825eb42bSJan Lentfer 						fprintf(stdout, "Existence denied: ");
339825eb42bSJan Lentfer 						ldns_rdf_print(stdout, labels[i]);
340825eb42bSJan Lentfer 	/*
341825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
342825eb42bSJan Lentfer 							printf(" %s", descriptor->_name);
343825eb42bSJan Lentfer 						} else {
344825eb42bSJan Lentfer 							printf(" TYPE%u", t);
345825eb42bSJan Lentfer 						}
346825eb42bSJan Lentfer 	*/					fprintf(stdout, " NS\n");
347825eb42bSJan Lentfer 					} else if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, correct_key_list, NULL)) == LDNS_STATUS_OK) {
348825eb42bSJan Lentfer 						fprintf(stdout, "%s ", SELF);
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 	*/
358825eb42bSJan Lentfer 						fprintf(stdout, " NS\n");
359825eb42bSJan Lentfer 					} else {
360825eb42bSJan Lentfer 						fprintf(stdout, "%s ", BOGUS);
361825eb42bSJan Lentfer 						result = 1;
362825eb42bSJan Lentfer 						printf(";; Error verifying denial of existence for name ");
363825eb42bSJan Lentfer 						ldns_rdf_print(stdout, labels[i]);
364825eb42bSJan Lentfer 	/*
365825eb42bSJan Lentfer 						printf(" type ");
366825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
367825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
368825eb42bSJan Lentfer 						} else {
369825eb42bSJan Lentfer 							printf("TYPE%u", t);
370825eb42bSJan Lentfer 						}
371825eb42bSJan Lentfer 	*/					printf("NS: %s\n", ldns_get_errorstr_by_id(st));
372825eb42bSJan Lentfer 					}
373825eb42bSJan Lentfer 				} else {
374825eb42bSJan Lentfer 					fprintf(stdout, "%s ", BOGUS);
375825eb42bSJan Lentfer 					result = 1;
376825eb42bSJan Lentfer 					printf(";; Error verifying denial of existence for name ");
377825eb42bSJan Lentfer 					ldns_rdf_print(stdout, labels[i]);
378825eb42bSJan Lentfer 					printf("NS: %s\n", ldns_get_errorstr_by_id(status));
379825eb42bSJan Lentfer 				}
380825eb42bSJan Lentfer 
381825eb42bSJan Lentfer 				/* there might be an empty non-terminal, in which case we need to continue */
382825eb42bSJan Lentfer 				ent = false;
383825eb42bSJan Lentfer 				for (j = 0; j < ldns_rr_list_rr_count(nsec_rrs); j++) {
3845340022aSzrj 					nsecrr = ldns_rr_list_rr(nsec_rrs, j);
3855340022aSzrj 					/* For NSEC when the next name is a subdomain of the question */
3865340022aSzrj 					if (ldns_rr_get_type(nsecrr) == LDNS_RR_TYPE_NSEC &&
3875340022aSzrj 							ldns_dname_is_subdomain(ldns_rr_rdf(nsecrr, 0), labels[i])) {
388825eb42bSJan Lentfer 						ent = true;
3895340022aSzrj 
3905340022aSzrj 					/* For NSEC3, the hash matches the name and the type bitmap is empty*/
3915340022aSzrj 					} else if (ldns_rr_get_type(nsecrr) == LDNS_RR_TYPE_NSEC3) {
3925340022aSzrj 						hashed_name = ldns_nsec3_hash_name_frm_nsec3(nsecrr, labels[i]);
3935340022aSzrj 						label0 = ldns_dname_label(ldns_rr_owner(nsecrr), 0);
3945340022aSzrj 						if (hashed_name && label0 &&
3955340022aSzrj 								ldns_dname_compare(hashed_name, label0) == 0 &&
3965340022aSzrj 								ldns_nsec3_bitmap(nsecrr) == NULL) {
3975340022aSzrj 							ent = true;
3985340022aSzrj 						}
3995340022aSzrj 						if (label0) {
4005340022aSzrj 							LDNS_FREE(label0);
4015340022aSzrj 						}
4025340022aSzrj 						if (hashed_name) {
4035340022aSzrj 							LDNS_FREE(hashed_name);
4045340022aSzrj 						}
405825eb42bSJan Lentfer 					}
406825eb42bSJan Lentfer 				}
407825eb42bSJan Lentfer 				if (!ent) {
408825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rrs);
409825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rr_sigs);
410825eb42bSJan Lentfer 					ldns_pkt_free(local_p);
411825eb42bSJan Lentfer 					goto done;
412825eb42bSJan Lentfer 				} else {
413825eb42bSJan Lentfer 					printf(";; There is an empty non-terminal here, continue\n");
414ac996e71SJan Lentfer 					continue;
415825eb42bSJan Lentfer 				}
416825eb42bSJan Lentfer 			}
417825eb42bSJan Lentfer 
418825eb42bSJan Lentfer 			if (ldns_resolver_nameserver_count(res) == 0) {
419825eb42bSJan Lentfer 				error("No nameservers found for this node");
420825eb42bSJan Lentfer 				goto done;
421825eb42bSJan Lentfer 			}
422825eb42bSJan Lentfer 		}
423825eb42bSJan Lentfer 		ldns_pkt_free(local_p);
424825eb42bSJan Lentfer 
425825eb42bSJan Lentfer 		fprintf(stdout, ";; Domain: ");
426825eb42bSJan Lentfer 		ldns_rdf_print(stdout, labels[i]);
427825eb42bSJan Lentfer 		fprintf(stdout, "\n");
428825eb42bSJan Lentfer 
429825eb42bSJan Lentfer 		/* retrieve keys for current domain, and verify them
430825eb42bSJan Lentfer 		   if they match an already trusted DS, or if one of the
431825eb42bSJan Lentfer 		   keys used to sign these is trusted, add the keys to
432825eb42bSJan Lentfer 		   the trusted list */
433825eb42bSJan Lentfer 		p = get_dnssec_pkt(res, labels[i], LDNS_RR_TYPE_DNSKEY);
434d1b2b5caSJohn Marino 		(void) get_key(p, labels[i], &key_list, &key_sig_list);
435825eb42bSJan Lentfer 		if (key_sig_list) {
436825eb42bSJan Lentfer 			if (key_list) {
437825eb42bSJan Lentfer 				current_correct_keys = ldns_rr_list_new();
438825eb42bSJan Lentfer 				if ((st = ldns_verify(key_list, key_sig_list, key_list, current_correct_keys)) ==
439825eb42bSJan Lentfer 						LDNS_STATUS_OK) {
440825eb42bSJan Lentfer 					/* add all signed keys (don't just add current_correct, you'd miss
441825eb42bSJan Lentfer 					 * the zsk's then */
442825eb42bSJan Lentfer 					for (j = 0; j < ldns_rr_list_rr_count(key_list); j++) {
443825eb42bSJan Lentfer 						ldns_rr_list_push_rr(correct_key_list, ldns_rr_clone(ldns_rr_list_rr(key_list, j)));
444825eb42bSJan Lentfer 					}
445825eb42bSJan Lentfer 
446825eb42bSJan Lentfer 					/* check whether these keys were signed
447825eb42bSJan Lentfer 					 * by a trusted keys. if so, these
448825eb42bSJan Lentfer 					 * keys are also trusted */
449825eb42bSJan Lentfer 					new_keys_trusted = false;
450825eb42bSJan Lentfer 					for (k = 0; k < ldns_rr_list_rr_count(current_correct_keys); k++) {
451825eb42bSJan Lentfer 						for (j = 0; j < ldns_rr_list_rr_count(trusted_ds_rrs); j++) {
452825eb42bSJan Lentfer 							if (ldns_rr_compare_ds(ldns_rr_list_rr(current_correct_keys, k),
453825eb42bSJan Lentfer 								    ldns_rr_list_rr(trusted_ds_rrs, j))) {
454825eb42bSJan Lentfer 								new_keys_trusted = true;
455825eb42bSJan Lentfer 							}
456825eb42bSJan Lentfer 						}
457825eb42bSJan Lentfer 					}
458825eb42bSJan Lentfer 
459825eb42bSJan Lentfer 					/* also all keys are trusted if one of the current correct keys is trusted */
460825eb42bSJan Lentfer 					for (k = 0; k < ldns_rr_list_rr_count(current_correct_keys); k++) {
461825eb42bSJan Lentfer 						for (j = 0; j < ldns_rr_list_rr_count(trusted_keys); j++) {
462825eb42bSJan Lentfer 							if (ldns_rr_compare(ldns_rr_list_rr(current_correct_keys, k),
463825eb42bSJan Lentfer 								            ldns_rr_list_rr(trusted_keys, j)) == 0) {
464825eb42bSJan Lentfer 								            new_keys_trusted = true;
465825eb42bSJan Lentfer 							}
466825eb42bSJan Lentfer 						}
467825eb42bSJan Lentfer 					}
468825eb42bSJan Lentfer 
469825eb42bSJan Lentfer 
470825eb42bSJan Lentfer 					if (new_keys_trusted) {
471825eb42bSJan Lentfer 						ldns_rr_list_push_rr_list(trusted_keys, key_list);
472825eb42bSJan Lentfer 						print_rr_list_abbr(stdout, key_list, TRUST);
473825eb42bSJan Lentfer 						ldns_rr_list_free(key_list);
474825eb42bSJan Lentfer 						key_list = NULL;
475825eb42bSJan Lentfer 					} else {
476825eb42bSJan Lentfer 						if (verbosity >= 2) {
477825eb42bSJan Lentfer 							printf(";; Signature ok but no chain to a trusted key or ds record\n");
478825eb42bSJan Lentfer 						}
479825eb42bSJan Lentfer 						print_rr_list_abbr(stdout, key_list, SELF);
480825eb42bSJan Lentfer 						ldns_rr_list_deep_free(key_list);
481825eb42bSJan Lentfer 						key_list = NULL;
482825eb42bSJan Lentfer 					}
483825eb42bSJan Lentfer 				} else {
484825eb42bSJan Lentfer 					print_rr_list_abbr(stdout, key_list, BOGUS);
485825eb42bSJan Lentfer 					result = 2;
486825eb42bSJan Lentfer 					ldns_rr_list_deep_free(key_list);
487825eb42bSJan Lentfer 					key_list = NULL;
488825eb42bSJan Lentfer 				}
489825eb42bSJan Lentfer 				ldns_rr_list_free(current_correct_keys);
490825eb42bSJan Lentfer 				current_correct_keys = NULL;
491825eb42bSJan Lentfer 			} else {
492825eb42bSJan Lentfer 				printf(";; No DNSKEY record found for ");
493825eb42bSJan Lentfer 				ldns_rdf_print(stdout, labels[i]);
494825eb42bSJan Lentfer 				printf("\n");
495825eb42bSJan Lentfer 			}
496825eb42bSJan Lentfer 		}
497825eb42bSJan Lentfer 
498825eb42bSJan Lentfer 		ldns_pkt_free(p);
499825eb42bSJan Lentfer 		ldns_rr_list_deep_free(key_sig_list);
500825eb42bSJan Lentfer 		key_sig_list = NULL;
501825eb42bSJan Lentfer 
502825eb42bSJan Lentfer 		/* check the DS records for the next child domain */
503825eb42bSJan Lentfer 		if (i > 1) {
504825eb42bSJan Lentfer 			p = get_dnssec_pkt(res, labels[i-1], LDNS_RR_TYPE_DS);
505d1b2b5caSJohn Marino 			(void) get_ds(p, labels[i-1], &ds_list, &ds_sig_list);
506825eb42bSJan Lentfer 			if (!ds_list) {
507825eb42bSJan Lentfer 				ldns_rr_list_deep_free(ds_sig_list);
508819dec71SDaniel Fojt 				(void) get_dnssec_rr( p, labels[i-1]
509819dec71SDaniel Fojt 				                    , LDNS_RR_TYPE_CNAME
510819dec71SDaniel Fojt 				                    , &ds_list, &ds_sig_list);
511819dec71SDaniel Fojt 				if (ds_list) {
512819dec71SDaniel Fojt 					st = ldns_verify( ds_list, ds_sig_list
513819dec71SDaniel Fojt 					                , correct_key_list
514819dec71SDaniel Fojt 					                , current_correct_keys);
515819dec71SDaniel Fojt 
516819dec71SDaniel Fojt 					if (st == LDNS_STATUS_OK) {
517819dec71SDaniel Fojt 						printf(";; No DS record found "
518819dec71SDaniel Fojt 						       "for ");
519819dec71SDaniel Fojt 						ldns_rdf_print(stdout,
520819dec71SDaniel Fojt 							labels[i-1]);
521819dec71SDaniel Fojt 						printf(", but valid CNAME");
522819dec71SDaniel Fojt 					} else {
523*ee791febSAntonio Huete Jimenez 						printf(BOGUS " Unable to verify "
524*ee791febSAntonio Huete Jimenez 						       "denial of existence for ");
525819dec71SDaniel Fojt 						ldns_rdf_print(stdout,
526819dec71SDaniel Fojt 							labels[i-1]);
527819dec71SDaniel Fojt 						printf(", because of BOGUS CNAME");
528825eb42bSJan Lentfer 					}
529819dec71SDaniel Fojt 					printf("\n");
530819dec71SDaniel Fojt 					ldns_rr_list_deep_free(ds_sig_list);
531819dec71SDaniel Fojt 					ldns_pkt_free(p);
532819dec71SDaniel Fojt 					ldns_rr_list_deep_free(ds_list);
533819dec71SDaniel Fojt 					ds_list = NULL;
534819dec71SDaniel Fojt 					ds_sig_list = NULL;
535819dec71SDaniel Fojt 					p = NULL;
536819dec71SDaniel Fojt 				} else {
537819dec71SDaniel Fojt 					ldns_rr_list_deep_free(ds_sig_list);
538819dec71SDaniel Fojt 					ldns_pkt_free(p);
539819dec71SDaniel Fojt 					p = get_dnssec_pkt(res, name,
540819dec71SDaniel Fojt 							LDNS_RR_TYPE_DNSKEY);
541819dec71SDaniel Fojt 					(void) get_ds(p, NULL
542819dec71SDaniel Fojt 					             , &ds_list, &ds_sig_list);
543819dec71SDaniel Fojt 				}
544825eb42bSJan Lentfer 			}
545825eb42bSJan Lentfer 			if (ds_sig_list) {
546825eb42bSJan Lentfer 				if (ds_list) {
547825eb42bSJan Lentfer 					if (verbosity >= 4) {
548825eb42bSJan Lentfer 						printf("VERIFYING:\n");
549825eb42bSJan Lentfer 						printf("DS LIST:\n");
550825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, ds_list);
551825eb42bSJan Lentfer 						printf("SIGS:\n");
552825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, ds_sig_list);
553825eb42bSJan Lentfer 						printf("KEYS:\n");
554825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, correct_key_list);
555825eb42bSJan Lentfer 					}
556825eb42bSJan Lentfer 
557825eb42bSJan Lentfer 					current_correct_keys = ldns_rr_list_new();
558825eb42bSJan Lentfer 
559825eb42bSJan Lentfer 					if ((st = ldns_verify(ds_list, ds_sig_list, correct_key_list, current_correct_keys)) ==
560825eb42bSJan Lentfer 							LDNS_STATUS_OK) {
561825eb42bSJan Lentfer 						/* if the ds is signed by a trusted key and a key from correct keys
562825eb42bSJan Lentfer 						   matches that ds, add that key to the trusted keys */
563825eb42bSJan Lentfer 						new_keys_trusted = false;
564825eb42bSJan Lentfer 						if (verbosity >= 2) {
565825eb42bSJan Lentfer 							printf("Checking if signing key is trusted:\n");
566825eb42bSJan Lentfer 						}
567825eb42bSJan Lentfer 						for (j = 0; j < ldns_rr_list_rr_count(current_correct_keys); j++) {
568825eb42bSJan Lentfer 							if (verbosity >= 2) {
569825eb42bSJan Lentfer 								printf("New key: ");
570825eb42bSJan Lentfer 								ldns_rr_print(stdout, ldns_rr_list_rr(current_correct_keys, j));
571825eb42bSJan Lentfer 							}
572825eb42bSJan Lentfer 							for (k = 0; k < ldns_rr_list_rr_count(trusted_keys); k++) {
573825eb42bSJan Lentfer 								if (verbosity >= 2) {
574825eb42bSJan Lentfer 									printf("\tTrusted key: ");
575825eb42bSJan Lentfer 									ldns_rr_print(stdout, ldns_rr_list_rr(trusted_keys, k));
576825eb42bSJan Lentfer 								}
577825eb42bSJan Lentfer 								if (ldns_rr_compare(ldns_rr_list_rr(current_correct_keys, j),
578825eb42bSJan Lentfer 								    ldns_rr_list_rr(trusted_keys, k)) == 0) {
579825eb42bSJan Lentfer 								    	if (verbosity >= 2) {
580825eb42bSJan Lentfer 								    		printf("Key is now trusted!\n");
581825eb42bSJan Lentfer 									}
582825eb42bSJan Lentfer 									for (l = 0; l < ldns_rr_list_rr_count(ds_list); l++) {
583825eb42bSJan Lentfer 										ldns_rr_list_push_rr(trusted_ds_rrs, ldns_rr_clone(ldns_rr_list_rr(ds_list, l)));
584825eb42bSJan Lentfer 										new_keys_trusted = true;
585825eb42bSJan Lentfer 									}
586825eb42bSJan Lentfer 								}
587825eb42bSJan Lentfer 							}
588825eb42bSJan Lentfer 						}
589825eb42bSJan Lentfer 						if (new_keys_trusted) {
590825eb42bSJan Lentfer 							print_rr_list_abbr(stdout, ds_list, TRUST);
591825eb42bSJan Lentfer 						} else {
592825eb42bSJan Lentfer 							print_rr_list_abbr(stdout, ds_list, SELF);
593825eb42bSJan Lentfer 						}
594825eb42bSJan Lentfer 					} else {
595825eb42bSJan Lentfer 						result = 3;
596825eb42bSJan Lentfer 						print_rr_list_abbr(stdout, ds_list, BOGUS);
597825eb42bSJan Lentfer 					}
598825eb42bSJan Lentfer 
599825eb42bSJan Lentfer 					ldns_rr_list_free(current_correct_keys);
600825eb42bSJan Lentfer 					current_correct_keys = NULL;
601825eb42bSJan Lentfer 				} else {
602825eb42bSJan Lentfer 					/* wait apparently there were no keys either, go back to the ds packet */
603825eb42bSJan Lentfer 					ldns_pkt_free(p);
604825eb42bSJan Lentfer 					ldns_rr_list_deep_free(ds_sig_list);
605825eb42bSJan Lentfer 					p = get_dnssec_pkt(res, labels[i-1], LDNS_RR_TYPE_DS);
606d1b2b5caSJohn Marino 					(void) get_ds(p, labels[i-1], &ds_list, &ds_sig_list);
607825eb42bSJan Lentfer 
608825eb42bSJan Lentfer 					status = ldns_verify_denial(p, labels[i-1], LDNS_RR_TYPE_DS, &nsec_rrs, &nsec_rr_sigs);
609825eb42bSJan Lentfer 
610825eb42bSJan Lentfer 					if (verbosity >= 4) {
611825eb42bSJan Lentfer 						printf("NSEC(3) Records to verify:\n");
612825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rrs);
613825eb42bSJan Lentfer 						printf("With signatures:\n");
614825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rr_sigs);
615825eb42bSJan Lentfer 						printf("correct keys:\n");
616825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, correct_key_list);
617825eb42bSJan Lentfer 					}
618825eb42bSJan Lentfer 
619825eb42bSJan Lentfer 					if (status == LDNS_STATUS_OK) {
620825eb42bSJan Lentfer 						if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, trusted_keys, NULL)) == LDNS_STATUS_OK) {
621825eb42bSJan Lentfer 							fprintf(stdout, "%s ", TRUST);
622825eb42bSJan Lentfer 							fprintf(stdout, "Existence denied: ");
623825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i-1]);
624825eb42bSJan Lentfer 							printf(" DS");
625825eb42bSJan Lentfer 							fprintf(stdout, "\n");
626825eb42bSJan Lentfer 						} else if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, correct_key_list, NULL)) == LDNS_STATUS_OK) {
627825eb42bSJan Lentfer 							fprintf(stdout, "%s ", SELF);
628825eb42bSJan Lentfer 							fprintf(stdout, "Existence denied: ");
629825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i-1]);
630825eb42bSJan Lentfer 							printf(" DS");
631825eb42bSJan Lentfer 							fprintf(stdout, "\n");
632825eb42bSJan Lentfer 						} else {
633825eb42bSJan Lentfer 							result = 4;
634825eb42bSJan Lentfer 							fprintf(stdout, "%s ", BOGUS);
635825eb42bSJan Lentfer 							printf("Error verifying denial of existence for ");
636825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i-1]);
637825eb42bSJan Lentfer 							printf(" DS");
638825eb42bSJan Lentfer 							printf(": %s\n", ldns_get_errorstr_by_id(st));
639825eb42bSJan Lentfer 						}
640825eb42bSJan Lentfer 
641825eb42bSJan Lentfer 
642825eb42bSJan Lentfer 					} else {
643825eb42bSJan Lentfer 						if (status == LDNS_STATUS_CRYPTO_NO_RRSIG) {
644825eb42bSJan Lentfer 							printf(";; No DS for ");
645825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i - 1]);
646825eb42bSJan Lentfer 						} else {
647*ee791febSAntonio Huete Jimenez 							printf(BOGUS " Unable to verify denial of existence for ");
648825eb42bSJan Lentfer 							ldns_rdf_print(stdout, labels[i - 1]);
649825eb42bSJan Lentfer 							printf(" DS: %s\n", ldns_get_errorstr_by_id(status));
650825eb42bSJan Lentfer 						}
651825eb42bSJan Lentfer 					}
652825eb42bSJan Lentfer 					if (verbosity >= 2) {
653825eb42bSJan Lentfer 						printf(";; No ds record for delegation\n");
654825eb42bSJan Lentfer 					}
655825eb42bSJan Lentfer 				}
656825eb42bSJan Lentfer 			}
657825eb42bSJan Lentfer 			ldns_rr_list_deep_free(ds_list);
658825eb42bSJan Lentfer 			ldns_pkt_free(p);
659825eb42bSJan Lentfer 		} else {
660825eb42bSJan Lentfer 			/* if this is the last label, just verify the data and stop */
661825eb42bSJan Lentfer 			p = get_dnssec_pkt(res, labels[i], t);
662d1b2b5caSJohn Marino 			(void) get_dnssec_rr(p, labels[i], t, &dataset, &key_sig_list);
663825eb42bSJan Lentfer 			if (dataset && ldns_rr_list_rr_count(dataset) > 0) {
664825eb42bSJan Lentfer 				if (key_sig_list && ldns_rr_list_rr_count(key_sig_list) > 0) {
665825eb42bSJan Lentfer 
666825eb42bSJan Lentfer 					/* If this is a wildcard, you must be able to deny exact match */
667825eb42bSJan Lentfer 					if ((st = ldns_verify(dataset, key_sig_list, trusted_keys, NULL)) == LDNS_STATUS_OK) {
668825eb42bSJan Lentfer 						fprintf(stdout, "%s ", TRUST);
669825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, dataset);
670825eb42bSJan Lentfer 					} else if ((st = ldns_verify(dataset, key_sig_list, correct_key_list, NULL)) == LDNS_STATUS_OK) {
671825eb42bSJan Lentfer 						fprintf(stdout, "%s ", SELF);
672825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, dataset);
673825eb42bSJan Lentfer 					} else {
674825eb42bSJan Lentfer 						result = 5;
675825eb42bSJan Lentfer 						fprintf(stdout, "%s ", BOGUS);
676825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, dataset);
677825eb42bSJan Lentfer 						printf(";; Error: %s\n", ldns_get_errorstr_by_id(st));
678825eb42bSJan Lentfer 					}
679825eb42bSJan Lentfer 				} else {
680825eb42bSJan Lentfer 					fprintf(stdout, "%s ", UNSIGNED);
681825eb42bSJan Lentfer 					ldns_rr_list_print(stdout, dataset);
682825eb42bSJan Lentfer 				}
683825eb42bSJan Lentfer 				ldns_rr_list_deep_free(dataset);
684825eb42bSJan Lentfer 			} else {
685825eb42bSJan Lentfer 				status = ldns_verify_denial(p, name, t, &nsec_rrs, &nsec_rr_sigs);
686825eb42bSJan Lentfer 				if (status == LDNS_STATUS_OK) {
687825eb42bSJan Lentfer 					/* verify the nsec3 themselves*/
688825eb42bSJan Lentfer 					if (verbosity >= 5) {
689825eb42bSJan Lentfer 						printf("NSEC(3) Records to verify:\n");
690825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rrs);
691825eb42bSJan Lentfer 						printf("With signatures:\n");
692825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, nsec_rr_sigs);
693825eb42bSJan Lentfer 						printf("correct keys:\n");
694825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, correct_key_list);
695825eb42bSJan Lentfer /*
696825eb42bSJan Lentfer 						printf("trusted keys at %p:\n", trusted_keys);
697825eb42bSJan Lentfer 						ldns_rr_list_print(stdout, trusted_keys);
698825eb42bSJan Lentfer */					}
699825eb42bSJan Lentfer 
700825eb42bSJan Lentfer 					if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, trusted_keys, NULL)) == LDNS_STATUS_OK) {
701825eb42bSJan Lentfer 						fprintf(stdout, "%s ", TRUST);
702825eb42bSJan Lentfer 						fprintf(stdout, "Existence denied: ");
703825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
704825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
705825eb42bSJan Lentfer 							printf(" %s", descriptor->_name);
706825eb42bSJan Lentfer 						} else {
707825eb42bSJan Lentfer 							printf(" TYPE%u", t);
708825eb42bSJan Lentfer 						}
709825eb42bSJan Lentfer 						fprintf(stdout, "\n");
710825eb42bSJan Lentfer 					} else if ((st = ldns_verify(nsec_rrs, nsec_rr_sigs, correct_key_list, NULL)) == LDNS_STATUS_OK) {
711825eb42bSJan Lentfer 						fprintf(stdout, "%s ", SELF);
712825eb42bSJan Lentfer 						fprintf(stdout, "Existence denied: ");
713825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
714825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
715825eb42bSJan Lentfer 							printf(" %s", descriptor->_name);
716825eb42bSJan Lentfer 						} else {
717825eb42bSJan Lentfer 							printf(" TYPE%u", t);
718825eb42bSJan Lentfer 						}
719825eb42bSJan Lentfer 						fprintf(stdout, "\n");
720825eb42bSJan Lentfer 					} else {
721825eb42bSJan Lentfer 						result = 6;
722825eb42bSJan Lentfer 						fprintf(stdout, "%s ", BOGUS);
723825eb42bSJan Lentfer 						printf("Error verifying denial of existence for ");
724825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
725825eb42bSJan Lentfer 						printf(" type ");
726825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
727825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
728825eb42bSJan Lentfer 						} else {
729825eb42bSJan Lentfer 							printf("TYPE%u", t);
730825eb42bSJan Lentfer 						}
731825eb42bSJan Lentfer 						printf(": %s\n", ldns_get_errorstr_by_id(st));
732825eb42bSJan Lentfer 					}
733825eb42bSJan Lentfer 
734825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rrs);
735825eb42bSJan Lentfer 					ldns_rr_list_deep_free(nsec_rr_sigs);
736825eb42bSJan Lentfer 				} else {
737825eb42bSJan Lentfer /*
738825eb42bSJan Lentfer */
739825eb42bSJan Lentfer 					if (status == LDNS_STATUS_CRYPTO_NO_RRSIG) {
740825eb42bSJan Lentfer 						printf("%s ", UNSIGNED);
741825eb42bSJan Lentfer 						printf("No data found for: ");
742825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
743825eb42bSJan Lentfer 						printf(" type ");
744825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
745825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
746825eb42bSJan Lentfer 						} else {
747825eb42bSJan Lentfer 							printf("TYPE%u", t);
748825eb42bSJan Lentfer 						}
749825eb42bSJan Lentfer 						printf("\n");
750825eb42bSJan Lentfer 					} else {
751*ee791febSAntonio Huete Jimenez 						printf(BOGUS " Unable to verify denial of existence for ");
752825eb42bSJan Lentfer 						ldns_rdf_print(stdout, name);
753825eb42bSJan Lentfer 						printf(" type ");
754825eb42bSJan Lentfer 						if (descriptor && descriptor->_name) {
755825eb42bSJan Lentfer 							printf("%s", descriptor->_name);
756825eb42bSJan Lentfer 						} else {
757825eb42bSJan Lentfer 							printf("TYPE%u", t);
758825eb42bSJan Lentfer 						}
759825eb42bSJan Lentfer 						printf("\n");
760825eb42bSJan Lentfer 					}
761825eb42bSJan Lentfer 
762825eb42bSJan Lentfer 				}
763825eb42bSJan Lentfer 			}
764825eb42bSJan Lentfer 			ldns_pkt_free(p);
765825eb42bSJan Lentfer 		}
766825eb42bSJan Lentfer 
767825eb42bSJan Lentfer 		new_nss = NULL;
768825eb42bSJan Lentfer 		ns_addr = NULL;
769825eb42bSJan Lentfer 		ldns_rr_list_deep_free(key_list);
770825eb42bSJan Lentfer 		key_list = NULL;
771825eb42bSJan Lentfer 		ldns_rr_list_deep_free(key_sig_list);
772825eb42bSJan Lentfer 		key_sig_list = NULL;
773825eb42bSJan Lentfer 		ds_list = NULL;
774825eb42bSJan Lentfer 		ldns_rr_list_deep_free(ds_sig_list);
775825eb42bSJan Lentfer 		ds_sig_list = NULL;
776825eb42bSJan Lentfer 	}
777*ee791febSAntonio Huete Jimenez 	printf(";;" SELF " self sig OK; " BOGUS " bogus; " TRUST " trusted; " UNSIGNED " unsigned\n");
778825eb42bSJan Lentfer 	/* verbose mode?
779825eb42bSJan Lentfer 	printf("Trusted keys:\n");
780825eb42bSJan Lentfer 	ldns_rr_list_print(stdout, trusted_keys);
781825eb42bSJan Lentfer 	printf("trusted dss:\n");
782825eb42bSJan Lentfer 	ldns_rr_list_print(stdout, trusted_ds_rrs);
783825eb42bSJan Lentfer 	*/
784825eb42bSJan Lentfer 
785825eb42bSJan Lentfer 	done:
786825eb42bSJan Lentfer 	ldns_rr_list_deep_free(trusted_ds_rrs);
787825eb42bSJan Lentfer 	ldns_rr_list_deep_free(correct_key_list);
788825eb42bSJan Lentfer 	ldns_resolver_deep_free(res);
789825eb42bSJan Lentfer 	if (labels) {
790825eb42bSJan Lentfer 		for(i = 0 ; i < (ssize_t)labels_count + 2; i++) {
791825eb42bSJan Lentfer 			ldns_rdf_deep_free(labels[i]);
792825eb42bSJan Lentfer 		}
793825eb42bSJan Lentfer 		LDNS_FREE(labels);
794825eb42bSJan Lentfer 	}
795825eb42bSJan Lentfer 	return result;
796825eb42bSJan Lentfer }
797825eb42bSJan Lentfer #endif /* HAVE_SSL */
798