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