]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/unbound/smallapp/unbound-anchor.c
Upgrade to 1.8.1.
[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(BIO_s_mem());
1094         if(!m) {
1095                 if(verb) printf("out of memory\n");
1096                 free(data);
1097                 exit(0);
1098         }
1099         BIO_write(m, data, (int)len);
1100         free(data);
1101         return m;
1102 }
1103
1104 /** https to an IP addr, return BIO with pathname or NULL */
1105 static BIO*
1106 https_to_ip(struct ip_list* ip, const char* pathname, const char* urlname)
1107 {
1108         int fd;
1109         SSL* ssl;
1110         BIO* bio;
1111         SSL_CTX* sslctx = setup_sslctx();
1112         if(!sslctx) {
1113                 return NULL;
1114         }
1115         fd = connect_to_ip(ip);
1116         if(fd == -1) {
1117                 SSL_CTX_free(sslctx);
1118                 return NULL;
1119         }
1120         ssl = TLS_initiate(sslctx, fd);
1121         if(!ssl) {
1122                 SSL_CTX_free(sslctx);
1123                 fd_close(fd);
1124                 return NULL;
1125         }
1126         if(!write_http_get(ssl, pathname, urlname)) {
1127                 if(verb) printf("could not write to server\n");
1128                 SSL_free(ssl);
1129                 SSL_CTX_free(sslctx);
1130                 fd_close(fd);
1131                 return NULL;
1132         }
1133         bio = read_http_result(ssl);
1134         TLS_shutdown(fd, ssl, sslctx);
1135         return bio;
1136 }
1137
1138 /**
1139  * Do a HTTPS, HTTP1.1 over TLS, to fetch a file
1140  * @param ip_list: list of IP addresses to use to fetch from.
1141  * @param pathname: pathname of file on server to GET.
1142  * @param urlname: name to pass as the virtual host for this request.
1143  * @return a memory BIO with the file in it.
1144  */
1145 static BIO*
1146 https(struct ip_list* ip_list, const char* pathname, const char* urlname)
1147 {
1148         struct ip_list* ip;
1149         BIO* bio = NULL;
1150         /* try random address first, and work through the list */
1151         wipe_ip_usage(ip_list);
1152         while( (ip = pick_random_ip(ip_list)) ) {
1153                 ip->used = 1;
1154                 bio = https_to_ip(ip, pathname, urlname);
1155                 if(bio) break;
1156         }
1157         if(!bio) {
1158                 if(verb) printf("could not fetch %s\n", pathname);
1159                 exit(0);
1160         } else {
1161                 if(verb) printf("fetched %s (%d bytes)\n",
1162                         pathname, (int)BIO_ctrl_pending(bio));
1163         }
1164         return bio;
1165 }
1166
1167 /** XML parse private data during the parse */
1168 struct xml_data {
1169         /** the parser, reference */
1170         XML_Parser parser;
1171         /** the current tag; malloced; or NULL outside of tags */
1172         char* tag;
1173         /** current date to use during the parse */
1174         time_t date;
1175         /** number of keys usefully read in */
1176         int num_keys;
1177         /** the compiled anchors as DS records */
1178         BIO* ds;
1179
1180         /** do we want to use this anchor? */
1181         int use_key;
1182         /** the current anchor: Zone */
1183         BIO* czone;
1184         /** the current anchor: KeyTag */
1185         BIO* ctag;
1186         /** the current anchor: Algorithm */
1187         BIO* calgo;
1188         /** the current anchor: DigestType */
1189         BIO* cdigtype;
1190         /** the current anchor: Digest*/
1191         BIO* cdigest;
1192 };
1193
1194 /** The BIO for the tag */
1195 static BIO*
1196 xml_selectbio(struct xml_data* data, const char* tag)
1197 {
1198         BIO* b = NULL;
1199         if(strcasecmp(tag, "KeyTag") == 0)
1200                 b = data->ctag;
1201         else if(strcasecmp(tag, "Algorithm") == 0)
1202                 b = data->calgo;
1203         else if(strcasecmp(tag, "DigestType") == 0)
1204                 b = data->cdigtype;
1205         else if(strcasecmp(tag, "Digest") == 0)
1206                 b = data->cdigest;
1207         return b;
1208 }
1209
1210 /**
1211  * XML handle character data, the data inside an element.
1212  * @param userData: xml_data structure
1213  * @param s: the character data.  May not all be in one callback.
1214  *      NOT zero terminated.
1215  * @param len: length of this part of the data.
1216  */
1217 static void
1218 xml_charhandle(void *userData, const XML_Char *s, int len)
1219 {
1220         struct xml_data* data = (struct xml_data*)userData;
1221         BIO* b = NULL;
1222         /* skip characters outside of elements */
1223         if(!data->tag)
1224                 return;
1225         if(verb>=4) {
1226                 int i;
1227                 printf("%s%s charhandle: '",
1228                         data->use_key?"use ":"",
1229                         data->tag?data->tag:"none");
1230                 for(i=0; i<len; i++)
1231                         printf("%c", s[i]);
1232                 printf("'\n");
1233         }
1234         if(strcasecmp(data->tag, "Zone") == 0) {
1235                 if(BIO_write(data->czone, s, len) < 0) {
1236                         if(verb) printf("out of memory in BIO_write\n");
1237                         exit(0);
1238                 }
1239                 return;
1240         }
1241         /* only store if key is used */
1242         if(!data->use_key)
1243                 return;
1244         b = xml_selectbio(data, data->tag);
1245         if(b) {
1246                 if(BIO_write(b, s, len) < 0) {
1247                         if(verb) printf("out of memory in BIO_write\n");
1248                         exit(0);
1249                 }
1250         }
1251 }
1252
1253 /**
1254  * XML fetch value of particular attribute(by name) or NULL if not present.
1255  * @param atts: attribute array (from xml_startelem).
1256  * @param name: name of attribute to look for.
1257  * @return the value or NULL. (ptr into atts).
1258  */
1259 static const XML_Char*
1260 find_att(const XML_Char **atts, const XML_Char* name)
1261 {
1262         int i;
1263         for(i=0; atts[i]; i+=2) {
1264                 if(strcasecmp(atts[i], name) == 0)
1265                         return atts[i+1];
1266         }
1267         return NULL;
1268 }
1269
1270 /**
1271  * XML convert DateTime element to time_t.
1272  * [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
1273  * (with optional .ssssss fractional seconds)
1274  * @param str: the string
1275  * @return a time_t representation or 0 on failure.
1276  */
1277 static time_t
1278 xml_convertdate(const char* str)
1279 {
1280         time_t t = 0;
1281         struct tm tm;
1282         const char* s;
1283         /* for this application, ignore minus in front;
1284          * only positive dates are expected */
1285         s = str;
1286         if(s[0] == '-') s++;
1287         memset(&tm, 0, sizeof(tm));
1288         /* parse initial content of the string (lots of whitespace allowed) */
1289         s = strptime(s, "%t%Y%t-%t%m%t-%t%d%tT%t%H%t:%t%M%t:%t%S%t", &tm);
1290         if(!s) {
1291                 if(verb) printf("xml_convertdate parse failure %s\n", str);
1292                 return 0;
1293         }
1294         /* parse remainder of date string */
1295         if(*s == '.') {
1296                 /* optional '.' and fractional seconds */
1297                 int frac = 0, n = 0;
1298                 if(sscanf(s+1, "%d%n", &frac, &n) < 1) {
1299                         if(verb) printf("xml_convertdate f failure %s\n", str);
1300                         return 0;
1301                 }
1302                 /* fraction is not used, time_t has second accuracy */
1303                 s++;
1304                 s+=n;
1305         }
1306         if(*s == 'Z' || *s == 'z') {
1307                 /* nothing to do for this */
1308                 s++;
1309         } else if(*s == '+' || *s == '-') {
1310                 /* optional timezone spec: Z or +hh:mm or -hh:mm */
1311                 int hr = 0, mn = 0, n = 0;
1312                 if(sscanf(s+1, "%d:%d%n", &hr, &mn, &n) < 2) {
1313                         if(verb) printf("xml_convertdate tz failure %s\n", str);
1314                         return 0;
1315                 }
1316                 if(*s == '+') {
1317                         tm.tm_hour += hr;
1318                         tm.tm_min += mn;
1319                 } else {
1320                         tm.tm_hour -= hr;
1321                         tm.tm_min -= mn;
1322                 }
1323                 s++;
1324                 s += n;
1325         }
1326         if(*s != 0) {
1327                 /* not ended properly */
1328                 /* but ignore, (lenient) */
1329         }
1330
1331         t = sldns_mktime_from_utc(&tm);
1332         if(t == (time_t)-1) {
1333                 if(verb) printf("xml_convertdate mktime failure\n");
1334                 return 0;
1335         }
1336         return t;
1337 }
1338
1339 /**
1340  * XML handle the KeyDigest start tag, check validity periods.
1341  */
1342 static void
1343 handle_keydigest(struct xml_data* data, const XML_Char **atts)
1344 {
1345         data->use_key = 0;
1346         if(find_att(atts, "validFrom")) {
1347                 time_t from = xml_convertdate(find_att(atts, "validFrom"));
1348                 if(from == 0) {
1349                         if(verb) printf("error: xml cannot be parsed\n");
1350                         exit(0);
1351                 }
1352                 if(data->date < from)
1353                         return;
1354         }
1355         if(find_att(atts, "validUntil")) {
1356                 time_t until = xml_convertdate(find_att(atts, "validUntil"));
1357                 if(until == 0) {
1358                         if(verb) printf("error: xml cannot be parsed\n");
1359                         exit(0);
1360                 }
1361                 if(data->date > until)
1362                         return;
1363         }
1364         /* yes we want to use this key */
1365         data->use_key = 1;
1366         (void)BIO_reset(data->ctag);
1367         (void)BIO_reset(data->calgo);
1368         (void)BIO_reset(data->cdigtype);
1369         (void)BIO_reset(data->cdigest);
1370 }
1371
1372 /** See if XML element equals the zone name */
1373 static int
1374 xml_is_zone_name(BIO* zone, const char* name)
1375 {
1376         char buf[1024];
1377         char* z = NULL;
1378         long zlen;
1379         (void)BIO_seek(zone, 0);
1380         zlen = BIO_get_mem_data(zone, &z);
1381         if(!zlen || !z) return 0;
1382         /* zero terminate */
1383         if(zlen >= (long)sizeof(buf)) return 0;
1384         memmove(buf, z, (size_t)zlen);
1385         buf[zlen] = 0;
1386         /* compare */
1387         return (strncasecmp(buf, name, strlen(name)) == 0);
1388 }
1389
1390 /** 
1391  * XML start of element. This callback is called whenever an XML tag starts.
1392  * XML_Char is UTF8.
1393  * @param userData: the xml_data structure.
1394  * @param name: the tag that starts.
1395  * @param atts: array of strings, pairs of attr = value, ends with NULL.
1396  *      i.e. att[0]="att[1]" att[2]="att[3]" att[4]isNull
1397  */
1398 static void
1399 xml_startelem(void *userData, const XML_Char *name, const XML_Char **atts)
1400 {
1401         struct xml_data* data = (struct xml_data*)userData;
1402         BIO* b;
1403         if(verb>=4) printf("xml tag start '%s'\n", name);
1404         free(data->tag);
1405         data->tag = strdup(name);
1406         if(!data->tag) {
1407                 if(verb) printf("out of memory\n");
1408                 exit(0);
1409         }
1410         if(verb>=4) {
1411                 int i;
1412                 for(i=0; atts[i]; i+=2) {
1413                         printf("  %s='%s'\n", atts[i], atts[i+1]);
1414                 }
1415         }
1416         /* handle attributes to particular types */
1417         if(strcasecmp(name, "KeyDigest") == 0) {
1418                 handle_keydigest(data, atts);
1419                 return;
1420         } else if(strcasecmp(name, "Zone") == 0) {
1421                 (void)BIO_reset(data->czone);
1422                 return;
1423         }
1424
1425         /* for other types we prepare to pick up the data */
1426         if(!data->use_key)
1427                 return;
1428         b = xml_selectbio(data, data->tag);
1429         if(b) {
1430                 /* empty it */
1431                 (void)BIO_reset(b);
1432         }
1433 }
1434
1435 /** Append str to bio */
1436 static void
1437 xml_append_str(BIO* b, const char* s)
1438 {
1439         if(BIO_write(b, s, (int)strlen(s)) < 0) {
1440                 if(verb) printf("out of memory in BIO_write\n");
1441                 exit(0);
1442         }
1443 }
1444
1445 /** Append bio to bio */
1446 static void
1447 xml_append_bio(BIO* b, BIO* a)
1448 {
1449         char* z = NULL;
1450         long i, len;
1451         (void)BIO_seek(a, 0);
1452         len = BIO_get_mem_data(a, &z);
1453         if(!len || !z) {
1454                 if(verb) printf("out of memory in BIO_write\n");
1455                 exit(0);
1456         }
1457         /* remove newlines in the data here */
1458         for(i=0; i<len; i++) {
1459                 if(z[i] == '\r' || z[i] == '\n')
1460                         z[i] = ' ';
1461         }
1462         /* write to BIO */
1463         if(BIO_write(b, z, len) < 0) {
1464                 if(verb) printf("out of memory in BIO_write\n");
1465                 exit(0);
1466         }
1467 }
1468
1469 /** write the parsed xml-DS to the DS list */
1470 static void
1471 xml_append_ds(struct xml_data* data)
1472 {
1473         /* write DS to accumulated DS */
1474         xml_append_str(data->ds, ". IN DS ");
1475         xml_append_bio(data->ds, data->ctag);
1476         xml_append_str(data->ds, " ");
1477         xml_append_bio(data->ds, data->calgo);
1478         xml_append_str(data->ds, " ");
1479         xml_append_bio(data->ds, data->cdigtype);
1480         xml_append_str(data->ds, " ");
1481         xml_append_bio(data->ds, data->cdigest);
1482         xml_append_str(data->ds, "\n");
1483         data->num_keys++;
1484 }
1485
1486 /**
1487  * XML end of element. This callback is called whenever an XML tag ends.
1488  * XML_Char is UTF8.
1489  * @param userData: the xml_data structure
1490  * @param name: the tag that ends.
1491  */
1492 static void
1493 xml_endelem(void *userData, const XML_Char *name)
1494 {
1495         struct xml_data* data = (struct xml_data*)userData;
1496         if(verb>=4) printf("xml tag end   '%s'\n", name);
1497         free(data->tag);
1498         data->tag = NULL;
1499         if(strcasecmp(name, "KeyDigest") == 0) {
1500                 if(data->use_key)
1501                         xml_append_ds(data);
1502                 data->use_key = 0;
1503         } else if(strcasecmp(name, "Zone") == 0) {
1504                 if(!xml_is_zone_name(data->czone, ".")) {
1505                         if(verb) printf("xml not for the right zone\n");
1506                         exit(0);
1507                 }
1508         }
1509 }
1510
1511 /* Stop the parser when an entity declaration is encountered. For safety. */
1512 static void
1513 xml_entitydeclhandler(void *userData,
1514         const XML_Char *ATTR_UNUSED(entityName),
1515         int ATTR_UNUSED(is_parameter_entity),
1516         const XML_Char *ATTR_UNUSED(value), int ATTR_UNUSED(value_length),
1517         const XML_Char *ATTR_UNUSED(base),
1518         const XML_Char *ATTR_UNUSED(systemId),
1519         const XML_Char *ATTR_UNUSED(publicId),
1520         const XML_Char *ATTR_UNUSED(notationName))
1521 {
1522 #if HAVE_DECL_XML_STOPPARSER
1523         (void)XML_StopParser((XML_Parser)userData, XML_FALSE);
1524 #else
1525         (void)userData;
1526 #endif
1527 }
1528
1529 /**
1530  * XML parser setup of the callbacks for the tags
1531  */
1532 static void
1533 xml_parse_setup(XML_Parser parser, struct xml_data* data, time_t now)
1534 {
1535         char buf[1024];
1536         memset(data, 0, sizeof(*data));
1537         XML_SetUserData(parser, data);
1538         data->parser = parser;
1539         data->date = now;
1540         data->ds = BIO_new(BIO_s_mem());
1541         data->ctag = BIO_new(BIO_s_mem());
1542         data->czone = BIO_new(BIO_s_mem());
1543         data->calgo = BIO_new(BIO_s_mem());
1544         data->cdigtype = BIO_new(BIO_s_mem());
1545         data->cdigest = BIO_new(BIO_s_mem());
1546         if(!data->ds || !data->ctag || !data->calgo || !data->czone ||
1547                 !data->cdigtype || !data->cdigest) {
1548                 if(verb) printf("out of memory\n");
1549                 exit(0);
1550         }
1551         snprintf(buf, sizeof(buf), "; created by unbound-anchor on %s",
1552                 ctime(&now));
1553         if(BIO_write(data->ds, buf, (int)strlen(buf)) < 0) {
1554                 if(verb) printf("out of memory\n");
1555                 exit(0);
1556         }
1557         XML_SetEntityDeclHandler(parser, xml_entitydeclhandler);
1558         XML_SetElementHandler(parser, xml_startelem, xml_endelem);
1559         XML_SetCharacterDataHandler(parser, xml_charhandle);
1560 }
1561
1562 /**
1563  * Perform XML parsing of the root-anchors file
1564  * Its format description can be read here
1565  * https://data.iana.org/root-anchors/draft-icann-dnssec-trust-anchor.txt
1566  * It uses libexpat.
1567  * @param xml: BIO with xml data.
1568  * @param now: the current time for checking DS validity periods.
1569  * @return memoryBIO with the DS data in zone format.
1570  *      or NULL if the zone is insecure.
1571  *      (It exit()s on error)
1572  */
1573 static BIO*
1574 xml_parse(BIO* xml, time_t now)
1575 {
1576         char* pp;
1577         int len;
1578         XML_Parser parser;
1579         struct xml_data data;
1580
1581         parser = XML_ParserCreate(NULL);
1582         if(!parser) {
1583                 if(verb) printf("could not XML_ParserCreate\n");
1584                 exit(0);
1585         }
1586
1587         /* setup callbacks */
1588         xml_parse_setup(parser, &data, now);
1589
1590         /* parse it */
1591         (void)BIO_seek(xml, 0);
1592         len = (int)BIO_get_mem_data(xml, &pp);
1593         if(!len || !pp) {
1594                 if(verb) printf("out of memory\n");
1595                 exit(0);
1596         }
1597         if(!XML_Parse(parser, pp, len, 1 /*isfinal*/ )) {
1598                 const char *e = XML_ErrorString(XML_GetErrorCode(parser));
1599                 if(verb) printf("XML_Parse failure %s\n", e?e:"");
1600                 exit(0);
1601         }
1602
1603         /* parsed */
1604         if(verb) printf("XML was parsed successfully, %d keys\n",
1605                         data.num_keys);
1606         free(data.tag);
1607         XML_ParserFree(parser);
1608
1609         if(verb >= 4) {
1610                 (void)BIO_seek(data.ds, 0);
1611                 len = BIO_get_mem_data(data.ds, &pp);
1612                 printf("got DS bio %d: '", len);
1613                 if(!fwrite(pp, (size_t)len, 1, stdout))
1614                         /* compilers do not allow us to ignore fwrite .. */
1615                         fprintf(stderr, "error writing to stdout\n");
1616                 printf("'\n");
1617         }
1618         BIO_free(data.czone);
1619         BIO_free(data.ctag);
1620         BIO_free(data.calgo);
1621         BIO_free(data.cdigtype);
1622         BIO_free(data.cdigest);
1623
1624         if(data.num_keys == 0) {
1625                 /* the root zone seems to have gone insecure */
1626                 BIO_free(data.ds);
1627                 return NULL;
1628         } else {
1629                 return data.ds;
1630         }
1631 }
1632
1633 /* get key usage out of its extension, returns 0 if no key_usage extension */
1634 static unsigned long
1635 get_usage_of_ex(X509* cert)
1636 {
1637         unsigned long val = 0;
1638         ASN1_BIT_STRING* s;
1639         if((s=X509_get_ext_d2i(cert, NID_key_usage, NULL, NULL))) {
1640                 if(s->length > 0) {
1641                         val = s->data[0];
1642                         if(s->length > 1)
1643                                 val |= s->data[1] << 8;
1644                 }
1645                 ASN1_BIT_STRING_free(s);
1646         }
1647         return val;
1648 }
1649
1650 /** get valid signers from the list of signers in the signature */
1651 static STACK_OF(X509)*
1652 get_valid_signers(PKCS7* p7, const char* p7signer)
1653 {
1654         int i;
1655         STACK_OF(X509)* validsigners = sk_X509_new_null();
1656         STACK_OF(X509)* signers = PKCS7_get0_signers(p7, NULL, 0);
1657         unsigned long usage = 0;
1658         if(!validsigners) {
1659                 if(verb) printf("out of memory\n");
1660                 sk_X509_free(signers);
1661                 return NULL;
1662         }
1663         if(!signers) {
1664                 if(verb) printf("no signers in pkcs7 signature\n");
1665                 sk_X509_free(validsigners);
1666                 return NULL;
1667         }
1668         for(i=0; i<sk_X509_num(signers); i++) {
1669                 X509_NAME* nm = X509_get_subject_name(
1670                         sk_X509_value(signers, i));
1671                 char buf[1024];
1672                 if(!nm) {
1673                         if(verb) printf("signer %d: cert has no subject name\n", i);
1674                         continue;
1675                 }
1676                 if(verb && nm) {
1677                         char* nmline = X509_NAME_oneline(nm, buf,
1678                                 (int)sizeof(buf));
1679                         printf("signer %d: Subject: %s\n", i,
1680                                 nmline?nmline:"no subject");
1681                         if(verb >= 3 && X509_NAME_get_text_by_NID(nm,
1682                                 NID_commonName, buf, (int)sizeof(buf)))
1683                                 printf("commonName: %s\n", buf);
1684                         if(verb >= 3 && X509_NAME_get_text_by_NID(nm,
1685                                 NID_pkcs9_emailAddress, buf, (int)sizeof(buf)))
1686                                 printf("emailAddress: %s\n", buf);
1687                 }
1688                 if(verb) {
1689                         int ku_loc = X509_get_ext_by_NID(
1690                                 sk_X509_value(signers, i), NID_key_usage, -1);
1691                         if(verb >= 3 && ku_loc >= 0) {
1692                                 X509_EXTENSION *ex = X509_get_ext(
1693                                         sk_X509_value(signers, i), ku_loc);
1694                                 if(ex) {
1695                                         printf("keyUsage: ");
1696                                         X509V3_EXT_print_fp(stdout, ex, 0, 0);
1697                                         printf("\n");
1698                                 }
1699                         }
1700                 }
1701                 if(!p7signer || strcmp(p7signer, "")==0) {
1702                         /* there is no name to check, return all records */
1703                         if(verb) printf("did not check commonName of signer\n");
1704                 } else {
1705                         if(!X509_NAME_get_text_by_NID(nm,
1706                                 NID_pkcs9_emailAddress,
1707                                 buf, (int)sizeof(buf))) {
1708                                 if(verb) printf("removed cert with no name\n");
1709                                 continue; /* no name, no use */
1710                         }
1711                         if(strcmp(buf, p7signer) != 0) {
1712                                 if(verb) printf("removed cert with wrong name\n");
1713                                 continue; /* wrong name, skip it */
1714                         }
1715                 }
1716
1717                 /* check that the key usage allows digital signatures
1718                  * (the p7s) */
1719                 usage = get_usage_of_ex(sk_X509_value(signers, i));
1720                 if(!(usage & KU_DIGITAL_SIGNATURE)) {
1721                         if(verb) printf("removed cert with no key usage Digital Signature allowed\n");
1722                         continue;
1723                 }
1724
1725                 /* we like this cert, add it to our list of valid
1726                  * signers certificates */
1727                 sk_X509_push(validsigners, sk_X509_value(signers, i));
1728         }
1729         sk_X509_free(signers);
1730         return validsigners;
1731 }
1732
1733 /** verify a PKCS7 signature, false on failure */
1734 static int
1735 verify_p7sig(BIO* data, BIO* p7s, STACK_OF(X509)* trust, const char* p7signer)
1736 {
1737         PKCS7* p7;
1738         X509_STORE *store = X509_STORE_new();
1739         STACK_OF(X509)* validsigners;
1740         int secure = 0;
1741         int i;
1742 #ifdef X509_V_FLAG_CHECK_SS_SIGNATURE
1743         X509_VERIFY_PARAM* param = X509_VERIFY_PARAM_new();
1744         if(!param) {
1745                 if(verb) printf("out of memory\n");
1746                 X509_STORE_free(store);
1747                 return 0;
1748         }
1749         /* do the selfcheck on the root certificate; it checks that the
1750          * input is valid */
1751         X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CHECK_SS_SIGNATURE);
1752         if(store) X509_STORE_set1_param(store, param);
1753 #endif
1754         if(!store) {
1755                 if(verb) printf("out of memory\n");
1756 #ifdef X509_V_FLAG_CHECK_SS_SIGNATURE
1757                 X509_VERIFY_PARAM_free(param);
1758 #endif
1759                 return 0;
1760         }
1761 #ifdef X509_V_FLAG_CHECK_SS_SIGNATURE
1762         X509_VERIFY_PARAM_free(param);
1763 #endif
1764
1765         (void)BIO_seek(p7s, 0);
1766         (void)BIO_seek(data, 0);
1767
1768         /* convert p7s to p7 (the signature) */
1769         p7 = d2i_PKCS7_bio(p7s, NULL);
1770         if(!p7) {
1771                 if(verb) printf("could not parse p7s signature file\n");
1772                 X509_STORE_free(store);
1773                 return 0;
1774         }
1775         if(verb >= 2) printf("parsed the PKCS7 signature\n");
1776
1777         /* convert trust to trusted certificate store */
1778         for(i=0; i<sk_X509_num(trust); i++) {
1779                 if(!X509_STORE_add_cert(store, sk_X509_value(trust, i))) {
1780                         if(verb) printf("failed X509_STORE_add_cert\n");
1781                         X509_STORE_free(store);
1782                         PKCS7_free(p7);
1783                         return 0;
1784                 }
1785         }
1786         if(verb >= 2) printf("setup the X509_STORE\n");
1787
1788         /* check what is in the Subject name of the certificates,
1789          * and build a stack that contains only the right certificates */
1790         validsigners = get_valid_signers(p7, p7signer);
1791         if(!validsigners) {
1792                         X509_STORE_free(store);
1793                         PKCS7_free(p7);
1794                         return 0;
1795         }
1796         if(PKCS7_verify(p7, validsigners, store, data, NULL, PKCS7_NOINTERN) == 1) {
1797                 secure = 1;
1798                 if(verb) printf("the PKCS7 signature verified\n");
1799         } else {
1800                 if(verb) {
1801                         ERR_print_errors_fp(stdout);
1802                 }
1803         }
1804
1805         sk_X509_free(validsigners);
1806         X509_STORE_free(store);
1807         PKCS7_free(p7);
1808         return secure;
1809 }
1810
1811 /** write unsigned root anchor file, a 5011 revoked tp */
1812 static void
1813 write_unsigned_root(const char* root_anchor_file)
1814 {
1815         FILE* out;
1816         time_t now = time(NULL);
1817         out = fopen(root_anchor_file, "w");
1818         if(!out) {
1819                 if(verb) printf("%s: %s\n", root_anchor_file, strerror(errno));
1820                 return;
1821         }
1822         if(fprintf(out, "; autotrust trust anchor file\n"
1823                 ";;REVOKED\n"
1824                 ";;id: . 1\n"
1825                 "; This file was written by unbound-anchor on %s"
1826                 "; It indicates that the root does not use DNSSEC\n"
1827                 "; to restart DNSSEC overwrite this file with a\n"
1828                 "; valid trustanchor or (empty-it and run unbound-anchor)\n"
1829                 , ctime(&now)) < 0) {
1830                 if(verb) printf("failed to write 'unsigned' to %s\n",
1831                         root_anchor_file);
1832                 if(verb && errno != 0) printf("%s\n", strerror(errno));
1833         }
1834         fflush(out);
1835 #ifdef HAVE_FSYNC
1836         fsync(fileno(out));
1837 #else
1838         FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(out)));
1839 #endif
1840         fclose(out);
1841 }
1842
1843 /** write root anchor file */
1844 static void
1845 write_root_anchor(const char* root_anchor_file, BIO* ds)
1846 {
1847         char* pp = NULL;
1848         int len;
1849         FILE* out;
1850         (void)BIO_seek(ds, 0);
1851         len = BIO_get_mem_data(ds, &pp);
1852         if(!len || !pp) {
1853                 if(verb) printf("out of memory\n");
1854                 return;
1855         }
1856         out = fopen(root_anchor_file, "w");
1857         if(!out) {
1858                 if(verb) printf("%s: %s\n", root_anchor_file, strerror(errno));
1859                 return;
1860         }
1861         if(fwrite(pp, (size_t)len, 1, out) != 1) {
1862                 if(verb) printf("failed to write all data to %s\n",
1863                         root_anchor_file);
1864                 if(verb && errno != 0) printf("%s\n", strerror(errno));
1865         }
1866         fflush(out);
1867 #ifdef HAVE_FSYNC
1868         fsync(fileno(out));
1869 #else
1870         FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(out)));
1871 #endif
1872         fclose(out);
1873 }
1874
1875 /** Perform the verification and update of the trustanchor file */
1876 static void
1877 verify_and_update_anchor(const char* root_anchor_file, BIO* xml, BIO* p7s,
1878         STACK_OF(X509)* cert, const char* p7signer)
1879 {
1880         BIO* ds;
1881
1882         /* verify xml file */
1883         if(!verify_p7sig(xml, p7s, cert, p7signer)) {
1884                 printf("the PKCS7 signature failed\n");
1885                 exit(0);
1886         }
1887
1888         /* parse the xml file into DS records */
1889         ds = xml_parse(xml, time(NULL));
1890         if(!ds) {
1891                 /* the root zone is unsigned now */
1892                 write_unsigned_root(root_anchor_file);
1893         } else {
1894                 /* reinstate 5011 tracking */
1895                 write_root_anchor(root_anchor_file, ds);
1896         }
1897         BIO_free(ds);
1898 }
1899
1900 #ifdef USE_WINSOCK
1901 static void do_wsa_cleanup(void) { WSACleanup(); }
1902 #endif
1903
1904 /** perform actual certupdate work */
1905 static int
1906 do_certupdate(const char* root_anchor_file, const char* root_cert_file,
1907         const char* urlname, const char* xmlname, const char* p7sname,
1908         const char* p7signer, const char* res_conf, const char* root_hints,
1909         const char* debugconf, int ip4only, int ip6only, int port)
1910 {
1911         STACK_OF(X509)* cert;
1912         BIO *xml, *p7s;
1913         struct ip_list* ip_list = NULL;
1914
1915         /* read pem file or provide builtin */
1916         cert = read_cert_or_builtin(root_cert_file);
1917
1918         /* lookup A, AAAA for the urlname (or parse urlname if IP address) */
1919         ip_list = resolve_name(urlname, port, res_conf, root_hints, debugconf,
1920                 ip4only, ip6only);
1921
1922 #ifdef USE_WINSOCK
1923         if(1) { /* libunbound finished, startup WSA for the https connection */
1924                 WSADATA wsa_data;
1925                 int r;
1926                 if((r = WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) {
1927                         if(verb) printf("WSAStartup failed: %s\n",
1928                                 wsa_strerror(r));
1929                         exit(0);
1930                 }
1931                 atexit(&do_wsa_cleanup);
1932         }
1933 #endif
1934
1935         /* fetch the necessary files over HTTPS */
1936         xml = https(ip_list, xmlname, urlname);
1937         p7s = https(ip_list, p7sname, urlname);
1938
1939         /* verify and update the root anchor */
1940         verify_and_update_anchor(root_anchor_file, xml, p7s, cert, p7signer);
1941         if(verb) printf("success: the anchor has been updated "
1942                         "using the cert\n");
1943
1944         BIO_free(xml);
1945         BIO_free(p7s);
1946 #ifndef S_SPLINT_S
1947         sk_X509_pop_free(cert, X509_free);
1948 #endif
1949         ip_list_free(ip_list);
1950         return 1;
1951 }
1952
1953 /**
1954  * Try to read the root RFC5011 autotrust anchor file,
1955  * @param file: filename.
1956  * @return:
1957  *      0 if does not exist or empty
1958  *      1 if trust-point-revoked-5011
1959  *      2 if it is OK.
1960  */
1961 static int
1962 try_read_anchor(const char* file)
1963 {
1964         int empty = 1;
1965         char line[10240];
1966         char* p;
1967         FILE* in = fopen(file, "r");
1968         if(!in) {
1969                 /* only if the file does not exist, can we fix it */
1970                 if(errno != ENOENT) {
1971                         if(verb) printf("%s: %s\n", file, strerror(errno));
1972                         if(verb) printf("error: cannot access the file\n");
1973                         exit(0);
1974                 }
1975                 if(verb) printf("%s does not exist\n", file);
1976                 return 0;
1977         }
1978         while(fgets(line, (int)sizeof(line), in)) {
1979                 line[sizeof(line)-1] = 0;
1980                 if(strncmp(line, ";;REVOKED", 9) == 0) {
1981                         fclose(in);
1982                         if(verb) printf("%s : the trust point is revoked\n"
1983                                 "and the zone is considered unsigned.\n"
1984                                 "if you wish to re-enable, delete the file\n",
1985                                 file);
1986                         return 1;
1987                 }
1988                 p=line;
1989                 while(*p == ' ' || *p == '\t')
1990                         p++;
1991                 if(p[0]==0 || p[0]=='\n' || p[0]==';') continue;
1992                 /* this line is a line of content */
1993                 empty = 0;
1994         }
1995         fclose(in);
1996         if(empty) {
1997                 if(verb) printf("%s is empty\n", file);
1998                 return 0;
1999         }
2000         if(verb) printf("%s has content\n", file);
2001         return 2;
2002 }
2003
2004 /** Write the builtin root anchor to a file */
2005 static void
2006 write_builtin_anchor(const char* file)
2007 {
2008         const char* builtin_root_anchor = get_builtin_ds();
2009         FILE* out = fopen(file, "w");
2010         if(!out) {
2011                 if(verb) printf("%s: %s\n", file, strerror(errno));
2012                 if(verb) printf("  could not write builtin anchor\n");
2013                 return;
2014         }
2015         if(!fwrite(builtin_root_anchor, strlen(builtin_root_anchor), 1, out)) {
2016                 if(verb) printf("%s: %s\n", file, strerror(errno));
2017                 if(verb) printf("  could not complete write builtin anchor\n");
2018         }
2019         fclose(out);
2020 }
2021
2022 /** 
2023  * Check the root anchor file.
2024  * If does not exist, provide builtin and write file.
2025  * If empty, provide builtin and write file.
2026  * If trust-point-revoked-5011 file: make the program exit.
2027  * @param root_anchor_file: filename of the root anchor.
2028  * @param used_builtin: set to 1 if the builtin is written.
2029  * @return 0 if trustpoint is insecure, 1 on success.  Exit on failure.
2030  */
2031 static int
2032 provide_builtin(const char* root_anchor_file, int* used_builtin)
2033 {
2034         /* try to read it */
2035         switch(try_read_anchor(root_anchor_file))
2036         {
2037                 case 0: /* no exist or empty */
2038                         write_builtin_anchor(root_anchor_file);
2039                         *used_builtin = 1;
2040                         break;
2041                 case 1: /* revoked tp */
2042                         return 0;       
2043                 case 2: /* it is fine */
2044                 default:
2045                         break;
2046         }
2047         return 1;
2048 }
2049
2050 /**
2051  * add an autotrust anchor for the root to the context
2052  */
2053 static void
2054 add_5011_probe_root(struct ub_ctx* ctx, const char* root_anchor_file)
2055 {
2056         int r;
2057         r = ub_ctx_set_option(ctx, "auto-trust-anchor-file:", root_anchor_file);
2058         if(r) {
2059                 if(verb) printf("add 5011 probe to ctx: %s\n", ub_strerror(r));
2060                 ub_ctx_delete(ctx);
2061                 exit(0);
2062         }
2063 }
2064
2065 /**
2066  * Prime the root key and return the result.  Exit on error.
2067  * @param ctx: the unbound context to perform the priming with.
2068  * @return: the result of the prime, on error it exit()s.
2069  */
2070 static struct ub_result*
2071 prime_root_key(struct ub_ctx* ctx)
2072 {
2073         struct ub_result* res = NULL;
2074         int r;
2075         r = ub_resolve(ctx, ".", LDNS_RR_TYPE_DNSKEY, LDNS_RR_CLASS_IN, &res);
2076         if(r) {
2077                 if(verb) printf("resolve DNSKEY: %s\n", ub_strerror(r));
2078                 ub_ctx_delete(ctx);
2079                 exit(0);
2080         }
2081         if(!res) {
2082                 if(verb) printf("out of memory\n");
2083                 ub_ctx_delete(ctx);
2084                 exit(0);
2085         }
2086         return res;
2087 }
2088
2089 /** see if ADDPEND keys exist in autotrust file (if possible) */
2090 static int
2091 read_if_pending_keys(const char* file)
2092 {
2093         FILE* in = fopen(file, "r");
2094         char line[8192];
2095         if(!in) {
2096                 if(verb>=2) printf("%s: %s\n", file, strerror(errno));
2097                 return 0;
2098         }
2099         while(fgets(line, (int)sizeof(line), in)) {
2100                 if(line[0]==';') continue;
2101                 if(strstr(line, "[ ADDPEND ]")) {
2102                         fclose(in);
2103                         if(verb) printf("RFC5011-state has ADDPEND keys\n");
2104                         return 1;
2105                 }
2106         }
2107         fclose(in);
2108         return 0;
2109 }
2110
2111 /** read last successful probe time from autotrust file (if possible) */
2112 static int32_t
2113 read_last_success_time(const char* file)
2114 {
2115         FILE* in = fopen(file, "r");
2116         char line[1024];
2117         if(!in) {
2118                 if(verb) printf("%s: %s\n", file, strerror(errno));
2119                 return 0;
2120         }
2121         while(fgets(line, (int)sizeof(line), in)) {
2122                 if(strncmp(line, ";;last_success: ", 16) == 0) {
2123                         char* e;
2124                         time_t x = (unsigned int)strtol(line+16, &e, 10);
2125                         fclose(in);
2126                         if(line+16 == e) {
2127                                 if(verb) printf("failed to parse "
2128                                         "last_success probe time\n");
2129                                 return 0;
2130                         }
2131                         if(verb) printf("last successful probe: %s", ctime(&x));
2132                         return (int32_t)x;
2133                 }
2134         }
2135         fclose(in);
2136         if(verb) printf("no last_success probe time in anchor file\n");
2137         return 0;
2138 }
2139
2140 /**
2141  * Read autotrust 5011 probe file and see if the date
2142  * compared to the current date allows a certupdate.
2143  * If the last successful probe was recent then 5011 cannot be behind,
2144  * and the failure cannot be solved with a certupdate.
2145  * The debugconf is to validation-override the date for testing.
2146  * @param root_anchor_file: filename of root key
2147  * @return true if certupdate is ok.
2148  */
2149 static int
2150 probe_date_allows_certupdate(const char* root_anchor_file)
2151 {
2152         int has_pending_keys = read_if_pending_keys(root_anchor_file);
2153         int32_t last_success = read_last_success_time(root_anchor_file);
2154         int32_t now = (int32_t)time(NULL);
2155         int32_t leeway = 30 * 24 * 3600; /* 30 days leeway */
2156         /* if the date is before 2010-07-15:00.00.00 then the root has not
2157          * been signed yet, and thus we refuse to take action. */
2158         if(time(NULL) < xml_convertdate("2010-07-15T00:00:00")) {
2159                 if(verb) printf("the date is before the root was first signed,"
2160                         " please correct the clock\n");
2161                 return 0;
2162         }
2163         if(last_success == 0)
2164                 return 1; /* no probe time */
2165         if(has_pending_keys)
2166                 return 1; /* key in ADDPEND state, a previous probe has
2167                 inserted that, and it was present in all recent probes,
2168                 but it has not become active.  The 30 day timer may not have
2169                 expired, but we know(for sure) there is a rollover going on.
2170                 If we only managed to pickup the new key on its last day
2171                 of announcement (for example) this can happen. */
2172         if(now - last_success < 0) {
2173                 if(verb) printf("the last successful probe is in the future,"
2174                         " clock was modified\n");
2175                 return 0;
2176         }
2177         if(now - last_success >= leeway) {
2178                 if(verb) printf("the last successful probe was more than 30 "
2179                         "days ago\n");
2180                 return 1;
2181         }
2182         if(verb) printf("the last successful probe is recent\n");
2183         return 0;
2184 }
2185
2186 static struct ub_result *
2187 fetch_root_key(const char* root_anchor_file, const char* res_conf,
2188         const char* root_hints, const char* debugconf,
2189         int ip4only, int ip6only)
2190 {
2191         struct ub_ctx* ctx;
2192         struct ub_result* dnskey;
2193
2194         ctx = create_unbound_context(res_conf, root_hints, debugconf,
2195                 ip4only, ip6only);
2196         add_5011_probe_root(ctx, root_anchor_file);
2197         dnskey = prime_root_key(ctx);
2198         ub_ctx_delete(ctx);
2199         return dnskey;
2200 }
2201
2202 /** perform the unbound-anchor work */
2203 static int
2204 do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
2205         const char* urlname, const char* xmlname, const char* p7sname,
2206         const char* p7signer, const char* res_conf, const char* root_hints,
2207         const char* debugconf, int ip4only, int ip6only, int force,
2208         int res_conf_fallback, int port)
2209 {
2210         struct ub_result* dnskey;
2211         int used_builtin = 0;
2212         int rcode;
2213
2214         /* see if builtin rootanchor needs to be provided, or if
2215          * rootanchor is 'revoked-trust-point' */
2216         if(!provide_builtin(root_anchor_file, &used_builtin))
2217                 return 0;
2218
2219         /* make unbound context with 5011-probe for root anchor,
2220          * and probe . DNSKEY */
2221         dnskey = fetch_root_key(root_anchor_file, res_conf,
2222                 root_hints, debugconf, ip4only, ip6only);
2223         rcode = dnskey->rcode;
2224
2225         if (res_conf_fallback && res_conf && !dnskey->secure) {
2226                 if (verb) printf("%s failed, retrying direct\n", res_conf);
2227                 ub_resolve_free(dnskey);
2228                 /* try direct query without res_conf */
2229                 dnskey = fetch_root_key(root_anchor_file, NULL,
2230                         root_hints, debugconf, ip4only, ip6only);
2231                 if (rcode != 0 && dnskey->rcode == 0) {
2232                         res_conf = NULL;
2233                         rcode = 0;
2234                 }
2235         }
2236
2237         /* if secure: exit */
2238         if(dnskey->secure && !force) {
2239                 if(verb) printf("success: the anchor is ok\n");
2240                 ub_resolve_free(dnskey);
2241                 return used_builtin;
2242         }
2243         if(force && verb) printf("debug cert update forced\n");
2244         ub_resolve_free(dnskey);
2245
2246         /* if not (and NOERROR): check date and do certupdate */
2247         if((rcode == 0 &&
2248                 probe_date_allows_certupdate(root_anchor_file)) || force) {
2249                 if(do_certupdate(root_anchor_file, root_cert_file, urlname,
2250                         xmlname, p7sname, p7signer, res_conf, root_hints,
2251                         debugconf, ip4only, ip6only, port))
2252                         return 1;
2253                 return used_builtin;
2254         }
2255         if(verb) printf("fail: the anchor is NOT ok and could not be fixed\n");
2256         return used_builtin;
2257 }
2258
2259 /** getopt global, in case header files fail to declare it. */
2260 extern int optind;
2261 /** getopt global, in case header files fail to declare it. */
2262 extern char* optarg;
2263
2264 /** Main routine for unbound-anchor */
2265 int main(int argc, char* argv[])
2266 {
2267         int c;
2268         const char* root_anchor_file = ROOT_ANCHOR_FILE;
2269         const char* root_cert_file = ROOT_CERT_FILE;
2270         const char* urlname = URLNAME;
2271         const char* xmlname = XMLNAME;
2272         const char* p7sname = P7SNAME;
2273         const char* p7signer = P7SIGNER;
2274         const char* res_conf = NULL;
2275         const char* root_hints = NULL;
2276         const char* debugconf = NULL;
2277         int dolist=0, ip4only=0, ip6only=0, force=0, port = HTTPS_PORT;
2278         int res_conf_fallback = 0;
2279         /* parse the options */
2280         while( (c=getopt(argc, argv, "46C:FRP:a:c:f:hln:r:s:u:vx:")) != -1) {
2281                 switch(c) {
2282                 case 'l':
2283                         dolist = 1;
2284                         break;
2285                 case '4':
2286                         ip4only = 1;
2287                         break;
2288                 case '6':
2289                         ip6only = 1;
2290                         break;
2291                 case 'a':
2292                         root_anchor_file = optarg;
2293                         break;
2294                 case 'c':
2295                         root_cert_file = optarg;
2296                         break;
2297                 case 'u':
2298                         urlname = optarg;
2299                         break;
2300                 case 'x':
2301                         xmlname = optarg;
2302                         break;
2303                 case 's':
2304                         p7sname = optarg;
2305                         break;
2306                 case 'n':
2307                         p7signer = optarg;
2308                         break;
2309                 case 'f':
2310                         res_conf = optarg;
2311                         break;
2312                 case 'r':
2313                         root_hints = optarg;
2314                         break;
2315                 case 'R':
2316                         res_conf_fallback = 1;
2317                         break;
2318                 case 'C':
2319                         debugconf = optarg;
2320                         break;
2321                 case 'F':
2322                         force = 1;
2323                         break;
2324                 case 'P':
2325                         port = atoi(optarg);
2326                         break;
2327                 case 'v':
2328                         verb++;
2329                         break;
2330                 case '?':
2331                 case 'h':
2332                 default:
2333                         usage();
2334                 }
2335         }
2336         argc -= optind;
2337         /* argv += optind; not using further arguments */
2338         if(argc != 0)
2339                 usage();
2340
2341 #ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS
2342         ERR_load_crypto_strings();
2343 #endif
2344 #if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
2345         ERR_load_SSL_strings();
2346 #endif
2347 #if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
2348         OpenSSL_add_all_algorithms();
2349 #else
2350         OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
2351                 | OPENSSL_INIT_ADD_ALL_DIGESTS
2352                 | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
2353 #endif
2354 #if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
2355         (void)SSL_library_init();
2356 #else
2357         (void)OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL);
2358 #endif
2359
2360         if(dolist) do_list_builtin();
2361
2362         return do_root_update_work(root_anchor_file, root_cert_file, urlname,
2363                 xmlname, p7sname, p7signer, res_conf, root_hints, debugconf,
2364                 ip4only, ip6only, force, res_conf_fallback, port);
2365 }