*/
/*
- * $Id: dnssec.c,v 1.113 2009/11/23 23:48:16 tbox Exp $
+ * $Id: dnssec.c,v 1.114 2009/11/24 03:42:32 each Exp $
*/
/*! \file */
DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
directory,
mctx, &keys[count]);
+
+ /*
+ * If the key was revoked and the private file
+ * doesn't exist, maybe it was revoked internally
+ * by named. Try loading the unrevoked version.
+ */
+ if (result == ISC_R_FILENOTFOUND) {
+ isc_uint32_t flags;
+ flags = dst_key_flags(pubkey);
+ if ((flags & DNS_KEYFLAG_REVOKE) != 0) {
+ dst_key_setflags(pubkey,
+ flags & ~DNS_KEYFLAG_REVOKE);
+ result = dst_key_fromfile(dst_key_name(pubkey),
+ dst_key_id(pubkey),
+ dst_key_alg(pubkey),
+ DST_TYPE_PUBLIC|
+ DST_TYPE_PRIVATE,
+ directory,
+ mctx, &keys[count]);
+ if (result == ISC_R_SUCCESS &&
+ dst_key_pubcompare(pubkey, keys[count],
+ ISC_FALSE)) {
+ dst_key_setflags(keys[count], flags);
+ }
+ dst_key_setflags(pubkey, flags);
+ }
+ }
+
if (result == ISC_R_FILENOTFOUND) {
keys[count] = pubkey;
pubkey = NULL;
count++;
goto next;
}
+
if (result != ISC_R_SUCCESS)
goto failure;
RETERR(make_dnskey(key->key, buf, sizeof(buf), &dnskey));
dns_secalg_format(dst_key_alg(key->key), alg, sizeof(alg));
- report("Fetching %s %d/%s from key %s\n",
+ report("Fetching %s %d/%s from key %s.",
key->ksk ? (allzsk ? "KSK/ZSK" : "KSK") : "ZSK",
dst_key_id(key->key), alg,
key->source == dns_keysource_user ? "file" : "repository");
char alg[80];
dns_secalg_format(dst_key_alg(key->key), alg, sizeof(alg));
- report("Removing %s key %d/%s from DNSKEY RRset.\n",
+ report("Removing %s key %d/%s from DNSKEY RRset.",
reason, dst_key_id(key->key), alg);
RETERR(make_dnskey(key->key, buf, sizeof(buf), &dnskey));
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zone.c,v 1.531 2009/11/23 02:55:41 each Exp $ */
+/* $Id: zone.c,v 1.532 2009/11/24 03:42:32 each Exp $ */
/*! \file */
continue;
/* Calculate the signature, creating a RRSIG RDATA. */
+ isc_buffer_clear(&buffer);
CHECK(dns_dnssec_sign(name, &rdataset, keys[i],
&inception, &expire,
mctx, &buffer, &sig_rdata));
result = ISC_R_SUCCESS;
return (result);
}
+
dns_rdataset_init(&rdataset);
isc_buffer_init(&buffer, data, sizeof(data));
seen_rr = seen_soa = seen_ns = seen_dname = seen_nsec =
if (signed_with_key(db, node, version, rdataset.type, key))
goto next_rdataset;
/* Calculate the signature, creating a RRSIG RDATA. */
+ isc_buffer_clear(&buffer);
CHECK(dns_dnssec_sign(name, &rdataset, key, &inception,
&expire, mctx, &buffer, &rdata));
/* Update the database and journal with the RRSIG. */
* Find the key we want to remove.
*/
if (ALG(zone_keys[i]) == signing->algorithm &&
- dst_key_id(zone_keys[i]) == signing->keyid) {
+ dst_key_id(zone_keys[i]) == signing->keyid)
+ {
if (KSK(zone_keys[i]))
dst_key_free(&zone_keys[i]);
continue;
break;
}
}
- if (both)
+ if (both || REVOKE(zone_keys[i]))
is_ksk = KSK(zone_keys[i]);
else
is_ksk = ISC_FALSE;
for (i = 0; i < nkeys; i++)
dst_key_free(&zone_keys[i]);
- INSIST(node == NULL);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
if (version != NULL) {
dns_db_closeversion(db, &version, ISC_FALSE);
dns_dbnode_t *node = NULL;
dns_dbversion_t *ver = NULL;
dns_rdataset_t soaset, soasigs, keyset, keysigs;
- dns_dnsseckeylist_t dnskeys, keys, oldkeys;
+ dns_dnsseckeylist_t dnskeys, keys, rmkeys;
dns_dnsseckey_t *key;
dns_diff_t diff;
isc_boolean_t commit = ISC_FALSE;
ISC_LIST_INIT(dnskeys);
ISC_LIST_INIT(keys);
- ISC_LIST_INIT(oldkeys);
+ ISC_LIST_INIT(rmkeys);
dns_rdataset_init(&soaset);
dns_rdataset_init(&soasigs);
dns_rdataset_init(&keyset);
isc_boolean_t check_ksk;
check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
- CHECK(dns_dnssec_updatekeys(&dnskeys, &keys, &oldkeys,
+ CHECK(dns_dnssec_updatekeys(&dnskeys, &keys, &rmkeys,
&zone->origin, ttl, &diff,
ISC_TF(!check_ksk), mctx, logmsg));
if (!ISC_LIST_EMPTY(diff.tuples)) {
dns_db_closeversion(db, &ver, commit);
if (commit) {
- for (key = ISC_LIST_HEAD(oldkeys);
+ for (key = ISC_LIST_HEAD(rmkeys);
key != NULL;
key = ISC_LIST_NEXT(key, link)) {
zone_signwithkey(zone, dst_key_alg(key->key),
* key metadata indicates there is a key change event
* scheduled in the future, set the key refresh timer.
*/
-//HERE
-dns_zone_log(zone, ISC_LOG_NOTICE, "1");
if (!DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_MAINTAIN))
break;
-dns_zone_log(zone, ISC_LOG_NOTICE, "2");
result = next_keyevent(key->key, &then);
if (result != ISC_R_SUCCESS)
continue;
-dns_zone_log(zone, ISC_LOG_NOTICE, "3");
isc_time_set(&timethen, then, 0);
if (isc_time_isepoch(&zone->refreshkeytime) ||
isc_time_compare(&timethen, &zone->refreshkeytime) < 0) {
-//HERE
-dns_zone_log(zone, ISC_LOG_NOTICE, "setting refreshkeytime to %d\n", then);
zone->refreshkeytime = timethen;
zone_settimer(zone, &timenow);
}
clear_keylist(&dnskeys, mctx);
clear_keylist(&keys, mctx);
- clear_keylist(&oldkeys, mctx);
+ clear_keylist(&rmkeys, mctx);
if (ver != NULL)
dns_db_closeversion(db, &ver, ISC_FALSE);