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