if scheme != DigestScheme.SIMPLE:
raise ValueError("unknown digest scheme")
+ if self.relativize:
+ origin_name = dns.name.empty
+ else:
+ origin_name = self.origin
hasher = hashinfo()
for (name, node) in sorted(self.items()):
rrnamebuf = name.to_digestable(self.origin)
for rdataset in sorted(node,
key=lambda rds: (rds.rdtype, rds.covers)):
- if name in (self.origin, dns.name.empty) and \
+ if name == origin_name and \
dns.rdatatype.ZONEMD in (rdataset.rdtype, rdataset.covers):
continue
rrfixed = struct.pack('!HHI', rdataset.rdtype,
return hasher.digest()
def compute_digest(self, hash_algorithm, scheme=DigestScheme.SIMPLE):
+ if self.relativize:
+ origin_name = dns.name.empty
+ else:
+ origin_name = self.origin
+ serial = self.get_rdataset(origin_name, dns.rdatatype.SOA)[0].serial
digest = self._compute_digest(hash_algorithm, scheme)
return dns.rdtypes.ANY.ZONEMD.ZONEMD(self.rdclass,
dns.rdatatype.ZONEMD,
NS2.EXAMPLE. 3600 IN AAAA 2001:db8::63
''')
+ def _get_zonemd(self, zone):
+ return zone.get_rdataset(zone.origin, 'ZONEMD')
+
def test_zonemd_simple(self):
zone = dns.zone.from_text(self.simple_example, origin='example')
zone.verify_digest()
+ zonemd = self._get_zonemd(zone)
+ self.assertEqual(zonemd[0],
+ zone.compute_digest(zonemd[0].hash_algorithm))
def test_zonemd_complex(self):
zone = dns.zone.from_text(self.complex_example, origin='example')
zone.verify_digest()
+ zonemd = self._get_zonemd(zone)
+ self.assertEqual(zonemd[0],
+ zone.compute_digest(zonemd[0].hash_algorithm))
def test_zonemd_multiple_digests(self):
zone = dns.zone.from_text(self.multiple_digests_example,
origin='example')
zone.verify_digest()
- zonemd = zone.get_rdataset(zone.origin, 'ZONEMD')
+ zonemd = self._get_zonemd(zone)
for rr in zonemd:
if rr.scheme == 1 and rr.hash_algorithm in (1, 2):
zone.verify_digest(rr)
+ self.assertEqual(rr, zone.compute_digest(rr.hash_algorithm))
else:
with self.assertRaises(ValueError):
zone.verify_digest(rr)
dns.rdata.from_text('IN', 'ZONEMD', '100 1 2 ' + self.sha384_hash)
with self.assertRaises(dns.exception.SyntaxError):
dns.rdata.from_text('IN', 'ZONEMD', '100 2 1 ' + self.sha512_hash)
+
+ def test_zonemd_parse_rdata_reserved(self):
+ with self.assertRaises(dns.exception.SyntaxError):
+ dns.rdata.from_text('IN', 'ZONEMD', '100 0 1 ' + self.sha384_hash)
+ with self.assertRaises(dns.exception.SyntaxError):
+ dns.rdata.from_text('IN', 'ZONEMD', '100 1 0 ' + self.sha384_hash)
+