dnssectool.c revision 70e5a7403f0e0a3bd292b8287c5fed5772c15270
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews/*
9eb24f1f84885d5c2e51a7f675264db398c31af7Tinderbox User * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and/or distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * copyright notice and this permission notice appear in all copies.
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews *
28a8f5b0de57d269cf2845c69cb6abe18cbd3b3aMark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * PERFORMANCE OF THIS SOFTWARE.
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews */
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews/* $Id: dnssectool.c,v 1.45 2007/06/19 23:46:59 tbox Exp $ */
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews/*! \file */
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
5b7abbef511cea0b568be0bc8d5b3120a0b9034dEvan Hunt/*%
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews * DNSSEC Support Routines.
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews */
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews#include <config.h>
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews
c6d4f781529d2f28693546b25b2967d44ec89e60Mark Andrews#include <stdlib.h>
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
dbb012765c735ee0d82dedb116cdc7cf18957814Evan Hunt#include <isc/buffer.h>
dbb012765c735ee0d82dedb116cdc7cf18957814Evan Hunt#include <isc/entropy.h>
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#include <isc/list.h>
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont#include <isc/mem.h>
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#include <isc/string.h>
22bed621ef87bc8b6c1fea599b02c4b38dd6bf48Mark Andrews#include <isc/time.h>
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews#include <isc/util.h>
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews#include <isc/print.h>
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews#include <dns/log.h>
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont#include <dns/name.h>
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont#include <dns/rdatastruct.h>
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont#include <dns/rdataclass.h>
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont#include <dns/rdatatype.h>
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews#include <dns/result.h>
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews#include <dns/secalg.h>
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews#include <dns/time.h>
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont#include "dnssectool.h"
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontextern int verbose;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontextern const char *program;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewstypedef struct entropysource entropysource_t;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewsstruct entropysource {
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_entropysource_t *source;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_mem_t *mctx;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont ISC_LINK(entropysource_t) link;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont};
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontstatic ISC_LIST(entropysource_t) sources;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewsstatic fatalcallback_t *fatalcallback = NULL;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontfatal(const char *format, ...) {
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont va_list args;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont fprintf(stderr, "%s: ", program);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont va_start(args, format);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont vfprintf(stderr, format, args);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews va_end(args);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews fprintf(stderr, "\n");
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews if (fatalcallback != NULL)
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt (*fatalcallback)();
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman exit(1);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontsetfatalcallback(fatalcallback_t *callback) {
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont fatalcallback = callback;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewsvoid
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewscheck_result(isc_result_t result, const char *message) {
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews if (result != ISC_R_SUCCESS)
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont fatal("%s: %s", message, isc_result_totext(result));
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewsvbprintf(int level, const char *fmt, ...) {
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews va_list ap;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews if (level > verbose)
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews return;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont va_start(ap, fmt);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont fprintf(stderr, "%s: ", program);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont vfprintf(stderr, fmt, ap);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont va_end(ap);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewsvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Duponttype_format(const dns_rdatatype_t type, char *cp, unsigned int size) {
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_buffer_t b;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_region_t r;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_result_t result;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_buffer_init(&b, cp, size - 1);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont result = dns_rdatatype_totext(type, &b);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont check_result(result, "dns_rdatatype_totext()");
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews isc_buffer_usedregion(&b, &r);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews r.base[r.length] = 0;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews}
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaramanvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontalg_format(const dns_secalg_t alg, char *cp, unsigned int size) {
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_buffer_t b;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_region_t r;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_result_t result;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_buffer_init(&b, cp, size - 1);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews result = dns_secalg_totext(alg, &b);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews check_result(result, "dns_secalg_totext()");
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews isc_buffer_usedregion(&b, &r);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews r.base[r.length] = 0;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontsig_format(dns_rdata_rrsig_t *sig, char *cp, unsigned int size) {
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews char namestr[DNS_NAME_FORMATSIZE];
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews char algstr[DNS_NAME_FORMATSIZE];
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews dns_name_format(&sig->signer, namestr, sizeof(namestr));
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont alg_format(sig->algorithm, algstr, sizeof(algstr));
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont snprintf(cp, size, "%s/%s/%d", namestr, algstr, sig->keyid);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontkey_format(const dst_key_t *key, char *cp, unsigned int size) {
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews char namestr[DNS_NAME_FORMATSIZE];
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont char algstr[DNS_NAME_FORMATSIZE];
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont dns_name_format(dst_key_name(key), namestr, sizeof(namestr));
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont alg_format((dns_secalg_t) dst_key_alg(key), algstr, sizeof(algstr));
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont snprintf(cp, size, "%s/%s/%d", namestr, algstr, dst_key_id(key));
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrewssetup_logging(int verbose, isc_mem_t *mctx, isc_log_t **logp) {
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews isc_result_t result;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews isc_logdestination_t destination;
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt isc_logconfig_t *logconfig = NULL;
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman isc_log_t *log = NULL;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont int level;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont if (verbose < 0)
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont verbose = 0;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont switch (verbose) {
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont case 0:
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews /*
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews * We want to see warnings about things like out-of-zone
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews * data in the master file even when not verbose.
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews */
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont level = ISC_LOG_WARNING;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont break;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont case 1:
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont level = ISC_LOG_INFO;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews break;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews default:
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews level = ISC_LOG_DEBUG(verbose - 2 + 1);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews break;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont }
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont RUNTIME_CHECK(isc_log_create(mctx, &log, &logconfig) == ISC_R_SUCCESS);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_log_setcontext(log);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont dns_log_init(log);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont dns_log_setcontext(log);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont RUNTIME_CHECK(isc_log_settag(logconfig, program) == ISC_R_SUCCESS);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont /*
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont * Set up a channel similar to default_stderr except:
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont * - the logging level is passed in
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont * - the program name and logging level are printed
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont * - no time stamp is printed
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont */
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews destination.file.stream = stderr;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews destination.file.name = NULL;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews destination.file.versions = ISC_LOG_ROLLNEVER;
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt destination.file.maximum_size = 0;
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman result = isc_log_createchannel(logconfig, "stderr",
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont ISC_LOG_TOFILEDESC,
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont level,
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont &destination,
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont ISC_LOG_PRINTTAG|ISC_LOG_PRINTLEVEL);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont check_result(result, "isc_log_createchannel()");
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews RUNTIME_CHECK(isc_log_usechannel(logconfig, "stderr",
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews NULL, NULL) == ISC_R_SUCCESS);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews *logp = log;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontcleanup_logging(isc_log_t **logp) {
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews isc_log_t *log;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews REQUIRE(logp != NULL);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont log = *logp;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont if (log == NULL)
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont return;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_log_destroy(&log);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_log_setcontext(NULL);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont dns_log_setcontext(NULL);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews logp = NULL;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont}
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontvoid
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupontsetup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) {
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_result_t result;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont isc_entropysource_t *source = NULL;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont entropysource_t *elt;
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont int usekeyboard = ISC_ENTROPY_KEYBOARDMAYBE;
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews REQUIRE(ectx != NULL);
76af83c9adb772f7b045c62cf8b411165bfaa5efMark Andrews
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt if (*ectx == NULL) {
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman result = isc_entropy_create(mctx, ectx);
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont if (result != ISC_R_SUCCESS)
c1d7e0562f6a72ecc07ab5140cf2b88183adbd08Francis Dupont fatal("could not create entropy object");
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt ISC_LIST_INIT(sources);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt }
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) {
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews usekeyboard = ISC_ENTROPY_KEYBOARDYES;
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews randomfile = NULL;
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews }
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews result = isc_entropy_usebestsource(*ectx, &source, randomfile,
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews usekeyboard);
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews if (result != ISC_R_SUCCESS)
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews fatal("could not initialize entropy source: %s",
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews isc_result_totext(result));
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews if (source != NULL) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt elt = isc_mem_get(mctx, sizeof(*elt));
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (elt == NULL)
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews fatal("out of memory");
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt elt->source = source;
c40906dfad6dd6e3a3e3c94b8c8847bc9bc064e5Mark Andrews elt->mctx = mctx;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt ISC_LINK_INIT(elt, link);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt ISC_LIST_APPEND(sources, elt, link);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt }
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt}
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntvoid
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntcleanup_entropy(isc_entropy_t **ectx) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt entropysource_t *source;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt while (!ISC_LIST_EMPTY(sources)) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt source = ISC_LIST_HEAD(sources);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt ISC_LIST_UNLINK(sources, source, link);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt isc_entropy_destroysource(&source->source);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt isc_mem_put(source->mctx, source, sizeof(*source));
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt }
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt isc_entropy_detach(ectx);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt}
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontisc_stdtime_t
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstrtotime(const char *str, isc_int64_t now, isc_int64_t base) {
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont isc_int64_t val, offset;
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont isc_result_t result;
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont char *endp;
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont if (str[0] == '+') {
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont offset = strtol(str + 1, &endp, 0);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont if (*endp != '\0')
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont fatal("time value %s is invalid", str);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont val = base + offset;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt } else if (strncmp(str, "now+", 4) == 0) {
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont offset = strtol(str + 4, &endp, 0);
acbb301e648b82fcc38b876a44403cf0fe539cc9Evan Hunt if (*endp != '\0')
acbb301e648b82fcc38b876a44403cf0fe539cc9Evan Hunt fatal("time value %s is invalid", str);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt val = now + offset;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt } else if (strlen(str) == 8U) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt char timestr[15];
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt sprintf(timestr, "%s000000", str);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt result = dns_time64_fromtext(timestr, &val);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (result != ISC_R_SUCCESS)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt fatal("time value %s is invalid", str);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt } else {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt result = dns_time64_fromtext(str, &val);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (result != ISC_R_SUCCESS)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt fatal("time value %s is invalid", str);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt }
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt return ((isc_stdtime_t) val);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt}
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaramandns_rdataclass_t
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntstrtoclass(const char *str) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt isc_textregion_t r;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt dns_rdataclass_t rdclass;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt isc_result_t ret;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (str == NULL)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt return dns_rdataclass_in;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt DE_CONST(str, r.base);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt r.length = strlen(str);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt ret = dns_rdataclass_fromtext(&rdclass, &r);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (ret != ISC_R_SUCCESS)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt fatal("unknown class %s", str);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt return (rdclass);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt}
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt