#: Bad EDNS version.
BADVERS = 16
#: TSIG Signature Failure
- # BADSIG = 16
+ BADSIG = 16
#: Key not recognized.
- BADKEY = 17
+ BADKEY = 17
#: Signature out of time window.
- BADTIME = 18
+ BADTIME = 18
#: Bad TKEY Mode.
- BADMODE = 19
+ BADMODE = 19
#: Duplicate key name.
BADNAME = 20
#: Algorithm not supported.
return (v, ev)
-def to_text(value):
+def to_text(value, tsig=False):
"""Convert rcode into text.
- *value*, and ``int``, the rcode.
+ *value*, an ``int``, the rcode.
Raises ``ValueError`` if rcode is < 0 or > 4095.
Returns a ``str``.
"""
+ if tsig and value == Rcode.BADVERS:
+ return 'BADSIG'
return Rcode.to_text(value)
import dns.exception
import dns.rdataclass
import dns.name
+import dns.rcode
class BadTime(dns.exception.DNSException):
default_algorithm = HMAC_SHA256
-BADSIG = 16
-BADKEY = 17
-BADTIME = 18
-BADTRUNC = 22
-
def sign(wire, key, rdata, time=None, request_mac=None, ctx=None, multi=False):
"""Return a (tsig_rdata, mac, ctx) tuple containing the HMAC TSIG rdata
adcount -= 1
new_wire = wire[0:10] + struct.pack("!H", adcount) + wire[12:tsig_start]
if rdata.error != 0:
- if rdata.error == BADSIG:
+ if rdata.error == dns.rcode.BADSIG:
raise PeerBadSignature
- elif rdata.error == BADKEY:
+ elif rdata.error == dns.rcode.BADKEY:
raise PeerBadKey
- elif rdata.error == BADTIME:
+ elif rdata.error == dns.rcode.BADTIME:
raise PeerBadTime
- elif rdata.error == BADTRUNC:
+ elif rdata.error == dns.rcode.BADTRUNC:
raise PeerBadTruncation
else:
raise PeerError('unknown TSIG error code %d' % rdata.error)
flags = dns.flags.QR|dns.flags.AA|dns.flags.RD|dns.flags.RA
self.assertEqual(dns.flags.to_text(flags), "QR AA RD RA")
+ def test_rcode_badvers(self):
+ rcode = dns.rcode.BADVERS
+ self.assertEqual(rcode.value, 16)
+ self.assertEqual(rcode.name, 'BADVERS')
+ self.assertEqual(dns.rcode.to_text(rcode), 'BADVERS')
+
+ def test_rcode_badsig(self):
+ rcode = dns.rcode.BADSIG
+ self.assertEqual(rcode.value, 16)
+ # Yes, we mean BADVERS on the next line. BADSIG and BADVERS have
+ # the same code.
+ self.assertEqual(rcode.name, 'BADVERS')
+ self.assertEqual(dns.rcode.to_text(rcode), 'BADVERS')
+ # In TSIG text mode, it should be BADSIG
+ self.assertEqual(dns.rcode.to_text(rcode, True), 'BADSIG')
+
if __name__ == '__main__':
unittest.main()
import unittest
import time
+import dns.rcode
import dns.tsig
import dns.tsigkeyring
import dns.message
return(q, r)
def test_peer_errors(self):
- items = [(dns.tsig.BADSIG, dns.tsig.PeerBadSignature),
- (dns.tsig.BADKEY, dns.tsig.PeerBadKey),
- (dns.tsig.BADTIME, dns.tsig.PeerBadTime),
- (dns.tsig.BADTRUNC, dns.tsig.PeerBadTruncation),
+ items = [(dns.rcode.BADSIG, dns.tsig.PeerBadSignature),
+ (dns.rcode.BADKEY, dns.tsig.PeerBadKey),
+ (dns.rcode.BADTIME, dns.tsig.PeerBadTime),
+ (dns.rcode.BADTRUNC, dns.tsig.PeerBadTruncation),
(99, dns.tsig.PeerError),
]
for err, ex in items: