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