xref: /freebsd/contrib/unbound/smallapp/unbound-anchor.c (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1 /*
2  * unbound-anchor.c - update the root anchor if necessary.
3  *
4  * Copyright (c) 2010, NLnet Labs. All rights reserved.
5  *
6  * This software is open source.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  *
19  * Neither the name of the NLNET LABS nor the names of its contributors may
20  * be used to endorse or promote products derived from this software without
21  * specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 /**
37  * \file
38  *
39  * This file checks to see that the current 5011 keys work to prime the
40  * current root anchor.  If not a certificate is used to update the anchor,
41  * with RFC7958 https xml fetch.
42  *
43  * This is a concept solution for distribution of the DNSSEC root
44  * trust anchor.  It is a small tool, called "unbound-anchor", that
45  * runs before the main validator starts.  I.e. in the init script:
46  * unbound-anchor; unbound.  Thus it is meant to run at system boot time.
47  *
48  * Management-Abstract:
49  *    * first run: fill root.key file with hardcoded DS record.
50  *    * mostly: use RFC5011 tracking, quick . DNSKEY UDP query.
51  *    * failover: use RFC7958 builtin certificate, do https and update.
52  * Special considerations:
53  *    * 30-days RFC5011 timer saves a lot of https traffic.
54  *    * DNSKEY probe must be NOERROR, saves a lot of https traffic.
55  *    * fail if clock before sign date of the root, if cert expired.
56  *    * if the root goes back to unsigned, deals with it.
57  *
58  * It has hardcoded the root DS anchors and the ICANN CA root certificate.
59  * It allows with options to override those.  It also takes root-hints (it
60  * has to do a DNS resolve), and also has hardcoded defaults for those.
61  *
62  * Once it starts, just before the validator starts, it quickly checks if
63  * the root anchor file needs to be updated.  First it tries to use
64  * RFC5011-tracking of the root key.  If that fails (and for 30-days since
65  * last successful probe), then it attempts to update using the
66  * certificate.  So most of the time, the RFC5011 tracking will work fine,
67  * and within a couple milliseconds, the main daemon can start.  It will
68  * have only probed the . DNSKEY, not done expensive https transfers on the
69  * root infrastructure.
70  *
71  * If there is no root key in the root.key file, it bootstraps the
72  * RFC5011-tracking with its builtin DS anchors; if that fails it
73  * bootstraps the RFC5011-tracking using the certificate.  (again to avoid
74  * https, and it is also faster).
75  *
76  * It uses the XML file by converting it to DS records and writing that to the
77  * key file.  Unbound can detect that the 'special comments' are gone, and
78  * the file contains a list of normal DNSKEY/DS records, and uses that to
79  * bootstrap 5011 (the KSK is made VALID).
80  *
81  * The certificate RFC7958 update is done by fetching root-anchors.xml and
82  * root-anchors.p7s via SSL.  The HTTPS certificate can be logged but is
83  * not validated (https for channel security; the security comes from the
84  * certificate).  The 'data.iana.org' domain name A and AAAA are resolved
85  * without DNSSEC.  It tries a random IP until the transfer succeeds.  It
86  * then checks the p7s signature.
87  *
88  * On any failure, it leaves the root key file untouched.  The main
89  * validator has to cope with it, it cannot fix things (So a failure does
90  * not go 'without DNSSEC', no downgrade).  If it used its builtin stuff or
91  * did the https, it exits with an exit code, so that this can trigger the
92  * init script to log the event and potentially alert the operator that can
93  * do a manual check.
94  *
95  * The date is also checked.  Before 2010-07-15 is a failure (root not
96  * signed yet; avoids attacks on system clock).  The
97  * last-successful-RFC5011-probe (if available) has to be more than 30 days
98  * in the past (otherwise, RFC5011 should have worked).  This keeps
99  * unnecessary https traffic down.  If the main certificate is expired, it
100  * fails.
101  *
102  * The dates on the keys in the xml are checked (uses the libexpat xml
103  * parser), only the valid ones are used to re-enstate RFC5011 tracking.
104  * If 0 keys are valid, the zone has gone to insecure (a special marker is
105  * written in the keyfile that tells the main validator daemon the zone is
106  * insecure).
107  *
108  * Only the root ICANN CA is shipped, not the intermediate ones.  The
109  * intermediate CAs are included in the p7s file that was downloaded.  (the
110  * root cert is valid to 2028 and the intermediate to 2014, today).
111  *
112  * Obviously, the tool also has options so the operator can provide a new
113  * keyfile, a new certificate and new URLs, and fresh root hints.  By
114  * default it logs nothing on failure and success; it 'just works'.
115  *
116  */
117 
118 #include "config.h"
119 #include "libunbound/unbound.h"
120 #include "sldns/rrdef.h"
121 #include "sldns/parseutil.h"
122 #include <expat.h>
123 #ifndef HAVE_EXPAT_H
124 #error "need libexpat to parse root-anchors.xml file."
125 #endif
126 #ifdef HAVE_GETOPT_H
127 #include <getopt.h>
128 #endif
129 #ifdef HAVE_OPENSSL_SSL_H
130 #include <openssl/ssl.h>
131 #endif
132 #ifdef HAVE_OPENSSL_ERR_H
133 #include <openssl/err.h>
134 #endif
135 #ifdef HAVE_OPENSSL_RAND_H
136 #include <openssl/rand.h>
137 #endif
138 #include <openssl/x509.h>
139 #include <openssl/x509v3.h>
140 #include <openssl/pem.h>
141 
142 /** name of server in URL to fetch HTTPS from */
143 #define URLNAME "data.iana.org"
144 /** path on HTTPS server to xml file */
145 #define XMLNAME "root-anchors/root-anchors.xml"
146 /** path on HTTPS server to p7s file */
147 #define P7SNAME "root-anchors/root-anchors.p7s"
148 /** name of the signer of the certificate */
149 #define P7SIGNER "dnssec@iana.org"
150 /** port number for https access */
151 #define HTTPS_PORT 443
152 
153 #ifdef USE_WINSOCK
154 /* sneakily reuse the the wsa_strerror function, on windows */
155 char* wsa_strerror(int err);
156 #endif
157 
158 static const char ICANN_UPDATE_CA[] =
159 	/* The ICANN CA fetched at 24 Sep 2010.  Valid to 2028 */
160 	"-----BEGIN CERTIFICATE-----\n"
161 	"MIIDdzCCAl+gAwIBAgIBATANBgkqhkiG9w0BAQsFADBdMQ4wDAYDVQQKEwVJQ0FO\n"
162 	"TjEmMCQGA1UECxMdSUNBTk4gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNV\n"
163 	"BAMTDUlDQU5OIFJvb3QgQ0ExCzAJBgNVBAYTAlVTMB4XDTA5MTIyMzA0MTkxMloX\n"
164 	"DTI5MTIxODA0MTkxMlowXTEOMAwGA1UEChMFSUNBTk4xJjAkBgNVBAsTHUlDQU5O\n"
165 	"IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1JQ0FOTiBSb290IENB\n"
166 	"MQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKDb\n"
167 	"cLhPNNqc1NB+u+oVvOnJESofYS9qub0/PXagmgr37pNublVThIzyLPGCJ8gPms9S\n"
168 	"G1TaKNIsMI7d+5IgMy3WyPEOECGIcfqEIktdR1YWfJufXcMReZwU4v/AdKzdOdfg\n"
169 	"ONiwc6r70duEr1IiqPbVm5T05l1e6D+HkAvHGnf1LtOPGs4CHQdpIUcy2kauAEy2\n"
170 	"paKcOcHASvbTHK7TbbvHGPB+7faAztABLoneErruEcumetcNfPMIjXKdv1V1E3C7\n"
171 	"MSJKy+jAqqQJqjZoQGB0necZgUMiUv7JK1IPQRM2CXJllcyJrm9WFxY0c1KjBO29\n"
172 	"iIKK69fcglKcBuFShUECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\n"
173 	"Af8EBAMCAf4wHQYDVR0OBBYEFLpS6UmDJIZSL8eZzfyNa2kITcBQMA0GCSqGSIb3\n"
174 	"DQEBCwUAA4IBAQAP8emCogqHny2UYFqywEuhLys7R9UKmYY4suzGO4nkbgfPFMfH\n"
175 	"6M+Zj6owwxlwueZt1j/IaCayoKU3QsrYYoDRolpILh+FPwx7wseUEV8ZKpWsoDoD\n"
176 	"2JFbLg2cfB8u/OlE4RYmcxxFSmXBg0yQ8/IoQt/bxOcEEhhiQ168H2yE5rxJMt9h\n"
177 	"15nu5JBSewrCkYqYYmaxyOC3WrVGfHZxVI7MpIFcGdvSb2a1uyuua8l0BKgk3ujF\n"
178 	"0/wsHNeP22qNyVO+XVBzrM8fk8BSUFuiT/6tZTYXRtEt5aKQZgXbKU5dUF3jT9qg\n"
179 	"j/Br5BZw3X/zd325TvnswzMC1+ljLzHnQGGk\n"
180 	"-----END CERTIFICATE-----\n";
181 
182 static const char DS_TRUST_ANCHOR[] =
183 	/* The anchors must start on a new line with ". IN DS and end with \n"[;]
184 	 * because the makedist script greps on the source here */
185 	/* anchor 20326 is from 2017 */
186 ". IN DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D\n";
187 
188 /** verbosity for this application */
189 static int verb = 0;
190 
191 /** list of IP addresses */
192 struct ip_list {
193 	/** next in list */
194 	struct ip_list* next;
195 	/** length of addr */
196 	socklen_t len;
197 	/** address ready to connect to */
198 	struct sockaddr_storage addr;
199 	/** has the address been used */
200 	int used;
201 };
202 
203 /** Give unbound-anchor usage, and exit (1). */
204 static void
205 usage(void)
206 {
207 	printf("Usage:	local-unbound-anchor [opts]\n");
208 	printf("	Setup or update root anchor. "
209 		"Most options have defaults.\n");
210 	printf("	Run this program before you start the validator.\n");
211 	printf("\n");
212 	printf("	The anchor and cert have default builtin content\n");
213 	printf("	if the file does not exist or is empty.\n");
214 	printf("\n");
215 	printf("-a file		root key file, default %s\n", ROOT_ANCHOR_FILE);
216 	printf("		The key is input and output for this tool.\n");
217 	printf("-c file		cert file, default %s\n", ROOT_CERT_FILE);
218 	printf("-l		list builtin key and cert on stdout\n");
219 	printf("-u name		server in https url, default %s\n", URLNAME);
220 	printf("-S		do not use SNI for the https connection\n");
221 	printf("-x path		pathname to xml in url, default %s\n", XMLNAME);
222 	printf("-s path		pathname to p7s in url, default %s\n", P7SNAME);
223 	printf("-n name		signer's subject emailAddress, default %s\n", P7SIGNER);
224 	printf("-b address	source address to bind to\n");
225 	printf("-4		work using IPv4 only\n");
226 	printf("-6		work using IPv6 only\n");
227 	printf("-f resolv.conf	use given resolv.conf\n");
228 	printf("-r root.hints	use given root.hints\n"
229 		"		builtin root hints are used by default\n");
230 	printf("-R		fallback from -f to root query on error\n");
231 	printf("-v		more verbose\n");
232 	printf("-C conf		debug, read config\n");
233 	printf("-P port		use port for https connect, default 443\n");
234 	printf("-F 		debug, force update with cert\n");
235 	printf("-h		show this usage help\n");
236 	printf("Version %s\n", PACKAGE_VERSION);
237 	printf("BSD licensed, see LICENSE in source package for details.\n");
238 	printf("Report bugs to %s\n", PACKAGE_BUGREPORT);
239 	exit(1);
240 }
241 
242 /** return the built in root update certificate */
243 static const char*
244 get_builtin_cert(void)
245 {
246 	return ICANN_UPDATE_CA;
247 }
248 
249 /** return the built in root DS trust anchor */
250 static const char*
251 get_builtin_ds(void)
252 {
253 	return DS_TRUST_ANCHOR;
254 }
255 
256 /** print hex data */
257 static void
258 print_data(const char* msg, const char* data, size_t len)
259 {
260 	size_t i;
261 	printf("%s: ", msg);
262 	for(i=0; i<len; i++) {
263 		printf(" %2.2x", (unsigned char)data[i]);
264 	}
265 	printf("\n");
266 }
267 
268 /** print ub context creation error and exit */
269 static void
270 ub_ctx_error_exit(struct ub_ctx* ctx, const char* str, const char* str2)
271 {
272 	ub_ctx_delete(ctx);
273 	if(str && str2 && verb) printf("%s: %s\n", str, str2);
274 	if(verb) printf("error: could not create unbound resolver context\n");
275 	exit(0);
276 }
277 
278 /**
279  * Create a new unbound context with the commandline settings applied
280  */
281 static struct ub_ctx*
282 create_unbound_context(const char* res_conf, const char* root_hints,
283 	const char* debugconf, const char* srcaddr, int ip4only, int ip6only)
284 {
285 	int r;
286 	struct ub_ctx* ctx = ub_ctx_create();
287 	if(!ctx) {
288 		if(verb) printf("out of memory\n");
289 		exit(0);
290 	}
291 	/* do not waste time and network traffic to fetch extra nameservers */
292 	r = ub_ctx_set_option(ctx, "target-fetch-policy:", "0 0 0 0 0");
293 	if(r && verb) printf("ctx targetfetchpolicy: %s\n", ub_strerror(r));
294 	/* read config file first, so its settings can be overridden */
295 	if(debugconf) {
296 		r = ub_ctx_config(ctx, debugconf);
297 		if(r) ub_ctx_error_exit(ctx, debugconf, ub_strerror(r));
298 	}
299 	if(res_conf) {
300 		r = ub_ctx_resolvconf(ctx, res_conf);
301 		if(r) ub_ctx_error_exit(ctx, res_conf, ub_strerror(r));
302 	}
303 	if(root_hints) {
304 		r = ub_ctx_set_option(ctx, "root-hints:", root_hints);
305 		if(r) ub_ctx_error_exit(ctx, root_hints, ub_strerror(r));
306 	}
307 	if(srcaddr) {
308 		r = ub_ctx_set_option(ctx, "outgoing-interface:", srcaddr);
309 		if(r) ub_ctx_error_exit(ctx, srcaddr, ub_strerror(r));
310 	}
311 	if(ip4only) {
312 		r = ub_ctx_set_option(ctx, "do-ip6:", "no");
313 		if(r) ub_ctx_error_exit(ctx, "ip4only", ub_strerror(r));
314 	}
315 	if(ip6only) {
316 		r = ub_ctx_set_option(ctx, "do-ip4:", "no");
317 		if(r) ub_ctx_error_exit(ctx, "ip6only", ub_strerror(r));
318 	}
319 	return ctx;
320 }
321 
322 /** printout certificate in detail */
323 static void
324 verb_cert(const char* msg, X509* x)
325 {
326 	if(verb == 0 || verb == 1) return;
327 	if(verb == 2) {
328 		if(msg) printf("%s\n", msg);
329 		X509_print_ex_fp(stdout, x, 0, (unsigned long)-1
330 			^(X509_FLAG_NO_SUBJECT
331 			|X509_FLAG_NO_ISSUER|X509_FLAG_NO_VALIDITY));
332 		return;
333 	}
334 	if(msg) printf("%s\n", msg);
335 	X509_print_fp(stdout, x);
336 }
337 
338 /** printout certificates in detail */
339 static void
340 verb_certs(const char* msg, STACK_OF(X509)* sk)
341 {
342 	int i, num = sk_X509_num(sk);
343 	if(verb == 0 || verb == 1) return;
344 	for(i=0; i<num; i++) {
345 		printf("%s (%d/%d)\n", msg, i, num);
346 		verb_cert(NULL, sk_X509_value(sk, i));
347 	}
348 }
349 
350 /** read certificates from a PEM bio */
351 static STACK_OF(X509)*
352 read_cert_bio(BIO* bio)
353 {
354 	STACK_OF(X509) *sk = sk_X509_new_null();
355 	if(!sk) {
356 		if(verb) printf("out of memory\n");
357 		exit(0);
358 	}
359 	while(!BIO_eof(bio)) {
360 		X509* x = PEM_read_bio_X509(bio, NULL, NULL, NULL);
361 		if(x == NULL) {
362 			if(verb) {
363 				printf("failed to read X509\n");
364 			 	ERR_print_errors_fp(stdout);
365 			}
366 			continue;
367 		}
368 		if(!sk_X509_push(sk, x)) {
369 			if(verb) printf("out of memory\n");
370 			exit(0);
371 		}
372 	}
373 	return sk;
374 }
375 
376 /* read the certificate file */
377 static STACK_OF(X509)*
378 read_cert_file(const char* file)
379 {
380 	STACK_OF(X509)* sk;
381 	FILE* in;
382 	int content = 0;
383 	char buf[128];
384 	if(file == NULL || strcmp(file, "") == 0) {
385 		return NULL;
386 	}
387 	sk = sk_X509_new_null();
388 	if(!sk) {
389 		if(verb) printf("out of memory\n");
390 		exit(0);
391 	}
392 	in = fopen(file, "r");
393 	if(!in) {
394 		if(verb) printf("%s: %s\n", file, strerror(errno));
395 #ifndef S_SPLINT_S
396 		sk_X509_pop_free(sk, X509_free);
397 #endif
398 		return NULL;
399 	}
400 	while(!feof(in)) {
401 		X509* x = PEM_read_X509(in, NULL, NULL, NULL);
402 		if(x == NULL) {
403 			if(verb) {
404 				printf("failed to read X509 file\n");
405 			 	ERR_print_errors_fp(stdout);
406 			}
407 			continue;
408 		}
409 		if(!sk_X509_push(sk, x)) {
410 			if(verb) printf("out of memory\n");
411 			fclose(in);
412 			exit(0);
413 		}
414 		content = 1;
415 		/* read away newline after --END CERT-- */
416 		if(!fgets(buf, (int)sizeof(buf), in))
417 			break;
418 	}
419 	fclose(in);
420 	if(!content) {
421 		if(verb) printf("%s is empty\n", file);
422 #ifndef S_SPLINT_S
423 		sk_X509_pop_free(sk, X509_free);
424 #endif
425 		return NULL;
426 	}
427 	return sk;
428 }
429 
430 /** read certificates from the builtin certificate */
431 static STACK_OF(X509)*
432 read_builtin_cert(void)
433 {
434 	const char* builtin_cert = get_builtin_cert();
435 	STACK_OF(X509)* sk;
436 	BIO *bio = BIO_new_mem_buf(builtin_cert,
437 		(int)strlen(builtin_cert));
438 	if(!bio) {
439 		if(verb) printf("out of memory\n");
440 		exit(0);
441 	}
442 	sk = read_cert_bio(bio);
443 	if(!sk) {
444 		if(verb) printf("internal error, out of memory\n");
445 		exit(0);
446 	}
447 	BIO_free(bio);
448 	return sk;
449 }
450 
451 /** read update cert file or use builtin */
452 static STACK_OF(X509)*
453 read_cert_or_builtin(const char* file)
454 {
455 	STACK_OF(X509) *sk = read_cert_file(file);
456 	if(!sk) {
457 		if(verb) printf("using builtin certificate\n");
458 		sk = read_builtin_cert();
459 	}
460 	if(verb) printf("have %d trusted certificates\n", sk_X509_num(sk));
461 	verb_certs("trusted certificates", sk);
462 	return sk;
463 }
464 
465 static void
466 do_list_builtin(void)
467 {
468 	const char* builtin_cert = get_builtin_cert();
469 	const char* builtin_ds = get_builtin_ds();
470 	printf("%s\n", builtin_ds);
471 	printf("%s\n", builtin_cert);
472 	exit(0);
473 }
474 
475 /** printout IP address with message */
476 static void
477 verb_addr(const char* msg, struct ip_list* ip)
478 {
479 	if(verb) {
480 		char out[100];
481 		void* a = &((struct sockaddr_in*)&ip->addr)->sin_addr;
482 		if(ip->len != (socklen_t)sizeof(struct sockaddr_in))
483 			a = &((struct sockaddr_in6*)&ip->addr)->sin6_addr;
484 
485 		if(inet_ntop((int)((struct sockaddr_in*)&ip->addr)->sin_family,
486 			a, out, (socklen_t)sizeof(out))==0)
487 			printf("%s (inet_ntop error)\n", msg);
488 		else printf("%s %s\n", msg, out);
489 	}
490 }
491 
492 /** free ip_list */
493 static void
494 ip_list_free(struct ip_list* p)
495 {
496 	struct ip_list* np;
497 	while(p) {
498 		np = p->next;
499 		free(p);
500 		p = np;
501 	}
502 }
503 
504 /** create ip_list entry for a RR record */
505 static struct ip_list*
506 RR_to_ip(int tp, char* data, int len, int port)
507 {
508 	struct ip_list* ip = (struct ip_list*)calloc(1, sizeof(*ip));
509 	uint16_t p = (uint16_t)port;
510 	if(tp == LDNS_RR_TYPE_A) {
511 		struct sockaddr_in* sa = (struct sockaddr_in*)&ip->addr;
512 		ip->len = (socklen_t)sizeof(*sa);
513 		sa->sin_family = AF_INET;
514 		sa->sin_port = (in_port_t)htons(p);
515 		if(len != (int)sizeof(sa->sin_addr)) {
516 			if(verb) printf("skipped badly formatted A\n");
517 			free(ip);
518 			return NULL;
519 		}
520 		memmove(&sa->sin_addr, data, sizeof(sa->sin_addr));
521 
522 	} else if(tp == LDNS_RR_TYPE_AAAA) {
523 		struct sockaddr_in6* sa = (struct sockaddr_in6*)&ip->addr;
524 		ip->len = (socklen_t)sizeof(*sa);
525 		sa->sin6_family = AF_INET6;
526 		sa->sin6_port = (in_port_t)htons(p);
527 		if(len != (int)sizeof(sa->sin6_addr)) {
528 			if(verb) printf("skipped badly formatted AAAA\n");
529 			free(ip);
530 			return NULL;
531 		}
532 		memmove(&sa->sin6_addr, data, sizeof(sa->sin6_addr));
533 	} else {
534 		if(verb) printf("internal error: bad type in RRtoip\n");
535 		free(ip);
536 		return NULL;
537 	}
538 	verb_addr("resolved server address", ip);
539 	return ip;
540 }
541 
542 /** Resolve name, type, class and add addresses to iplist */
543 static void
544 resolve_host_ip(struct ub_ctx* ctx, const char* host, int port, int tp, int cl,
545 	struct ip_list** head)
546 {
547 	struct ub_result* res = NULL;
548 	int r;
549 	int i;
550 
551 	r = ub_resolve(ctx, host, tp, cl, &res);
552 	if(r) {
553 		if(verb) printf("error: resolve %s %s: %s\n", host,
554 			(tp==LDNS_RR_TYPE_A)?"A":"AAAA", ub_strerror(r));
555 		return;
556 	}
557 	if(!res) {
558 		if(verb) printf("out of memory\n");
559 		ub_ctx_delete(ctx);
560 		exit(0);
561 	}
562 	if(!res->havedata || res->rcode || !res->data) {
563 		if(verb) printf("resolve %s %s: no result\n", host,
564 			(tp==LDNS_RR_TYPE_A)?"A":"AAAA");
565 		return;
566 	}
567 	for(i = 0; res->data[i]; i++) {
568 		struct ip_list* ip = RR_to_ip(tp, res->data[i], res->len[i],
569 			port);
570 		if(!ip) continue;
571 		ip->next = *head;
572 		*head = ip;
573 	}
574 	ub_resolve_free(res);
575 }
576 
577 /** parse a text IP address into a sockaddr */
578 static struct ip_list*
579 parse_ip_addr(const char* str, int port)
580 {
581 	socklen_t len = 0;
582 	union {
583 		struct sockaddr_in6 a6;
584 		struct sockaddr_in a;
585 	} addr;
586 	struct ip_list* ip;
587 	uint16_t p = (uint16_t)port;
588 	memset(&addr, 0, sizeof(addr));
589 
590 	if(inet_pton(AF_INET6, str, &addr.a6.sin6_addr) > 0) {
591 		/* it is an IPv6 */
592 		addr.a6.sin6_family = AF_INET6;
593 		addr.a6.sin6_port = (in_port_t)htons(p);
594 		len = (socklen_t)sizeof(addr.a6);
595 	}
596 	if(inet_pton(AF_INET, str, &addr.a.sin_addr) > 0) {
597 		/* it is an IPv4 */
598 		addr.a.sin_family = AF_INET;
599 		addr.a.sin_port = (in_port_t)htons(p);
600 		len = (socklen_t)sizeof(struct sockaddr_in);
601 	}
602 	if(!len) return NULL;
603 	ip = (struct ip_list*)calloc(1, sizeof(*ip));
604 	if(!ip) {
605 		if(verb) printf("out of memory\n");
606 		exit(0);
607 	}
608 	ip->len = len;
609 	memmove(&ip->addr, &addr, len);
610 	if(verb) printf("server address is %s\n", str);
611 	return ip;
612 }
613 
614 /**
615  * Resolve a domain name (even though the resolver is down and there is
616  * no trust anchor).  Without DNSSEC validation.
617  * @param host: the name to resolve.
618  * 	If this name is an IP4 or IP6 address this address is returned.
619  * @param port: the port number used for the returned IP structs.
620  * @param res_conf: resolv.conf (if any).
621  * @param root_hints: root hints (if any).
622  * @param debugconf: unbound.conf for debugging options.
623  * @param srcaddr: source address option (if any).
624  * @param ip4only: use only ip4 for resolve and only lookup A
625  * @param ip6only: use only ip6 for resolve and only lookup AAAA
626  * 	default is to lookup A and AAAA using ip4 and ip6.
627  * @return list of IP addresses.
628  */
629 static struct ip_list*
630 resolve_name(const char* host, int port, const char* res_conf,
631 	const char* root_hints, const char* debugconf,
632 	const char* srcaddr, int ip4only, int ip6only)
633 {
634 	struct ub_ctx* ctx;
635 	struct ip_list* list = NULL;
636 	/* first see if name is an IP address itself */
637 	if( (list=parse_ip_addr(host, port)) ) {
638 		return list;
639 	}
640 
641 	/* create resolver context */
642 	ctx = create_unbound_context(res_conf, root_hints, debugconf,
643         	srcaddr, ip4only, ip6only);
644 
645 	/* try resolution of A */
646 	if(!ip6only) {
647 		resolve_host_ip(ctx, host, port, LDNS_RR_TYPE_A,
648 			LDNS_RR_CLASS_IN, &list);
649 	}
650 
651 	/* try resolution of AAAA */
652 	if(!ip4only) {
653 		resolve_host_ip(ctx, host, port, LDNS_RR_TYPE_AAAA,
654 			LDNS_RR_CLASS_IN, &list);
655 	}
656 
657 	ub_ctx_delete(ctx);
658 	if(!list) {
659 		if(verb) printf("%s has no IP addresses I can use\n", host);
660 		exit(0);
661 	}
662 	return list;
663 }
664 
665 /** clear used flags */
666 static void
667 wipe_ip_usage(struct ip_list* p)
668 {
669 	while(p) {
670 		p->used = 0;
671 		p = p->next;
672 	}
673 }
674 
675 /** count unused IPs */
676 static int
677 count_unused(struct ip_list* p)
678 {
679 	int num = 0;
680 	while(p) {
681 		if(!p->used) num++;
682 		p = p->next;
683 	}
684 	return num;
685 }
686 
687 /** pick random unused element from IP list */
688 static struct ip_list*
689 pick_random_ip(struct ip_list* list)
690 {
691 	struct ip_list* p = list;
692 	int num = count_unused(list);
693 	int sel;
694 	if(num == 0) return NULL;
695 	/* not perfect, but random enough */
696 	sel = (int)arc4random_uniform((uint32_t)num);
697 	/* skip over unused elements that we did not select */
698 	while(sel > 0 && p) {
699 		if(!p->used) sel--;
700 		p = p->next;
701 	}
702 	/* find the next unused element */
703 	while(p && p->used)
704 		p = p->next;
705 	if(!p) return NULL; /* robustness */
706 	return p;
707 }
708 
709 /** close the fd */
710 static void
711 fd_close(int fd)
712 {
713 #ifndef USE_WINSOCK
714 	close(fd);
715 #else
716 	closesocket(fd);
717 #endif
718 }
719 
720 /** printout socket errno */
721 static void
722 print_sock_err(const char* msg)
723 {
724 #ifndef USE_WINSOCK
725 	if(verb) printf("%s: %s\n", msg, strerror(errno));
726 #else
727 	if(verb) printf("%s: %s\n", msg, wsa_strerror(WSAGetLastError()));
728 #endif
729 }
730 
731 /** connect to IP address */
732 static int
733 connect_to_ip(struct ip_list* ip, struct ip_list* src)
734 {
735 	int fd;
736 	verb_addr("connect to", ip);
737 	fd = socket(ip->len==(socklen_t)sizeof(struct sockaddr_in)?
738 		AF_INET:AF_INET6, SOCK_STREAM, 0);
739 	if(fd == -1) {
740 		print_sock_err("socket");
741 		return -1;
742 	}
743 	if(src && bind(fd, (struct sockaddr*)&src->addr, src->len) < 0) {
744 		print_sock_err("bind");
745 		fd_close(fd);
746 		return -1;
747 	}
748 	if(connect(fd, (struct sockaddr*)&ip->addr, ip->len) < 0) {
749 		print_sock_err("connect");
750 		fd_close(fd);
751 		return -1;
752 	}
753 	return fd;
754 }
755 
756 /** create SSL context */
757 static SSL_CTX*
758 setup_sslctx(void)
759 {
760 	SSL_CTX* sslctx = SSL_CTX_new(SSLv23_client_method());
761 	if(!sslctx) {
762 		if(verb) printf("SSL_CTX_new error\n");
763 		return NULL;
764 	}
765 	return sslctx;
766 }
767 
768 /** initiate TLS on a connection */
769 static SSL*
770 TLS_initiate(SSL_CTX* sslctx, int fd, const char* urlname, int use_sni)
771 {
772 	X509* x;
773 	int r;
774 	SSL* ssl = SSL_new(sslctx);
775 	if(!ssl) {
776 		if(verb) printf("SSL_new error\n");
777 		return NULL;
778 	}
779 	SSL_set_connect_state(ssl);
780 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
781 	if(!SSL_set_fd(ssl, fd)) {
782 		if(verb) printf("SSL_set_fd error\n");
783 		SSL_free(ssl);
784 		return NULL;
785 	}
786 	if(use_sni) {
787 		(void)SSL_set_tlsext_host_name(ssl, urlname);
788 	}
789 	while(1) {
790 		ERR_clear_error();
791 		if( (r=SSL_do_handshake(ssl)) == 1)
792 			break;
793 		r = SSL_get_error(ssl, r);
794 		if(r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) {
795 			if(verb) printf("SSL handshake failed\n");
796 			SSL_free(ssl);
797 			return NULL;
798 		}
799 		/* wants to be called again */
800 	}
801 	x = SSL_get_peer_certificate(ssl);
802 	if(!x) {
803 		if(verb) printf("Server presented no peer certificate\n");
804 		SSL_free(ssl);
805 		return NULL;
806 	}
807 	verb_cert("server SSL certificate", x);
808 	X509_free(x);
809 	return ssl;
810 }
811 
812 /** perform neat TLS shutdown */
813 static void
814 TLS_shutdown(int fd, SSL* ssl, SSL_CTX* sslctx)
815 {
816 	/* shutdown the SSL connection nicely */
817 	if(SSL_shutdown(ssl) == 0) {
818 		SSL_shutdown(ssl);
819 	}
820 	SSL_free(ssl);
821 	SSL_CTX_free(sslctx);
822 	fd_close(fd);
823 }
824 
825 /** write a line over SSL */
826 static int
827 write_ssl_line(SSL* ssl, const char* str, const char* sec)
828 {
829 	char buf[1024];
830 	size_t l;
831 	if(sec) {
832 		snprintf(buf, sizeof(buf), str, sec);
833 	} else {
834 		snprintf(buf, sizeof(buf), "%s", str);
835 	}
836 	l = strlen(buf);
837 	if(l+2 >= sizeof(buf)) {
838 		if(verb) printf("line too long\n");
839 		return 0;
840 	}
841 	if(verb >= 2) printf("SSL_write: %s\n", buf);
842 	buf[l] = '\r';
843 	buf[l+1] = '\n';
844 	buf[l+2] = 0;
845 	/* add \r\n */
846 	if(SSL_write(ssl, buf, (int)strlen(buf)) <= 0) {
847 		if(verb) printf("could not SSL_write %s", str);
848 		return 0;
849 	}
850 	return 1;
851 }
852 
853 /** process header line, check rcode and keeping track of size */
854 static int
855 process_one_header(char* buf, size_t* clen, int* chunked)
856 {
857 	if(verb>=2) printf("header: '%s'\n", buf);
858 	if(strncasecmp(buf, "HTTP/1.1 ", 9) == 0) {
859 		/* check returncode */
860 		if(buf[9] != '2') {
861 			if(verb) printf("bad status %s\n", buf+9);
862 			return 0;
863 		}
864 	} else if(strncasecmp(buf, "Content-Length: ", 16) == 0) {
865 		if(!*chunked)
866 			*clen = (size_t)atoi(buf+16);
867 	} else if(strncasecmp(buf, "Transfer-Encoding: chunked", 19+7) == 0) {
868 		*clen = 0;
869 		*chunked = 1;
870 	}
871 	return 1;
872 }
873 
874 /**
875  * Read one line from SSL
876  * zero terminates.
877  * skips "\r\n" (but not copied to buf).
878  * @param ssl: the SSL connection to read from (blocking).
879  * @param buf: buffer to return line in.
880  * @param len: size of the buffer.
881  * @return 0 on error, 1 on success.
882  */
883 static int
884 read_ssl_line(SSL* ssl, char* buf, size_t len)
885 {
886 	size_t n = 0;
887 	int r;
888 	int endnl = 0;
889 	while(1) {
890 		if(n >= len) {
891 			if(verb) printf("line too long\n");
892 			return 0;
893 		}
894 		if((r = SSL_read(ssl, buf+n, 1)) <= 0) {
895 			if(SSL_get_error(ssl, r) == SSL_ERROR_ZERO_RETURN) {
896 				/* EOF */
897 				break;
898 			}
899 			if(verb) printf("could not SSL_read\n");
900 			return 0;
901 		}
902 		if(endnl && buf[n] == '\n') {
903 			break;
904 		} else if(endnl) {
905 			/* bad data */
906 			if(verb) printf("error: stray linefeeds\n");
907 			return 0;
908 		} else if(buf[n] == '\r') {
909 			/* skip \r, and also \n on the wire */
910 			endnl = 1;
911 			continue;
912 		} else if(buf[n] == '\n') {
913 			/* skip the \n, we are done */
914 			break;
915 		} else n++;
916 	}
917 	buf[n] = 0;
918 	return 1;
919 }
920 
921 /** read http headers and process them */
922 static size_t
923 read_http_headers(SSL* ssl, size_t* clen)
924 {
925 	char buf[1024];
926 	int chunked = 0;
927 	*clen = 0;
928 	while(read_ssl_line(ssl, buf, sizeof(buf))) {
929 		if(buf[0] == 0)
930 			return 1;
931 		if(!process_one_header(buf, clen, &chunked))
932 			return 0;
933 	}
934 	return 0;
935 }
936 
937 /** read a data chunk */
938 static char*
939 read_data_chunk(SSL* ssl, size_t len)
940 {
941 	size_t got = 0;
942 	int r;
943 	char* data;
944 	if((unsigned)len >= (unsigned)0xfffffff0)
945 		return NULL; /* to protect against integer overflow in malloc*/
946 	data = malloc(len+1);
947 	if(!data) {
948 		if(verb) printf("out of memory\n");
949 		return NULL;
950 	}
951 	while(got < len) {
952 		if((r = SSL_read(ssl, data+got, (int)(len-got))) <= 0) {
953 			if(SSL_get_error(ssl, r) == SSL_ERROR_ZERO_RETURN) {
954 				/* EOF */
955 				if(verb) printf("could not SSL_read: unexpected EOF\n");
956 				free(data);
957 				return NULL;
958 			}
959 			if(verb) printf("could not SSL_read\n");
960 			free(data);
961 			return NULL;
962 		}
963 		if(verb >= 2) printf("at %d/%d\n", (int)got, (int)len);
964 		got += r;
965 	}
966 	if(verb>=2) printf("read %d data\n", (int)len);
967 	data[len] = 0;
968 	return data;
969 }
970 
971 /** parse chunk header */
972 static int
973 parse_chunk_header(char* buf, size_t* result)
974 {
975 	char* e = NULL;
976 	size_t v = (size_t)strtol(buf, &e, 16);
977 	if(e == buf)
978 		return 0;
979 	*result = v;
980 	return 1;
981 }
982 
983 /** read chunked data from connection */
984 static BIO*
985 do_chunked_read(SSL* ssl)
986 {
987 	char buf[1024];
988 	size_t len;
989 	char* body;
990 	BIO* mem = BIO_new(BIO_s_mem());
991 	if(verb>=3) printf("do_chunked_read\n");
992 	if(!mem) {
993 		if(verb) printf("out of memory\n");
994 		return NULL;
995 	}
996 	while(read_ssl_line(ssl, buf, sizeof(buf))) {
997 		/* read the chunked start line */
998 		if(verb>=2) printf("chunk header: %s\n", buf);
999 		if(!parse_chunk_header(buf, &len)) {
1000 			BIO_free(mem);
1001 			if(verb>=3) printf("could not parse chunk header\n");
1002 			return NULL;
1003 		}
1004 		if(verb>=2) printf("chunk len: %d\n", (int)len);
1005 		/* are we done? */
1006 		if(len == 0) {
1007 			char z = 0;
1008 			/* skip end-of-chunk-trailer lines,
1009 			 * until the empty line after that */
1010 			do {
1011 				if(!read_ssl_line(ssl, buf, sizeof(buf))) {
1012 					BIO_free(mem);
1013 					return NULL;
1014 				}
1015 			} while (strlen(buf) > 0);
1016 			/* end of chunks, zero terminate it */
1017 			if(BIO_write(mem, &z, 1) <= 0) {
1018 				if(verb) printf("out of memory\n");
1019 				BIO_free(mem);
1020 				return NULL;
1021 			}
1022 			return mem;
1023 		}
1024 		/* read the chunked body */
1025 		body = read_data_chunk(ssl, len);
1026 		if(!body) {
1027 			BIO_free(mem);
1028 			return NULL;
1029 		}
1030 		if(BIO_write(mem, body, (int)len) <= 0) {
1031 			if(verb) printf("out of memory\n");
1032 			free(body);
1033 			BIO_free(mem);
1034 			return NULL;
1035 		}
1036 		free(body);
1037 		/* skip empty line after data chunk */
1038 		if(!read_ssl_line(ssl, buf, sizeof(buf))) {
1039 			BIO_free(mem);
1040 			return NULL;
1041 		}
1042 	}
1043 	BIO_free(mem);
1044 	return NULL;
1045 }
1046 
1047 /** start HTTP1.1 transaction on SSL */
1048 static int
1049 write_http_get(SSL* ssl, const char* pathname, const char* urlname)
1050 {
1051 	if(write_ssl_line(ssl, "GET /%s HTTP/1.1", pathname) &&
1052 	   write_ssl_line(ssl, "Host: %s", urlname) &&
1053 	   write_ssl_line(ssl, "User-Agent: unbound-anchor/%s",
1054 	   	PACKAGE_VERSION) &&
1055 	   /* We do not really do multiple queries per connection,
1056 	    * but this header setting is also not needed.
1057 	    * write_ssl_line(ssl, "Connection: close", NULL) &&*/
1058 	   write_ssl_line(ssl, "", NULL)) {
1059 		return 1;
1060 	}
1061 	return 0;
1062 }
1063 
1064 /** read chunked data and zero terminate; len is without zero */
1065 static char*
1066 read_chunked_zero_terminate(SSL* ssl, size_t* len)
1067 {
1068 	/* do the chunked version */
1069 	BIO* tmp = do_chunked_read(ssl);
1070 	char* data, *d = NULL;
1071 	size_t l;
1072 	if(!tmp) {
1073 		if(verb) printf("could not read from https\n");
1074 		return NULL;
1075 	}
1076 	l = (size_t)BIO_get_mem_data(tmp, &d);
1077 	if(verb>=2) printf("chunked data is %d\n", (int)l);
1078 	if(l == 0 || d == NULL) {
1079 		if(verb) printf("out of memory\n");
1080 		return NULL;
1081 	}
1082 	*len = l-1;
1083 	data = (char*)malloc(l);
1084 	if(data == NULL) {
1085 		if(verb) printf("out of memory\n");
1086 		return NULL;
1087 	}
1088 	memcpy(data, d, l);
1089 	BIO_free(tmp);
1090 	return data;
1091 }
1092 
1093 /** read HTTP result from SSL */
1094 static BIO*
1095 read_http_result(SSL* ssl)
1096 {
1097 	size_t len = 0;
1098 	char* data;
1099 	BIO* m;
1100 	if(!read_http_headers(ssl, &len)) {
1101 		return NULL;
1102 	}
1103 	if(len == 0) {
1104 		data = read_chunked_zero_terminate(ssl, &len);
1105 	} else {
1106 		data = read_data_chunk(ssl, len);
1107 	}
1108 	if(!data) return NULL;
1109 	if(verb >= 4) print_data("read data", data, len);
1110 	m = BIO_new(BIO_s_mem());
1111 	if(!m) {
1112 		if(verb) printf("out of memory\n");
1113 		free(data);
1114 		exit(0);
1115 	}
1116 	BIO_write(m, data, (int)len);
1117 	free(data);
1118 	return m;
1119 }
1120 
1121 /** https to an IP addr, return BIO with pathname or NULL */
1122 static BIO*
1123 https_to_ip(struct ip_list* ip, const char* pathname, const char* urlname,
1124 	struct ip_list* src, int use_sni)
1125 {
1126 	int fd;
1127 	SSL* ssl;
1128 	BIO* bio;
1129 	SSL_CTX* sslctx = setup_sslctx();
1130 	if(!sslctx) {
1131 		return NULL;
1132 	}
1133 	fd = connect_to_ip(ip, src);
1134 	if(fd == -1) {
1135 		SSL_CTX_free(sslctx);
1136 		return NULL;
1137 	}
1138 	ssl = TLS_initiate(sslctx, fd, urlname, use_sni);
1139 	if(!ssl) {
1140 		SSL_CTX_free(sslctx);
1141 		fd_close(fd);
1142 		return NULL;
1143 	}
1144 	if(!write_http_get(ssl, pathname, urlname)) {
1145 		if(verb) printf("could not write to server\n");
1146 		SSL_free(ssl);
1147 		SSL_CTX_free(sslctx);
1148 		fd_close(fd);
1149 		return NULL;
1150 	}
1151 	bio = read_http_result(ssl);
1152 	TLS_shutdown(fd, ssl, sslctx);
1153 	return bio;
1154 }
1155 
1156 /**
1157  * Do a HTTPS, HTTP1.1 over TLS, to fetch a file
1158  * @param ip_list: list of IP addresses to use to fetch from.
1159  * @param pathname: pathname of file on server to GET.
1160  * @param urlname: name to pass as the virtual host for this request.
1161  * @param src: if nonNULL, source address to bind to.
1162  * @param use_sni: if SNI will be used.
1163  * @return a memory BIO with the file in it.
1164  */
1165 static BIO*
1166 https(struct ip_list* ip_list, const char* pathname, const char* urlname,
1167 	struct ip_list* src, int use_sni)
1168 {
1169 	struct ip_list* ip;
1170 	BIO* bio = NULL;
1171 	/* try random address first, and work through the list */
1172 	wipe_ip_usage(ip_list);
1173 	while( (ip = pick_random_ip(ip_list)) ) {
1174 		ip->used = 1;
1175 		bio = https_to_ip(ip, pathname, urlname, src, use_sni);
1176 		if(bio) break;
1177 	}
1178 	if(!bio) {
1179 		if(verb) printf("could not fetch %s\n", pathname);
1180 		exit(0);
1181 	} else {
1182 		if(verb) printf("fetched %s (%d bytes)\n",
1183 			pathname, (int)BIO_ctrl_pending(bio));
1184 	}
1185 	return bio;
1186 }
1187 
1188 /** XML parse private data during the parse */
1189 struct xml_data {
1190 	/** the parser, reference */
1191 	XML_Parser parser;
1192 	/** the current tag; malloced; or NULL outside of tags */
1193 	char* tag;
1194 	/** current date to use during the parse */
1195 	time_t date;
1196 	/** number of keys usefully read in */
1197 	int num_keys;
1198 	/** the compiled anchors as DS records */
1199 	BIO* ds;
1200 
1201 	/** do we want to use this anchor? */
1202 	int use_key;
1203 	/** the current anchor: Zone */
1204 	BIO* czone;
1205 	/** the current anchor: KeyTag */
1206 	BIO* ctag;
1207 	/** the current anchor: Algorithm */
1208 	BIO* calgo;
1209 	/** the current anchor: DigestType */
1210 	BIO* cdigtype;
1211 	/** the current anchor: Digest*/
1212 	BIO* cdigest;
1213 };
1214 
1215 /** The BIO for the tag */
1216 static BIO*
1217 xml_selectbio(struct xml_data* data, const char* tag)
1218 {
1219 	BIO* b = NULL;
1220 	if(strcasecmp(tag, "KeyTag") == 0)
1221 		b = data->ctag;
1222 	else if(strcasecmp(tag, "Algorithm") == 0)
1223 		b = data->calgo;
1224 	else if(strcasecmp(tag, "DigestType") == 0)
1225 		b = data->cdigtype;
1226 	else if(strcasecmp(tag, "Digest") == 0)
1227 		b = data->cdigest;
1228 	return b;
1229 }
1230 
1231 /**
1232  * XML handle character data, the data inside an element.
1233  * @param userData: xml_data structure
1234  * @param s: the character data.  May not all be in one callback.
1235  * 	NOT zero terminated.
1236  * @param len: length of this part of the data.
1237  */
1238 static void
1239 xml_charhandle(void *userData, const XML_Char *s, int len)
1240 {
1241 	struct xml_data* data = (struct xml_data*)userData;
1242 	BIO* b = NULL;
1243 	/* skip characters outside of elements */
1244 	if(!data->tag)
1245 		return;
1246 	if(verb>=4) {
1247 		int i;
1248 		printf("%s%s charhandle: '",
1249 			data->use_key?"use ":"",
1250 			data->tag?data->tag:"none");
1251 		for(i=0; i<len; i++)
1252 			printf("%c", s[i]);
1253 		printf("'\n");
1254 	}
1255 	if(strcasecmp(data->tag, "Zone") == 0) {
1256 		if(BIO_write(data->czone, s, len) < 0) {
1257 			if(verb) printf("out of memory in BIO_write\n");
1258 			exit(0);
1259 		}
1260 		return;
1261 	}
1262 	/* only store if key is used */
1263 	if(!data->use_key)
1264 		return;
1265 	b = xml_selectbio(data, data->tag);
1266 	if(b) {
1267 		if(BIO_write(b, s, len) < 0) {
1268 			if(verb) printf("out of memory in BIO_write\n");
1269 			exit(0);
1270 		}
1271 	}
1272 }
1273 
1274 /**
1275  * XML fetch value of particular attribute(by name) or NULL if not present.
1276  * @param atts: attribute array (from xml_startelem).
1277  * @param name: name of attribute to look for.
1278  * @return the value or NULL. (ptr into atts).
1279  */
1280 static const XML_Char*
1281 find_att(const XML_Char **atts, const XML_Char* name)
1282 {
1283 	int i;
1284 	for(i=0; atts[i]; i+=2) {
1285 		if(strcasecmp(atts[i], name) == 0)
1286 			return atts[i+1];
1287 	}
1288 	return NULL;
1289 }
1290 
1291 /**
1292  * XML convert DateTime element to time_t.
1293  * [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
1294  * (with optional .ssssss fractional seconds)
1295  * @param str: the string
1296  * @return a time_t representation or 0 on failure.
1297  */
1298 static time_t
1299 xml_convertdate(const char* str)
1300 {
1301 	time_t t = 0;
1302 	struct tm tm;
1303 	const char* s;
1304 	/* for this application, ignore minus in front;
1305 	 * only positive dates are expected */
1306 	s = str;
1307 	if(s[0] == '-') s++;
1308 	memset(&tm, 0, sizeof(tm));
1309 	/* parse initial content of the string (lots of whitespace allowed) */
1310 	s = strptime(s, "%t%Y%t-%t%m%t-%t%d%tT%t%H%t:%t%M%t:%t%S%t", &tm);
1311 	if(!s) {
1312 		if(verb) printf("xml_convertdate parse failure %s\n", str);
1313 		return 0;
1314 	}
1315 	/* parse remainder of date string */
1316 	if(*s == '.') {
1317 		/* optional '.' and fractional seconds */
1318 		int frac = 0, n = 0;
1319 		if(sscanf(s+1, "%d%n", &frac, &n) < 1) {
1320 			if(verb) printf("xml_convertdate f failure %s\n", str);
1321 			return 0;
1322 		}
1323 		/* fraction is not used, time_t has second accuracy */
1324 		s++;
1325 		s+=n;
1326 	}
1327 	if(*s == 'Z' || *s == 'z') {
1328 		/* nothing to do for this */
1329 		s++;
1330 	} else if(*s == '+' || *s == '-') {
1331 		/* optional timezone spec: Z or +hh:mm or -hh:mm */
1332 		int hr = 0, mn = 0, n = 0;
1333 		if(sscanf(s+1, "%d:%d%n", &hr, &mn, &n) < 2) {
1334 			if(verb) printf("xml_convertdate tz failure %s\n", str);
1335 			return 0;
1336 		}
1337 		if(*s == '+') {
1338 			tm.tm_hour += hr;
1339 			tm.tm_min += mn;
1340 		} else {
1341 			tm.tm_hour -= hr;
1342 			tm.tm_min -= mn;
1343 		}
1344 		s++;
1345 		s += n;
1346 	}
1347 	if(*s != 0) {
1348 		/* not ended properly */
1349 		/* but ignore, (lenient) */
1350 	}
1351 
1352 	t = sldns_mktime_from_utc(&tm);
1353 	if(t == (time_t)-1) {
1354 		if(verb) printf("xml_convertdate mktime failure\n");
1355 		return 0;
1356 	}
1357 	return t;
1358 }
1359 
1360 /**
1361  * XML handle the KeyDigest start tag, check validity periods.
1362  */
1363 static void
1364 handle_keydigest(struct xml_data* data, const XML_Char **atts)
1365 {
1366 	data->use_key = 0;
1367 	if(find_att(atts, "validFrom")) {
1368 		time_t from = xml_convertdate(find_att(atts, "validFrom"));
1369 		if(from == 0) {
1370 			if(verb) printf("error: xml cannot be parsed\n");
1371 			exit(0);
1372 		}
1373 		if(data->date < from)
1374 			return;
1375 	}
1376 	if(find_att(atts, "validUntil")) {
1377 		time_t until = xml_convertdate(find_att(atts, "validUntil"));
1378 		if(until == 0) {
1379 			if(verb) printf("error: xml cannot be parsed\n");
1380 			exit(0);
1381 		}
1382 		if(data->date > until)
1383 			return;
1384 	}
1385 	/* yes we want to use this key */
1386 	data->use_key = 1;
1387 	(void)BIO_reset(data->ctag);
1388 	(void)BIO_reset(data->calgo);
1389 	(void)BIO_reset(data->cdigtype);
1390 	(void)BIO_reset(data->cdigest);
1391 }
1392 
1393 /** See if XML element equals the zone name */
1394 static int
1395 xml_is_zone_name(BIO* zone, const char* name)
1396 {
1397 	char buf[1024];
1398 	char* z = NULL;
1399 	long zlen;
1400 	(void)BIO_seek(zone, 0);
1401 	zlen = BIO_get_mem_data(zone, &z);
1402 	if(!zlen || !z) return 0;
1403 	/* zero terminate */
1404 	if(zlen >= (long)sizeof(buf)) return 0;
1405 	memmove(buf, z, (size_t)zlen);
1406 	buf[zlen] = 0;
1407 	/* compare */
1408 	return (strncasecmp(buf, name, strlen(name)) == 0);
1409 }
1410 
1411 /**
1412  * XML start of element. This callback is called whenever an XML tag starts.
1413  * XML_Char is UTF8.
1414  * @param userData: the xml_data structure.
1415  * @param name: the tag that starts.
1416  * @param atts: array of strings, pairs of attr = value, ends with NULL.
1417  * 	i.e. att[0]="att[1]" att[2]="att[3]" att[4]isNull
1418  */
1419 static void
1420 xml_startelem(void *userData, const XML_Char *name, const XML_Char **atts)
1421 {
1422 	struct xml_data* data = (struct xml_data*)userData;
1423 	BIO* b;
1424 	if(verb>=4) printf("xml tag start '%s'\n", name);
1425 	free(data->tag);
1426 	data->tag = strdup(name);
1427 	if(!data->tag) {
1428 		if(verb) printf("out of memory\n");
1429 		exit(0);
1430 	}
1431 	if(verb>=4) {
1432 		int i;
1433 		for(i=0; atts[i]; i+=2) {
1434 			printf("  %s='%s'\n", atts[i], atts[i+1]);
1435 		}
1436 	}
1437 	/* handle attributes to particular types */
1438 	if(strcasecmp(name, "KeyDigest") == 0) {
1439 		handle_keydigest(data, atts);
1440 		return;
1441 	} else if(strcasecmp(name, "Zone") == 0) {
1442 		(void)BIO_reset(data->czone);
1443 		return;
1444 	}
1445 
1446 	/* for other types we prepare to pick up the data */
1447 	if(!data->use_key)
1448 		return;
1449 	b = xml_selectbio(data, data->tag);
1450 	if(b) {
1451 		/* empty it */
1452 		(void)BIO_reset(b);
1453 	}
1454 }
1455 
1456 /** Append str to bio */
1457 static void
1458 xml_append_str(BIO* b, const char* s)
1459 {
1460 	if(BIO_write(b, s, (int)strlen(s)) < 0) {
1461 		if(verb) printf("out of memory in BIO_write\n");
1462 		exit(0);
1463 	}
1464 }
1465 
1466 /** Append bio to bio */
1467 static void
1468 xml_append_bio(BIO* b, BIO* a)
1469 {
1470 	char* z = NULL;
1471 	long i, len;
1472 	(void)BIO_seek(a, 0);
1473 	len = BIO_get_mem_data(a, &z);
1474 	if(!len || !z) {
1475 		if(verb) printf("out of memory in BIO_write\n");
1476 		exit(0);
1477 	}
1478 	/* remove newlines in the data here */
1479 	for(i=0; i<len; i++) {
1480 		if(z[i] == '\r' || z[i] == '\n')
1481 			z[i] = ' ';
1482 	}
1483 	/* write to BIO */
1484 	if(BIO_write(b, z, len) < 0) {
1485 		if(verb) printf("out of memory in BIO_write\n");
1486 		exit(0);
1487 	}
1488 }
1489 
1490 /** write the parsed xml-DS to the DS list */
1491 static void
1492 xml_append_ds(struct xml_data* data)
1493 {
1494 	/* write DS to accumulated DS */
1495 	xml_append_str(data->ds, ". IN DS ");
1496 	xml_append_bio(data->ds, data->ctag);
1497 	xml_append_str(data->ds, " ");
1498 	xml_append_bio(data->ds, data->calgo);
1499 	xml_append_str(data->ds, " ");
1500 	xml_append_bio(data->ds, data->cdigtype);
1501 	xml_append_str(data->ds, " ");
1502 	xml_append_bio(data->ds, data->cdigest);
1503 	xml_append_str(data->ds, "\n");
1504 	data->num_keys++;
1505 }
1506 
1507 /**
1508  * XML end of element. This callback is called whenever an XML tag ends.
1509  * XML_Char is UTF8.
1510  * @param userData: the xml_data structure
1511  * @param name: the tag that ends.
1512  */
1513 static void
1514 xml_endelem(void *userData, const XML_Char *name)
1515 {
1516 	struct xml_data* data = (struct xml_data*)userData;
1517 	if(verb>=4) printf("xml tag end   '%s'\n", name);
1518 	free(data->tag);
1519 	data->tag = NULL;
1520 	if(strcasecmp(name, "KeyDigest") == 0) {
1521 		if(data->use_key)
1522 			xml_append_ds(data);
1523 		data->use_key = 0;
1524 	} else if(strcasecmp(name, "Zone") == 0) {
1525 		if(!xml_is_zone_name(data->czone, ".")) {
1526 			if(verb) printf("xml not for the right zone\n");
1527 			exit(0);
1528 		}
1529 	}
1530 }
1531 
1532 /* Stop the parser when an entity declaration is encountered. For safety. */
1533 static void
1534 xml_entitydeclhandler(void *userData,
1535 	const XML_Char *ATTR_UNUSED(entityName),
1536 	int ATTR_UNUSED(is_parameter_entity),
1537 	const XML_Char *ATTR_UNUSED(value), int ATTR_UNUSED(value_length),
1538 	const XML_Char *ATTR_UNUSED(base),
1539 	const XML_Char *ATTR_UNUSED(systemId),
1540 	const XML_Char *ATTR_UNUSED(publicId),
1541 	const XML_Char *ATTR_UNUSED(notationName))
1542 {
1543 #if HAVE_DECL_XML_STOPPARSER
1544 	(void)XML_StopParser((XML_Parser)userData, XML_FALSE);
1545 #else
1546 	(void)userData;
1547 #endif
1548 }
1549 
1550 /**
1551  * XML parser setup of the callbacks for the tags
1552  */
1553 static void
1554 xml_parse_setup(XML_Parser parser, struct xml_data* data, time_t now)
1555 {
1556 	char buf[1024];
1557 	memset(data, 0, sizeof(*data));
1558 	XML_SetUserData(parser, data);
1559 	data->parser = parser;
1560 	data->date = now;
1561 	data->ds = BIO_new(BIO_s_mem());
1562 	data->ctag = BIO_new(BIO_s_mem());
1563 	data->czone = BIO_new(BIO_s_mem());
1564 	data->calgo = BIO_new(BIO_s_mem());
1565 	data->cdigtype = BIO_new(BIO_s_mem());
1566 	data->cdigest = BIO_new(BIO_s_mem());
1567 	if(!data->ds || !data->ctag || !data->calgo || !data->czone ||
1568 		!data->cdigtype || !data->cdigest) {
1569 		if(verb) printf("out of memory\n");
1570 		exit(0);
1571 	}
1572 	snprintf(buf, sizeof(buf), "; created by unbound-anchor on %s",
1573 		ctime(&now));
1574 	if(BIO_write(data->ds, buf, (int)strlen(buf)) < 0) {
1575 		if(verb) printf("out of memory\n");
1576 		exit(0);
1577 	}
1578 	XML_SetEntityDeclHandler(parser, xml_entitydeclhandler);
1579 	XML_SetElementHandler(parser, xml_startelem, xml_endelem);
1580 	XML_SetCharacterDataHandler(parser, xml_charhandle);
1581 }
1582 
1583 /**
1584  * Perform XML parsing of the root-anchors file
1585  * Its format description can be read here
1586  * https://data.iana.org/root-anchors/draft-icann-dnssec-trust-anchor.txt
1587  * It uses libexpat.
1588  * @param xml: BIO with xml data.
1589  * @param now: the current time for checking DS validity periods.
1590  * @return memoryBIO with the DS data in zone format.
1591  * 	or NULL if the zone is insecure.
1592  * 	(It exit()s on error)
1593  */
1594 static BIO*
1595 xml_parse(BIO* xml, time_t now)
1596 {
1597 	char* pp;
1598 	int len;
1599 	XML_Parser parser;
1600 	struct xml_data data;
1601 
1602 	parser = XML_ParserCreate(NULL);
1603 	if(!parser) {
1604 		if(verb) printf("could not XML_ParserCreate\n");
1605 		exit(0);
1606 	}
1607 
1608 	/* setup callbacks */
1609 	xml_parse_setup(parser, &data, now);
1610 
1611 	/* parse it */
1612 	(void)BIO_seek(xml, 0);
1613 	len = (int)BIO_get_mem_data(xml, &pp);
1614 	if(!len || !pp) {
1615 		if(verb) printf("out of memory\n");
1616 		exit(0);
1617 	}
1618 	if(!XML_Parse(parser, pp, len, 1 /*isfinal*/ )) {
1619 		const char *e = XML_ErrorString(XML_GetErrorCode(parser));
1620 		if(verb) printf("XML_Parse failure %s\n", e?e:"");
1621 		exit(0);
1622 	}
1623 
1624 	/* parsed */
1625 	if(verb) printf("XML was parsed successfully, %d keys\n",
1626 			data.num_keys);
1627 	free(data.tag);
1628 	XML_ParserFree(parser);
1629 
1630 	if(verb >= 4) {
1631 		(void)BIO_seek(data.ds, 0);
1632 		len = BIO_get_mem_data(data.ds, &pp);
1633 		printf("got DS bio %d: '", len);
1634 		if(!fwrite(pp, (size_t)len, 1, stdout))
1635 			/* compilers do not allow us to ignore fwrite .. */
1636 			fprintf(stderr, "error writing to stdout\n");
1637 		printf("'\n");
1638 	}
1639 	BIO_free(data.czone);
1640 	BIO_free(data.ctag);
1641 	BIO_free(data.calgo);
1642 	BIO_free(data.cdigtype);
1643 	BIO_free(data.cdigest);
1644 
1645 	if(data.num_keys == 0) {
1646 		/* the root zone seems to have gone insecure */
1647 		BIO_free(data.ds);
1648 		return NULL;
1649 	} else {
1650 		return data.ds;
1651 	}
1652 }
1653 
1654 /* get key usage out of its extension, returns 0 if no key_usage extension */
1655 static unsigned long
1656 get_usage_of_ex(X509* cert)
1657 {
1658 	unsigned long val = 0;
1659 	ASN1_BIT_STRING* s;
1660 	if((s=X509_get_ext_d2i(cert, NID_key_usage, NULL, NULL))) {
1661 		if(s->length > 0) {
1662 			val = s->data[0];
1663 			if(s->length > 1)
1664 				val |= s->data[1] << 8;
1665 		}
1666 		ASN1_BIT_STRING_free(s);
1667 	}
1668 	return val;
1669 }
1670 
1671 /** get valid signers from the list of signers in the signature */
1672 static STACK_OF(X509)*
1673 get_valid_signers(PKCS7* p7, const char* p7signer)
1674 {
1675 	int i;
1676 	STACK_OF(X509)* validsigners = sk_X509_new_null();
1677 	STACK_OF(X509)* signers = PKCS7_get0_signers(p7, NULL, 0);
1678 	unsigned long usage = 0;
1679 	if(!validsigners) {
1680 		if(verb) printf("out of memory\n");
1681 		sk_X509_free(signers);
1682 		return NULL;
1683 	}
1684 	if(!signers) {
1685 		if(verb) printf("no signers in pkcs7 signature\n");
1686 		sk_X509_free(validsigners);
1687 		return NULL;
1688 	}
1689 	for(i=0; i<sk_X509_num(signers); i++) {
1690 		X509_NAME* nm = X509_get_subject_name(
1691 			sk_X509_value(signers, i));
1692 		char buf[1024];
1693 		if(!nm) {
1694 			if(verb) printf("signer %d: cert has no subject name\n", i);
1695 			continue;
1696 		}
1697 		if(verb && nm) {
1698 			char* nmline = X509_NAME_oneline(nm, buf,
1699 				(int)sizeof(buf));
1700 			printf("signer %d: Subject: %s\n", i,
1701 				nmline?nmline:"no subject");
1702 			if(verb >= 3 && X509_NAME_get_text_by_NID(nm,
1703 				NID_commonName, buf, (int)sizeof(buf)))
1704 				printf("commonName: %s\n", buf);
1705 			if(verb >= 3 && X509_NAME_get_text_by_NID(nm,
1706 				NID_pkcs9_emailAddress, buf, (int)sizeof(buf)))
1707 				printf("emailAddress: %s\n", buf);
1708 		}
1709 		if(verb) {
1710 			int ku_loc = X509_get_ext_by_NID(
1711 				sk_X509_value(signers, i), NID_key_usage, -1);
1712 			if(verb >= 3 && ku_loc >= 0) {
1713 				X509_EXTENSION *ex = X509_get_ext(
1714 					sk_X509_value(signers, i), ku_loc);
1715 				if(ex) {
1716 					printf("keyUsage: ");
1717 					X509V3_EXT_print_fp(stdout, ex, 0, 0);
1718 					printf("\n");
1719 				}
1720 			}
1721 		}
1722 		if(!p7signer || strcmp(p7signer, "")==0) {
1723 			/* there is no name to check, return all records */
1724 			if(verb) printf("did not check commonName of signer\n");
1725 		} else {
1726 			if(!X509_NAME_get_text_by_NID(nm,
1727 				NID_pkcs9_emailAddress,
1728 				buf, (int)sizeof(buf))) {
1729 				if(verb) printf("removed cert with no name\n");
1730 				continue; /* no name, no use */
1731 			}
1732 			if(strcmp(buf, p7signer) != 0) {
1733 				if(verb) printf("removed cert with wrong name\n");
1734 				continue; /* wrong name, skip it */
1735 			}
1736 		}
1737 
1738 		/* check that the key usage allows digital signatures
1739 		 * (the p7s) */
1740 		usage = get_usage_of_ex(sk_X509_value(signers, i));
1741 		if(!(usage & KU_DIGITAL_SIGNATURE)) {
1742 			if(verb) printf("removed cert with no key usage Digital Signature allowed\n");
1743 			continue;
1744 		}
1745 
1746 		/* we like this cert, add it to our list of valid
1747 		 * signers certificates */
1748 		sk_X509_push(validsigners, sk_X509_value(signers, i));
1749 	}
1750 	sk_X509_free(signers);
1751 	return validsigners;
1752 }
1753 
1754 /** verify a PKCS7 signature, false on failure */
1755 static int
1756 verify_p7sig(BIO* data, BIO* p7s, STACK_OF(X509)* trust, const char* p7signer)
1757 {
1758 	PKCS7* p7;
1759 	X509_STORE *store = X509_STORE_new();
1760 	STACK_OF(X509)* validsigners;
1761 	int secure = 0;
1762 	int i;
1763 #ifdef X509_V_FLAG_CHECK_SS_SIGNATURE
1764 	X509_VERIFY_PARAM* param = X509_VERIFY_PARAM_new();
1765 	if(!param) {
1766 		if(verb) printf("out of memory\n");
1767 		X509_STORE_free(store);
1768 		return 0;
1769 	}
1770 	/* do the selfcheck on the root certificate; it checks that the
1771 	 * input is valid */
1772 	X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CHECK_SS_SIGNATURE);
1773 	if(store) X509_STORE_set1_param(store, param);
1774 #endif
1775 	if(!store) {
1776 		if(verb) printf("out of memory\n");
1777 #ifdef X509_V_FLAG_CHECK_SS_SIGNATURE
1778 		X509_VERIFY_PARAM_free(param);
1779 #endif
1780 		return 0;
1781 	}
1782 #ifdef X509_V_FLAG_CHECK_SS_SIGNATURE
1783 	X509_VERIFY_PARAM_free(param);
1784 #endif
1785 
1786 	(void)BIO_seek(p7s, 0);
1787 	(void)BIO_seek(data, 0);
1788 
1789 	/* convert p7s to p7 (the signature) */
1790 	p7 = d2i_PKCS7_bio(p7s, NULL);
1791 	if(!p7) {
1792 		if(verb) printf("could not parse p7s signature file\n");
1793 		X509_STORE_free(store);
1794 		return 0;
1795 	}
1796 	if(verb >= 2) printf("parsed the PKCS7 signature\n");
1797 
1798 	/* convert trust to trusted certificate store */
1799 	for(i=0; i<sk_X509_num(trust); i++) {
1800 		if(!X509_STORE_add_cert(store, sk_X509_value(trust, i))) {
1801 			if(verb) printf("failed X509_STORE_add_cert\n");
1802 			X509_STORE_free(store);
1803 			PKCS7_free(p7);
1804 			return 0;
1805 		}
1806 	}
1807 	if(verb >= 2) printf("setup the X509_STORE\n");
1808 
1809 	/* check what is in the Subject name of the certificates,
1810 	 * and build a stack that contains only the right certificates */
1811 	validsigners = get_valid_signers(p7, p7signer);
1812 	if(!validsigners) {
1813 			X509_STORE_free(store);
1814 			PKCS7_free(p7);
1815 			return 0;
1816 	}
1817 	if(PKCS7_verify(p7, validsigners, store, data, NULL, PKCS7_NOINTERN) == 1) {
1818 		secure = 1;
1819 		if(verb) printf("the PKCS7 signature verified\n");
1820 	} else {
1821 		if(verb) {
1822 			ERR_print_errors_fp(stdout);
1823 		}
1824 	}
1825 
1826 	sk_X509_free(validsigners);
1827 	X509_STORE_free(store);
1828 	PKCS7_free(p7);
1829 	return secure;
1830 }
1831 
1832 /** write unsigned root anchor file, a 5011 revoked tp */
1833 static void
1834 write_unsigned_root(const char* root_anchor_file)
1835 {
1836 	FILE* out;
1837 	time_t now = time(NULL);
1838 	out = fopen(root_anchor_file, "w");
1839 	if(!out) {
1840 		if(verb) printf("%s: %s\n", root_anchor_file, strerror(errno));
1841 		return;
1842 	}
1843 	if(fprintf(out, "; autotrust trust anchor file\n"
1844 		";;REVOKED\n"
1845 		";;id: . 1\n"
1846 		"; This file was written by unbound-anchor on %s"
1847 		"; It indicates that the root does not use DNSSEC\n"
1848 		"; to restart DNSSEC overwrite this file with a\n"
1849 		"; valid trustanchor or (empty-it and run unbound-anchor)\n"
1850 		, ctime(&now)) < 0) {
1851 		if(verb) printf("failed to write 'unsigned' to %s\n",
1852 			root_anchor_file);
1853 		if(verb && errno != 0) printf("%s\n", strerror(errno));
1854 	}
1855 	fflush(out);
1856 #ifdef HAVE_FSYNC
1857 	fsync(fileno(out));
1858 #else
1859 	FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(out)));
1860 #endif
1861 	fclose(out);
1862 }
1863 
1864 /** write root anchor file */
1865 static void
1866 write_root_anchor(const char* root_anchor_file, BIO* ds)
1867 {
1868 	char* pp = NULL;
1869 	int len;
1870 	FILE* out;
1871 	(void)BIO_seek(ds, 0);
1872 	len = BIO_get_mem_data(ds, &pp);
1873 	if(!len || !pp) {
1874 		if(verb) printf("out of memory\n");
1875 		return;
1876 	}
1877 	out = fopen(root_anchor_file, "w");
1878 	if(!out) {
1879 		if(verb) printf("%s: %s\n", root_anchor_file, strerror(errno));
1880 		return;
1881 	}
1882 	if(fwrite(pp, (size_t)len, 1, out) != 1) {
1883 		if(verb) printf("failed to write all data to %s\n",
1884 			root_anchor_file);
1885 		if(verb && errno != 0) printf("%s\n", strerror(errno));
1886 	}
1887 	fflush(out);
1888 #ifdef HAVE_FSYNC
1889 	fsync(fileno(out));
1890 #else
1891 	FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(out)));
1892 #endif
1893 	fclose(out);
1894 }
1895 
1896 /** Perform the verification and update of the trustanchor file */
1897 static void
1898 verify_and_update_anchor(const char* root_anchor_file, BIO* xml, BIO* p7s,
1899 	STACK_OF(X509)* cert, const char* p7signer)
1900 {
1901 	BIO* ds;
1902 
1903 	/* verify xml file */
1904 	if(!verify_p7sig(xml, p7s, cert, p7signer)) {
1905 		printf("the PKCS7 signature failed\n");
1906 		exit(0);
1907 	}
1908 
1909 	/* parse the xml file into DS records */
1910 	ds = xml_parse(xml, time(NULL));
1911 	if(!ds) {
1912 		/* the root zone is unsigned now */
1913 		write_unsigned_root(root_anchor_file);
1914 	} else {
1915 		/* reinstate 5011 tracking */
1916 		write_root_anchor(root_anchor_file, ds);
1917 	}
1918 	BIO_free(ds);
1919 }
1920 
1921 #ifdef USE_WINSOCK
1922 static void do_wsa_cleanup(void) { WSACleanup(); }
1923 #endif
1924 
1925 /** perform actual certupdate work */
1926 static int
1927 do_certupdate(const char* root_anchor_file, const char* root_cert_file,
1928 	const char* urlname, const char* xmlname, const char* p7sname,
1929 	const char* p7signer, const char* res_conf, const char* root_hints,
1930 	const char* debugconf, const char* srcaddr, int ip4only, int ip6only,
1931 	int port, int use_sni)
1932 
1933 {
1934 	STACK_OF(X509)* cert;
1935 	BIO *xml, *p7s;
1936 	struct ip_list* ip_list = NULL;
1937 	struct ip_list* src = NULL;
1938 
1939 	/* read pem file or provide builtin */
1940 	cert = read_cert_or_builtin(root_cert_file);
1941 
1942 	/* lookup A, AAAA for the urlname (or parse urlname if IP address) */
1943 	ip_list = resolve_name(urlname, port, res_conf, root_hints, debugconf,
1944 	        srcaddr, ip4only, ip6only);
1945 
1946 	if(srcaddr && !(src = parse_ip_addr(srcaddr, 0))) {
1947 		if(verb) printf("cannot parse source address: %s\n", srcaddr);
1948 		exit(0);
1949 	}
1950 
1951 #ifdef USE_WINSOCK
1952 	if(1) { /* libunbound finished, startup WSA for the https connection */
1953 		WSADATA wsa_data;
1954 		int r;
1955 		if((r = WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) {
1956 			if(verb) printf("WSAStartup failed: %s\n",
1957 				wsa_strerror(r));
1958 			exit(0);
1959 		}
1960 		atexit(&do_wsa_cleanup);
1961 	}
1962 #endif
1963 
1964 	/* fetch the necessary files over HTTPS */
1965 	xml = https(ip_list, xmlname, urlname, src, use_sni);
1966 	p7s = https(ip_list, p7sname, urlname, src, use_sni);
1967 
1968 	/* verify and update the root anchor */
1969 	verify_and_update_anchor(root_anchor_file, xml, p7s, cert, p7signer);
1970 	if(verb) printf("success: the anchor has been updated "
1971 			"using the cert\n");
1972 
1973 	BIO_free(xml);
1974 	BIO_free(p7s);
1975 #ifndef S_SPLINT_S
1976 	sk_X509_pop_free(cert, X509_free);
1977 #endif
1978 	ip_list_free(ip_list);
1979 	return 1;
1980 }
1981 
1982 /**
1983  * Try to read the root RFC5011 autotrust anchor file,
1984  * @param file: filename.
1985  * @return:
1986  * 	0 if does not exist or empty
1987  * 	1 if trust-point-revoked-5011
1988  * 	2 if it is OK.
1989  */
1990 static int
1991 try_read_anchor(const char* file)
1992 {
1993 	int empty = 1;
1994 	char line[10240];
1995 	char* p;
1996 	FILE* in = fopen(file, "r");
1997 	if(!in) {
1998 		/* only if the file does not exist, can we fix it */
1999 		if(errno != ENOENT) {
2000 			if(verb) printf("%s: %s\n", file, strerror(errno));
2001 			if(verb) printf("error: cannot access the file\n");
2002 			exit(0);
2003 		}
2004 		if(verb) printf("%s does not exist\n", file);
2005 		return 0;
2006 	}
2007 	while(fgets(line, (int)sizeof(line), in)) {
2008 		line[sizeof(line)-1] = 0;
2009 		if(strncmp(line, ";;REVOKED", 9) == 0) {
2010 			fclose(in);
2011 			if(verb) printf("%s : the trust point is revoked\n"
2012 				"and the zone is considered unsigned.\n"
2013 				"if you wish to re-enable, delete the file\n",
2014 				file);
2015 			return 1;
2016 		}
2017 		p=line;
2018 		while(*p == ' ' || *p == '\t')
2019 			p++;
2020 		if(p[0]==0 || p[0]=='\n' || p[0]==';') continue;
2021 		/* this line is a line of content */
2022 		empty = 0;
2023 	}
2024 	fclose(in);
2025 	if(empty) {
2026 		if(verb) printf("%s is empty\n", file);
2027 		return 0;
2028 	}
2029 	if(verb) printf("%s has content\n", file);
2030 	return 2;
2031 }
2032 
2033 /** Write the builtin root anchor to a file */
2034 static void
2035 write_builtin_anchor(const char* file)
2036 {
2037 	const char* builtin_root_anchor = get_builtin_ds();
2038 	FILE* out = fopen(file, "w");
2039 	if(!out) {
2040 		printf("could not write builtin anchor, to file %s: %s\n",
2041 			file, strerror(errno));
2042 		return;
2043 	}
2044 	if(!fwrite(builtin_root_anchor, strlen(builtin_root_anchor), 1, out)) {
2045 		printf("could not complete write builtin anchor, to file %s: %s\n",
2046 			file, strerror(errno));
2047 	}
2048 	fclose(out);
2049 }
2050 
2051 /**
2052  * Check the root anchor file.
2053  * If does not exist, provide builtin and write file.
2054  * If empty, provide builtin and write file.
2055  * If trust-point-revoked-5011 file: make the program exit.
2056  * @param root_anchor_file: filename of the root anchor.
2057  * @param used_builtin: set to 1 if the builtin is written.
2058  * @return 0 if trustpoint is insecure, 1 on success.  Exit on failure.
2059  */
2060 static int
2061 provide_builtin(const char* root_anchor_file, int* used_builtin)
2062 {
2063 	/* try to read it */
2064 	switch(try_read_anchor(root_anchor_file))
2065 	{
2066 		case 0: /* no exist or empty */
2067 			write_builtin_anchor(root_anchor_file);
2068 			*used_builtin = 1;
2069 			break;
2070 		case 1: /* revoked tp */
2071 			return 0;
2072 		case 2: /* it is fine */
2073 		default:
2074 			break;
2075 	}
2076 	return 1;
2077 }
2078 
2079 /**
2080  * add an autotrust anchor for the root to the context
2081  */
2082 static void
2083 add_5011_probe_root(struct ub_ctx* ctx, const char* root_anchor_file)
2084 {
2085 	int r;
2086 	r = ub_ctx_set_option(ctx, "auto-trust-anchor-file:", root_anchor_file);
2087 	if(r) {
2088 		if(verb) printf("add 5011 probe to ctx: %s\n", ub_strerror(r));
2089 		ub_ctx_delete(ctx);
2090 		exit(0);
2091 	}
2092 }
2093 
2094 /**
2095  * Prime the root key and return the result.  Exit on error.
2096  * @param ctx: the unbound context to perform the priming with.
2097  * @return: the result of the prime, on error it exit()s.
2098  */
2099 static struct ub_result*
2100 prime_root_key(struct ub_ctx* ctx)
2101 {
2102 	struct ub_result* res = NULL;
2103 	int r;
2104 	r = ub_resolve(ctx, ".", LDNS_RR_TYPE_DNSKEY, LDNS_RR_CLASS_IN, &res);
2105 	if(r) {
2106 		if(verb) printf("resolve DNSKEY: %s\n", ub_strerror(r));
2107 		ub_ctx_delete(ctx);
2108 		exit(0);
2109 	}
2110 	if(!res) {
2111 		if(verb) printf("out of memory\n");
2112 		ub_ctx_delete(ctx);
2113 		exit(0);
2114 	}
2115 	return res;
2116 }
2117 
2118 /** see if ADDPEND keys exist in autotrust file (if possible) */
2119 static int
2120 read_if_pending_keys(const char* file)
2121 {
2122 	FILE* in = fopen(file, "r");
2123 	char line[8192];
2124 	if(!in) {
2125 		if(verb>=2) printf("%s: %s\n", file, strerror(errno));
2126 		return 0;
2127 	}
2128 	while(fgets(line, (int)sizeof(line), in)) {
2129 		if(line[0]==';') continue;
2130 		if(strstr(line, "[ ADDPEND ]")) {
2131 			fclose(in);
2132 			if(verb) printf("RFC5011-state has ADDPEND keys\n");
2133 			return 1;
2134 		}
2135 	}
2136 	fclose(in);
2137 	return 0;
2138 }
2139 
2140 /** read last successful probe time from autotrust file (if possible) */
2141 static int32_t
2142 read_last_success_time(const char* file)
2143 {
2144 	FILE* in = fopen(file, "r");
2145 	char line[1024];
2146 	if(!in) {
2147 		if(verb) printf("%s: %s\n", file, strerror(errno));
2148 		return 0;
2149 	}
2150 	while(fgets(line, (int)sizeof(line), in)) {
2151 		if(strncmp(line, ";;last_success: ", 16) == 0) {
2152 			char* e;
2153 			time_t x = (unsigned int)strtol(line+16, &e, 10);
2154 			fclose(in);
2155 			if(line+16 == e) {
2156 				if(verb) printf("failed to parse "
2157 					"last_success probe time\n");
2158 				return 0;
2159 			}
2160 			if(verb) printf("last successful probe: %s", ctime(&x));
2161 			return (int32_t)x;
2162 		}
2163 	}
2164 	fclose(in);
2165 	if(verb) printf("no last_success probe time in anchor file\n");
2166 	return 0;
2167 }
2168 
2169 /**
2170  * Read autotrust 5011 probe file and see if the date
2171  * compared to the current date allows a certupdate.
2172  * If the last successful probe was recent then 5011 cannot be behind,
2173  * and the failure cannot be solved with a certupdate.
2174  * The debugconf is to validation-override the date for testing.
2175  * @param root_anchor_file: filename of root key
2176  * @return true if certupdate is ok.
2177  */
2178 static int
2179 probe_date_allows_certupdate(const char* root_anchor_file)
2180 {
2181 	int has_pending_keys = read_if_pending_keys(root_anchor_file);
2182 	int32_t last_success = read_last_success_time(root_anchor_file);
2183 	int32_t now = (int32_t)time(NULL);
2184 	int32_t leeway = 30 * 24 * 3600; /* 30 days leeway */
2185 	/* if the date is before 2010-07-15:00.00.00 then the root has not
2186 	 * been signed yet, and thus we refuse to take action. */
2187 	if(time(NULL) < xml_convertdate("2010-07-15T00:00:00")) {
2188 		if(verb) printf("the date is before the root was first signed,"
2189 			" please correct the clock\n");
2190 		return 0;
2191 	}
2192 	if(last_success == 0)
2193 		return 1; /* no probe time */
2194 	if(has_pending_keys)
2195 		return 1; /* key in ADDPEND state, a previous probe has
2196 		inserted that, and it was present in all recent probes,
2197 		but it has not become active.  The 30 day timer may not have
2198 		expired, but we know(for sure) there is a rollover going on.
2199 		If we only managed to pickup the new key on its last day
2200 		of announcement (for example) this can happen. */
2201 	if(now - last_success < 0) {
2202 		if(verb) printf("the last successful probe is in the future,"
2203 			" clock was modified\n");
2204 		return 0;
2205 	}
2206 	if(now - last_success >= leeway) {
2207 		if(verb) printf("the last successful probe was more than 30 "
2208 			"days ago\n");
2209 		return 1;
2210 	}
2211 	if(verb) printf("the last successful probe is recent\n");
2212 	return 0;
2213 }
2214 
2215 static struct ub_result *
2216 fetch_root_key(const char* root_anchor_file, const char* res_conf,
2217 	const char* root_hints, const char* debugconf, const char* srcaddr,
2218 	int ip4only, int ip6only)
2219 {
2220 	struct ub_ctx* ctx;
2221 	struct ub_result* dnskey;
2222 
2223 	ctx = create_unbound_context(res_conf, root_hints, debugconf,
2224 		srcaddr, ip4only, ip6only);
2225 	add_5011_probe_root(ctx, root_anchor_file);
2226 	dnskey = prime_root_key(ctx);
2227 	ub_ctx_delete(ctx);
2228 	return dnskey;
2229 }
2230 
2231 /** perform the unbound-anchor work */
2232 static int
2233 do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
2234 	const char* urlname, const char* xmlname, const char* p7sname,
2235 	const char* p7signer, const char* res_conf, const char* root_hints,
2236 	const char* debugconf, const char* srcaddr, int ip4only, int ip6only,
2237 	int force, int res_conf_fallback, int port, int use_sni)
2238 {
2239 	struct ub_result* dnskey;
2240 	int used_builtin = 0;
2241 	int rcode;
2242 
2243 	/* see if builtin rootanchor needs to be provided, or if
2244 	 * rootanchor is 'revoked-trust-point' */
2245 	if(!provide_builtin(root_anchor_file, &used_builtin))
2246 		return 0;
2247 
2248 	/* make unbound context with 5011-probe for root anchor,
2249 	 * and probe . DNSKEY */
2250 	dnskey = fetch_root_key(root_anchor_file, res_conf,
2251 		root_hints, debugconf, srcaddr, ip4only, ip6only);
2252 	rcode = dnskey->rcode;
2253 
2254 	if (res_conf_fallback && res_conf && !dnskey->secure) {
2255 		if (verb) printf("%s failed, retrying direct\n", res_conf);
2256 		ub_resolve_free(dnskey);
2257 		/* try direct query without res_conf */
2258 		dnskey = fetch_root_key(root_anchor_file, NULL,
2259 			root_hints, debugconf, srcaddr, ip4only, ip6only);
2260 		if (rcode != 0 && dnskey->rcode == 0) {
2261 			res_conf = NULL;
2262 			rcode = 0;
2263 		}
2264 	}
2265 
2266 	/* if secure: exit */
2267 	if(dnskey->secure && !force) {
2268 		if(verb) printf("success: the anchor is ok\n");
2269 		ub_resolve_free(dnskey);
2270 		return used_builtin;
2271 	}
2272 	if(force && verb) printf("debug cert update forced\n");
2273 	ub_resolve_free(dnskey);
2274 
2275 	/* if not (and NOERROR): check date and do certupdate */
2276 	if((rcode == 0 &&
2277 		probe_date_allows_certupdate(root_anchor_file)) || force) {
2278 		if(do_certupdate(root_anchor_file, root_cert_file, urlname,
2279 			xmlname, p7sname, p7signer, res_conf, root_hints,
2280 			debugconf, srcaddr, ip4only, ip6only, port, use_sni))
2281 			return 1;
2282 		return used_builtin;
2283 	}
2284 	if(verb) printf("fail: the anchor is NOT ok and could not be fixed\n");
2285 	return used_builtin;
2286 }
2287 
2288 /** getopt global, in case header files fail to declare it. */
2289 extern int optind;
2290 /** getopt global, in case header files fail to declare it. */
2291 extern char* optarg;
2292 
2293 /** Main routine for unbound-anchor */
2294 int main(int argc, char* argv[])
2295 {
2296 	int c;
2297 	const char* root_anchor_file = ROOT_ANCHOR_FILE;
2298 	const char* root_cert_file = ROOT_CERT_FILE;
2299 	const char* urlname = URLNAME;
2300 	const char* xmlname = XMLNAME;
2301 	const char* p7sname = P7SNAME;
2302 	const char* p7signer = P7SIGNER;
2303 	const char* res_conf = NULL;
2304 	const char* root_hints = NULL;
2305 	const char* debugconf = NULL;
2306 	const char* srcaddr = NULL;
2307 	int dolist=0, ip4only=0, ip6only=0, force=0, port = HTTPS_PORT;
2308 	int res_conf_fallback = 0;
2309 	int use_sni = 1;
2310 	/* parse the options */
2311 	while( (c=getopt(argc, argv, "46C:FRSP:a:b:c:f:hln:r:s:u:vx:")) != -1) {
2312 		switch(c) {
2313 		case 'l':
2314 			dolist = 1;
2315 			break;
2316 		case '4':
2317 			ip4only = 1;
2318 			break;
2319 		case '6':
2320 			ip6only = 1;
2321 			break;
2322 		case 'a':
2323 			root_anchor_file = optarg;
2324 			break;
2325 		case 'b':
2326 			srcaddr = optarg;
2327 			break;
2328 		case 'c':
2329 			root_cert_file = optarg;
2330 			break;
2331 		case 'u':
2332 			urlname = optarg;
2333 			break;
2334 		case 'S':
2335 			use_sni = 0;
2336 			break;
2337 		case 'x':
2338 			xmlname = optarg;
2339 			break;
2340 		case 's':
2341 			p7sname = optarg;
2342 			break;
2343 		case 'n':
2344 			p7signer = optarg;
2345 			break;
2346 		case 'f':
2347 			res_conf = optarg;
2348 			break;
2349 		case 'r':
2350 			root_hints = optarg;
2351 			break;
2352 		case 'R':
2353 			res_conf_fallback = 1;
2354 			break;
2355 		case 'C':
2356 			debugconf = optarg;
2357 			break;
2358 		case 'F':
2359 			force = 1;
2360 			break;
2361 		case 'P':
2362 			port = atoi(optarg);
2363 			break;
2364 		case 'v':
2365 			verb++;
2366 			break;
2367 		case '?':
2368 		case 'h':
2369 		default:
2370 			usage();
2371 		}
2372 	}
2373 	argc -= optind;
2374 	/* argv += optind; not using further arguments */
2375 	if(argc != 0)
2376 		usage();
2377 
2378 #ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS
2379 	ERR_load_crypto_strings();
2380 #endif
2381 #if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
2382 	ERR_load_SSL_strings();
2383 #endif
2384 #if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
2385 #  ifndef S_SPLINT_S
2386 	OpenSSL_add_all_algorithms();
2387 #  endif
2388 #else
2389 	OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
2390 		| OPENSSL_INIT_ADD_ALL_DIGESTS
2391 		| OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
2392 #endif
2393 #if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
2394 	(void)SSL_library_init();
2395 #else
2396 	(void)OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL);
2397 #endif
2398 
2399 	if(dolist) do_list_builtin();
2400 
2401 	return do_root_update_work(root_anchor_file, root_cert_file, urlname,
2402 		xmlname, p7sname, p7signer, res_conf, root_hints, debugconf,
2403 		srcaddr, ip4only, ip6only, force, res_conf_fallback, port, use_sni);
2404 }
2405