goto fail;
}
+ kr_rrset_validation_ctx_t err_ctx;
z_import->svldr = kr_svldr_new_ctx(ds, dnskey, &dnskey_sigs->rrs,
- z_import->timestamp_rr);
+ z_import->timestamp_rr, &err_ctx);
if (!z_import->svldr) {
- kr_log_error(PREFILL, "failed to validate DNSKEY for `%s`\n", zone_name_str);
+ // log RRSIG stats; very similar to log_bogus_rrsig()
+ kr_log_error(PREFILL, "failed to validate DNSKEY for `%s` "
+ "(%u matching RRSIGs, %u expired, %u not yet valid, "
+ "%u invalid signer, %u invalid label count, %u invalid key, "
+ "%u invalid crypto, %u invalid NSEC)\n",
+ zone_name_str,
+ err_ctx.rrs_counters.matching_name_type,
+ err_ctx.rrs_counters.expired, err_ctx.rrs_counters.notyet,
+ err_ctx.rrs_counters.signer_invalid,
+ err_ctx.rrs_counters.labels_invalid,
+ err_ctx.rrs_counters.key_invalid,
+ err_ctx.rrs_counters.crypto_invalid,
+ err_ctx.rrs_counters.nsec_invalid);
ret = kr_error(ENOENT);
goto fail;
- /* TODO: more details about why validation failed.
- * Perhaps extend the SVLDR API to somehow return EDE code. */
}
//// Do all ZONEMD processing, if desired.
free(ctx);
}
struct kr_svldr_ctx * kr_svldr_new_ctx(const knot_rrset_t *ds, knot_rrset_t *dnskey,
- const knot_rdataset_t *dnskey_sigs, uint32_t timestamp)
+ const knot_rdataset_t *dnskey_sigs, uint32_t timestamp,
+ kr_rrset_validation_ctx_t *err_ctx)
{
// Basic init.
struct kr_svldr_ctx *ctx = calloc(1, sizeof(*ctx));
}
return ctx;
fail:
+ if (err_ctx)
+ memcpy(err_ctx, &ctx->vctx, sizeof(*err_ctx));
kr_svldr_free_ctx(ctx);
return NULL;
}
* - `ds` is assumed to be trusted, and it's used to validate `dnskey+dnskey_sigs`.
* - The TTL of `dnskey` may get trimmed.
* - The insides are placed on malloc heap (use _free_ctx).
+ * - `err_ctx` is optional, for use when error happens (but avoid the inside pointers)
*/
KR_EXPORT
struct kr_svldr_ctx * kr_svldr_new_ctx(const knot_rrset_t *ds, knot_rrset_t *dnskey,
- const knot_rdataset_t *dnskey_sigs, uint32_t timestamp);
+ const knot_rdataset_t *dnskey_sigs, uint32_t timestamp,
+ kr_rrset_validation_ctx_t *err_ctx);
/** Free the context. Passing NULL is OK. */
KR_EXPORT
void kr_svldr_free_ctx(struct kr_svldr_ctx *ctx);