dns_dnsseckey_create(mctx, &privkey, &key);
} else {
dns_dnsseckey_create(mctx, &pubkey, &key);
+ key->pubkey = true;
}
- key->force_publish = false;
- key->force_sign = false;
key->index = keycount++;
ISC_LIST_APPEND(keylist, key, link);
}
while (result == ISC_R_SUCCESS) {
- bool expired, future;
+ bool expired, refresh, future, offline;
bool keep = false, resign = false;
dns_rdataset_current(&sigset, &sigrdata);
future = isc_serial_lt(now, rrsig.timesigned);
key = keythatsigned(&rrsig);
+ offline = key->pubkey;
sig_format(&rrsig, sigstr, sizeof(sigstr));
- expired = isc_serial_gt(now + cycle, rrsig.timeexpire);
+ expired = isc_serial_gt(now, rrsig.timeexpire);
+ refresh = isc_serial_gt(now + cycle, rrsig.timeexpire);
if (isc_serial_gt(rrsig.timesigned, rrsig.timeexpire)) {
/* rrsig is dropped and not replaced */
} else if (issigningkey(key)) {
wassignedby[key->index] = true;
- if (!expired && rrsig.originalttl == set->ttl &&
+ if (!refresh && rrsig.originalttl == set->ttl &&
setverifies(name, set, key->key, &sigrdata))
{
vbprintf(2, "\trrsig by %s retained\n", sigstr);
keep = true;
+ } else if (offline) {
+ vbprintf(2,
+ "\trrsig by %s retained - private key "
+ "missing\n",
+ sigstr);
+ keep = true;
} else {
vbprintf(2, "\trrsig by %s dropped - %s\n",
sigstr,
- expired ? "expired"
+ refresh ? "refresh"
: rrsig.originalttl != set->ttl
? "ttl change"
: "failed to "
} else if (iszonekey(key)) {
wassignedby[key->index] = true;
- if (!expired && rrsig.originalttl == set->ttl &&
+ if (!refresh && rrsig.originalttl == set->ttl &&
setverifies(name, set, key->key, &sigrdata))
{
vbprintf(2, "\trrsig by %s retained\n", sigstr);
keep = true;
+ } else if (offline) {
+ vbprintf(2,
+ "\trrsig by %s retained - private key "
+ "missing\n",
+ sigstr);
+ keep = true;
} else {
vbprintf(2, "\trrsig by %s dropped - %s\n",
sigstr,
- expired ? "expired"
+ refresh ? "refresh"
: rrsig.originalttl != set->ttl
? "ttl change"
: "failed to "
"verify");
}
- } else if (!expired) {
+ } else if (!refresh) {
vbprintf(2, "\trrsig by %s retained\n", sigstr);
keep = true;
} else {
- vbprintf(2, "\trrsig by %s expired\n", sigstr);
+ vbprintf(2, "\trrsig by %s %s\n", sigstr,
+ expired ? "expired" : "needs refresh");
}
if (keep) {
dk->hint_remove = false;
dk->first_sign = false;
dk->is_active = false;
+ dk->pubkey = false;
dk->purge = false;
dk->prepublish = 0;
dk->source = dns_keysource_unknown;
*/
static void
addkey(dns_dnsseckeylist_t *keylist, dst_key_t **newkey, bool savekeys,
- isc_mem_t *mctx) {
+ bool pubkey_only, isc_mem_t *mctx) {
dns_dnsseckey_t *key = NULL;
/* Skip duplicates */
}
dns_dnsseckey_create(mctx, newkey, &key);
+ key->pubkey = pubkey_only;
if (key->legacy || savekeys) {
key->force_publish = true;
key->force_sign = dst_key_isprivate(key->key);
}
if (publickey) {
- addkey(keylist, &dnskey, savekeys, mctx);
+ addkey(keylist, &dnskey, savekeys, true, mctx);
goto skip;
}
addkey:
if (result == ISC_R_FILENOTFOUND || result == ISC_R_NOPERM) {
if (pubkey != NULL) {
- addkey(keylist, &pubkey, savekeys, mctx);
+ addkey(keylist, &pubkey, savekeys, true, mctx);
} else {
- addkey(keylist, &dnskey, savekeys, mctx);
+ addkey(keylist, &dnskey, savekeys, false, mctx);
}
goto skip;
}
*/
dst_key_setttl(privkey, dst_key_getttl(dnskey));
- addkey(keylist, &privkey, savekeys, mctx);
+ addkey(keylist, &privkey, savekeys, false, mctx);
skip:
if (dnskey != NULL) {
dst_key_free(&dnskey);