"""The DNS zone's origin is unknown."""
+class UnsupportedDigestScheme(dns.exception.DNSException):
+
+ """The zone digest's scheme is unsupported."""
+
+
+class UnsupportedDigestHashAlgorithm(dns.exception.DNSException):
+
+ """The zone digest's origin is unsupported."""
+
+
+class NoDigest(dns.exception.DNSException):
+
+ """The DNS zone has no ZONEMD RRset at its origin."""
+
+
+class DigestVerificationFailure(dns.exception.DNSException):
+
+ """The ZONEMD digest failed to verify."""
+
+
class DigestScheme(dns.enum.IntEnum):
"""ZONEMD Scheme"""
def _compute_digest(self, hash_algorithm, scheme=DigestScheme.SIMPLE):
hashinfo = _digest_hashers.get(hash_algorithm)
if not hashinfo:
- raise ValueError("unknown digest hash algorithm")
+ raise UnsupportedDigestHashAlgorithm
if scheme != DigestScheme.SIMPLE:
- raise ValueError("unknown digest scheme")
+ raise UnsupportedDigestScheme
if self.relativize:
origin_name = dns.name.empty
else:
digests = self.get_rdataset(self.origin, dns.rdatatype.ZONEMD)
if digests is None:
- raise ValueError("no ZONEMD records found")
+ raise NoDigest
for digest in digests:
try:
computed = self._compute_digest(digest.hash_algorithm,
return
except Exception as e:
pass
- raise ValueError("no digests verified")
+ raise DigestVerificationFailure
# TransactionManager methods
zone.verify_digest(rr)
self.assertEqual(rr, zone.compute_digest(rr.hash_algorithm))
else:
- with self.assertRaises(ValueError):
+ with self.assertRaises(dns.zone.DigestVerificationFailure):
zone.verify_digest(rr)
+ def test_zonemd_no_digest(self):
+ zone = dns.zone.from_text(self.simple_example, origin='example')
+ zone.delete_rdataset(dns.name.empty, 'ZONEMD')
+ with self.assertRaises(dns.zone.NoDigest):
+ zone.verify_digest()
+
sha384_hash = 'ab' * 48
sha512_hash = 'ab' * 64
def test_zonemd_unknown_scheme(self):
zone = dns.zone.from_text(self.simple_example, origin='example')
- with self.assertRaises(ValueError):
+ with self.assertRaises(dns.zone.UnsupportedDigestScheme):
zone.compute_digest(dns.zone.DigestHashAlgorithm.SHA384, 2)
def test_zonemd_unknown_hash_algorithm(self):
zone = dns.zone.from_text(self.simple_example, origin='example')
- with self.assertRaises(ValueError):
+ with self.assertRaises(dns.zone.UnsupportedDigestHashAlgorithm):
zone.compute_digest(5)
def test_zonemd_invalid_digest_length(self):