static dns_name_t *name = NULL;
static dns_rdataclass_t rdclass = dns_rdataclass_in;
-/*
- * List of digest types used by ds_from_cdnskey(), filled in by add_dtype()
- * from -a arguments. The size of the array is an arbitrary limit.
- */
-static dns_dsdigest_t dtype[8];
-
static const char *startstr = NULL; /* from which we derive notbefore */
static isc_stdtime_t notbefore = 0; /* restrict sig inception times */
static dns_rdata_rrsig_t oldestsig; /* for recording inception time */
return (ISC_R_SUCCESS);
}
-/*
- * For sorting the digest types so that DS records generated
- * from CDNSKEY records are in canonical order.
- */
-static int
-cmp_dtype(const void *ap, const void *bp) {
- int a = *(const dns_dsdigest_t *)ap;
- int b = *(const dns_dsdigest_t *)bp;
- return (a - b);
-}
-
-static void
-add_dtype(const char *dn) {
- dns_dsdigest_t dt;
- unsigned i, n;
-
- dt = strtodsdigest(dn);
- n = sizeof(dtype)/sizeof(dtype[0]);
- for (i = 0; i < n; i++) {
- if (dtype[i] == 0 || dtype[i] == dt) {
- dtype[i] = dt;
- qsort(dtype, i+1, 1, cmp_dtype);
- return;
- }
- }
- fatal("too many -a digest type arguments");
-}
-
static void
make_new_ds_set(ds_maker_func_t *ds_from_rdata,
uint32_t ttl, dns_rdataset_t *rdset)
while ((ch = isc_commandline_parse(argc, argv, OPTIONS)) != -1) {
switch (ch) {
case 'a':
- add_dtype(isc_commandline_argument);
+ add_dtype(strtodsdigest(isc_commandline_argument));
break;
case 'c':
rdclass = strtoclass(isc_commandline_argument);
}
static void
-emit(dns_dsdigest_t dtype, bool showall, char *lookaside,
+emit(dns_dsdigest_t dt, bool showall, char *lookaside,
bool cds, dns_rdata_t *rdata)
{
isc_result_t result;
if ((dnskey.flags & DNS_KEYFLAG_KSK) == 0 && !showall)
return;
- result = dns_ds_buildrdata(name, rdata, dtype, buf, &ds);
+ result = dns_ds_buildrdata(name, rdata, dt, buf, &ds);
if (result != ISC_R_SUCCESS)
fatal("can't build record");
printf("%.*s\n", (int)r.length, r.base);
}
+static void
+emits(bool showall, char *lookaside, bool cds, dns_rdata_t *rdata) {
+ unsigned i, n;
+
+ n = sizeof(dtype)/sizeof(dtype[0]);
+ for (i = 0; i < n; i++) {
+ if (dtype[i] != 0) {
+ emit(dtype[i], showall, lookaside, cds, rdata);
+ }
+ }
+}
+
ISC_PLATFORM_NORETURN_PRE static void
usage(void) ISC_PLATFORM_NORETURN_POST;
char *lookaside = NULL;
char *endp;
int ch;
- dns_dsdigest_t dtype = DNS_DSDIGEST_SHA1;
- bool cds = false;
- bool both = true;
- bool usekeyset = false;
- bool showall = false;
+ bool cds = false;
+ bool usekeyset = false;
+ bool showall = false;
isc_result_t result;
isc_log_t *log = NULL;
dns_rdataset_t rdataset;
dns_rdata_init(&rdata);
- if (argc == 1)
+ if (argc == 1) {
usage();
+ }
result = isc_mem_create(0, 0, &mctx);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
fatal("out of memory");
+ }
#if USE_PKCS11
pk11_result_register();
while ((ch = isc_commandline_parse(argc, argv, OPTIONS)) != -1) {
switch (ch) {
case '1':
- dtype = DNS_DSDIGEST_SHA1;
- both = false;
+ add_dtype(DNS_DSDIGEST_SHA1);
break;
case '2':
- dtype = DNS_DSDIGEST_SHA256;
- both = false;
+ add_dtype(DNS_DSDIGEST_SHA256);
break;
case 'A':
showall = true;
break;
case 'a':
- dtype = strtodsdigest(isc_commandline_argument);
- both = false;
+ add_dtype(strtodsdigest(isc_commandline_argument));
break;
case 'C':
if (lookaside != NULL)
rdclass = strtoclass(classname);
- if (usekeyset && filename != NULL)
+ if (usekeyset && filename != NULL) {
fatal("cannot use both -s and -f");
+ }
/* When not using -f, -A is implicit */
- if (filename == NULL)
+ if (filename == NULL) {
showall = true;
+ }
- if (argc < isc_commandline_index + 1 && filename == NULL)
+ /* Default digest type if none specified. */
+ if (dtype[0] == 0) {
+ dtype[0] = DNS_DSDIGEST_SHA256;
+ }
+
+ if (argc < isc_commandline_index + 1 && filename == NULL) {
fatal("the key file name was not specified");
- if (argc > isc_commandline_index + 1)
+ }
+ if (argc > isc_commandline_index + 1) {
fatal("extraneous arguments");
+ }
result = dst_lib_init(mctx, NULL);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
fatal("could not initialize dst: %s",
isc_result_totext(result));
+ }
setup_logging(mctx, &log);
if (argc < isc_commandline_index + 1 && filename != NULL) {
/* using zone name as the zone file name */
namestr = filename;
- } else
+ } else {
namestr = argv[isc_commandline_index];
+ }
result = initname(namestr);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
fatal("could not initialize name %s", namestr);
+ }
- if (usekeyset)
+ if (usekeyset) {
result = loadkeyset(dir, &rdataset);
- else
+ } else {
result = loadset(filename, &rdataset);
+ }
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
fatal("could not load DNSKEY set: %s\n",
isc_result_totext(result));
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&rdataset)) {
+ result = dns_rdataset_next(&rdataset))
+ {
dns_rdata_init(&rdata);
dns_rdataset_current(&rdataset, &rdata);
- if (verbose > 2)
+ if (verbose > 2) {
logkey(&rdata);
+ }
- if (both) {
- emit(DNS_DSDIGEST_SHA1, showall, lookaside,
- cds, &rdata);
- emit(DNS_DSDIGEST_SHA256, showall, lookaside,
- cds, &rdata);
- } else
- emit(dtype, showall, lookaside, cds, &rdata);
+ emits(showall, lookaside, cds, &rdata);
}
} else {
unsigned char key_buf[DST_KEY_MAXSIZE];
loadkey(argv[isc_commandline_index], key_buf,
DST_KEY_MAXSIZE, &rdata);
- if (both) {
- emit(DNS_DSDIGEST_SHA1, showall, lookaside, cds,
- &rdata);
- emit(DNS_DSDIGEST_SHA256, showall, lookaside, cds,
- &rdata);
- } else
- emit(dtype, showall, lookaside, cds, &rdata);
+ emits(showall, lookaside, cds, &rdata);
}
- if (dns_rdataset_isassociated(&rdataset))
+ if (dns_rdataset_isassociated(&rdataset)) {
dns_rdataset_disassociate(&rdataset);
+ }
cleanup_logging(&log);
dst_lib_destroy();
dns_name_destroy();
- if (verbose > 10)
+ if (verbose > 10) {
isc_mem_stats(mctx, stdout);
+ }
isc_mem_destroy(&mctx);
fflush(stdout);
if (ferror(stdout)) {
fprintf(stderr, "write error\n");
return (1);
- } else
+ } else {
return (0);
+ }
}