DNSSEC17 (dnssec17)

Status: Final

Purpose

  • Validate CDNSKEY RRsets against DNSKEY data and CDNSKEY signatures, including delete semantics and signature/keytag consistency checks.

Preconditions And Inputs

  • Preconditions:
    • A zone.Zone object is available.
  • Required inputs:
    • Child nameserver sets from methods.Method4 and methods.Method5.
    • CDNSKEY and DNSKEY responses with DNSSEC enabled.
    • CDNSKEY and DNSKEY answer-section RRSIG records.
  • Profile/config knobs that affect behavior:
    • net.ipv4 and net.ipv6: disabled transports are skipped with transport debug tags.
    • resolver.defaults.parallel: parallel nameserver query and validation fanout.

Algorithm And Decision Flow

  1. Emit TEST_CASE_START.
  2. Build child nameserver set from Method4+Method5 and deduplicate by IP.
  3. For each unique nameserver IP (parallelized):
    • If transport is disabled, emit IPV4_DISABLED or IPV6_DISABLED for rrtypes CDNSKEY and DNSKEY and skip.
    • Query CDNSKEY with DNSSEC enabled; require authoritative NOERROR and at least one CDNSKEY record to continue.
    • Collect CDNSKEY records and answer-section RRSIG records.
    • Query DNSKEY with DNSSEC enabled; collect DNSKEY and answer-section RRSIG records when authoritative NOERROR with DNSKEY answers.
  4. If no nameserver produced CDNSKEY records, emit no DS17 findings.
  5. For each nameserver with CDNSKEY records (parallelized validation):
    • Detect delete semantics:
      • Mixed delete/non-delete CDNSKEY => DS17_MIXED_DELETE_CDNSKEY.
      • Only delete CDNSKEY => DS17_DELETE_CDNSKEY.
      • In both delete cases, remaining CDNSKEY validations are skipped for that nameserver.
    • If no DNSKEY RRset for nameserver => DS17_CDNSKEY_WITHOUT_DNSKEY.
    • For each non-delete CDNSKEY:
      • If zone bit unset => DS17_CDNSKEY_IS_NON_ZONE and skip remaining checks for this CDNSKEY.
      • If SEP bit unset => DS17_CDNSKEY_IS_NON_SEP.
      • If no matching DNSKEY keytag => DS17_CDNSKEY_MATCHES_NO_DNSKEY.
      • Else:
        • If DNSKEY RRSIG set lacks CDNSKEY keytag => DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY.
        • If CDNSKEY RRSIG set lacks CDNSKEY keytag => DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY.
    • If CDNSKEY RRset has no RRSIG records => DS17_CDNSKEY_UNSIGNED.
    • Else for each CDNSKEY RRSIG:
      • If keytag has no matching DNSKEY => DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY.
      • Else if cryptographic verification fails for all matching DNSKEY records => DS17_CDNSKEY_INVALID_RRSIG.
  6. Emit accumulated DS17 findings grouped by keytag or nameserver list as applicable.
  7. Emit TEST_CASE_END.

Emitted Tags (Possible Set)

TagEmitted when
DS17_CDNSKEY_INVALID_RRSIGCDNSKEY RRSIG keytag matches DNSKEY keytag(s), but signature verification fails.
DS17_CDNSKEY_IS_NON_SEPCDNSKEY record has SEP bit unset.
DS17_CDNSKEY_IS_NON_ZONECDNSKEY record has zone bit unset.
DS17_CDNSKEY_MATCHES_NO_DNSKEYCDNSKEY keytag matches no DNSKEY keytag.
DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEYCDNSKEY RRset has no RRSIG with CDNSKEY keytag.
DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEYCDNSKEY RRset has RRSIG keytag not present in DNSKEY RRset.
DS17_CDNSKEY_UNSIGNEDCDNSKEY RRset has no RRSIG records.
DS17_CDNSKEY_WITHOUT_DNSKEYCDNSKEY RRset exists but DNSKEY RRset is missing.
DS17_DELETE_CDNSKEYNameserver CDNSKEY RRset consists only of delete CDNSKEY record(s).
DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEYDNSKEY RRset has no RRSIG with CDNSKEY keytag.
DS17_MIXED_DELETE_CDNSKEYDelete CDNSKEY record is mixed with non-delete CDNSKEY record(s).
IPV4_DISABLEDIPv4 transport is disabled for a queried nameserver (CDNSKEY, DNSKEY).
IPV6_DISABLEDIPv6 transport is disabled for a queried nameserver (CDNSKEY, DNSKEY).
TEST_CASE_ENDTestcase completion marker is emitted.
TEST_CASE_STARTTestcase start marker is emitted.

Tag Arguments

TagArgument keyTypeMeaning
DS17_CDNSKEY_INVALID_RRSIGkeytagintRRSIG keytag with invalid signature.
DS17_CDNSKEY_INVALID_RRSIGaddressesarray<string>Structured child nameserver IP list.
DS17_CDNSKEY_IS_NON_SEPkeytagintCDNSKEY keytag with SEP bit unset.
DS17_CDNSKEY_IS_NON_SEPaddressesarray<string>Structured child nameserver IP list.
DS17_CDNSKEY_IS_NON_ZONEkeytagintCDNSKEY keytag with zone bit unset.
DS17_CDNSKEY_IS_NON_ZONEaddressesarray<string>Structured child nameserver IP list.
DS17_CDNSKEY_MATCHES_NO_DNSKEYkeytagintCDNSKEY keytag not found in DNSKEY RRset.
DS17_CDNSKEY_MATCHES_NO_DNSKEYaddressesarray<string>Structured child nameserver IP list.
DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEYkeytagintCDNSKEY keytag missing from CDNSKEY RRset RRSIG keytags.
DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEYaddressesarray<string>Structured child nameserver IP list.
DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEYkeytagintCDNSKEY RRSIG keytag with no DNSKEY match.
DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEYaddressesarray<string>Structured child nameserver IP list.
DS17_CDNSKEY_UNSIGNEDaddressesarray<string>Structured child nameserver IP list.
DS17_CDNSKEY_WITHOUT_DNSKEYaddressesarray<string>Structured child nameserver IP list.
DS17_DELETE_CDNSKEYaddressesarray<string>Structured child nameserver IP list.
DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEYkeytagintCDNSKEY keytag missing from DNSKEY RRset RRSIG keytags.
DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEYaddressesarray<string>Structured child nameserver IP list.
DS17_MIXED_DELETE_CDNSKEYaddressesarray<string>Structured child nameserver IP list.
IPV4_DISABLEDnsstringNameserver identity (ns name only; use address for IP) skipped on IPv4.
IPV4_DISABLEDaddressstringNameserver IP address for the same endpoint.
IPV4_DISABLEDrrtypestringrrtype skipped (CDNSKEY or DNSKEY).
IPV6_DISABLEDnsstringNameserver identity (ns name only; use address for IP) skipped on IPv6.
IPV6_DISABLEDaddressstringNameserver IP address for the same endpoint.
IPV6_DISABLEDrrtypestringrrtype skipped (CDNSKEY or DNSKEY).
TEST_CASE_ENDtestcasestringTestcase display name (DNSSEC17).
TEST_CASE_STARTtestcasestringTestcase display name (DNSSEC17).

Severity Levels Per Tag

TagLevelNotes
DS17_CDNSKEY_INVALID_RRSIGERRORDefault from share/profile.json (test_levels.DNSSEC).
DS17_CDNSKEY_IS_NON_SEPNOTICEDefault from share/profile.json (test_levels.DNSSEC).
DS17_CDNSKEY_IS_NON_ZONEERRORDefault from share/profile.json (test_levels.DNSSEC).
DS17_CDNSKEY_MATCHES_NO_DNSKEYWARNINGDefault from share/profile.json (test_levels.DNSSEC).
DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEYNOTICEDefault from share/profile.json (test_levels.DNSSEC).
DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEYERRORDefault from share/profile.json (test_levels.DNSSEC).
DS17_CDNSKEY_UNSIGNEDERRORDefault from share/profile.json (test_levels.DNSSEC).
DS17_CDNSKEY_WITHOUT_DNSKEYERRORDefault from share/profile.json (test_levels.DNSSEC).
DS17_DELETE_CDNSKEYINFODefault from share/profile.json (test_levels.DNSSEC).
DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEYWARNINGDefault from share/profile.json (test_levels.DNSSEC).
DS17_MIXED_DELETE_CDNSKEYERRORDefault from share/profile.json (test_levels.DNSSEC).
IPV4_DISABLEDDEBUGDefault from share/profile.json (test_levels.DNSSEC).
IPV6_DISABLEDDEBUGDefault from share/profile.json (test_levels.DNSSEC).
TEST_CASE_ENDDEBUGDefault from share/profile.json (test_levels.DNSSEC).
TEST_CASE_STARTDEBUGDefault from share/profile.json (test_levels.DNSSEC).

Differences From Upstream

  • Upstream reference: dnssec17.md
  • Differences (Upstream vs Gonemaster):
    • Upstream: describes this testcase as producing no output when no CDNSKEY is found. Gonemaster: emits only TEST_CASE_START, TEST_CASE_END, and, if any transport is disabled, IPV4_DISABLED and/or IPV6_DISABLED in that case.
    • Upstream: signature checks are described at RRset/signature level. Gonemaster: the checks for DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY and DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY are implemented as keytag-presence checks in RRSIG sets, not full per-signature validation.
    • Upstream: does not explicitly specify testcase boundary and transport-disabled debug emissions in this testcase summary. Gonemaster: emits TEST_CASE_START, TEST_CASE_END, IPV4_DISABLED, and IPV6_DISABLED.
  • Potential upstream report:
    • no

Edge Cases And Limitations

  • Delete semantics short-circuit further CDNSKEY validation for that nameserver.
  • Non-zone CDNSKEY records are flagged and then skipped from subsequent matching/signing checks for that record.
  • Nameserver evaluation is deduplicated by IP.