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