Skip to content

Commit

Permalink
decode/encode: adapt OPT handling for current draft version
Browse files Browse the repository at this point in the history
  • Loading branch information
miri64 committed Oct 2, 2023
1 parent a937496 commit bf8e6f2
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 18 deletions.
16 changes: 13 additions & 3 deletions cbor4dns/decode.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def _decode_rr(self, name, section, cbor_rr, res):
# TODO: tsig
else:
res.sections[section].append(wire_reader.message.sections[section][0])
elif isinstance(cbor_rr, cbor2.CBORTag) and cbor_rr.tag == 20:
elif isinstance(cbor_rr, cbor2.CBORTag) and cbor_rr.tag == 141:
opt_rr = cbor_rr.value
opt_rr[0] = self.deref(opt_rr[0])
if isinstance(opt_rr[0], int):
Expand All @@ -192,8 +192,18 @@ def _decode_rr(self, name, section, cbor_rr, res):
udp_payload_size = 512
offset = 0
options = []
for otype, oval in opt_rr[offset]:
options.append(dns.edns.GenericOption(otype, oval))
otype = None
for i, item in enumerate(opt_rr[offset]):
print(i, item)
if (i % 2) == 0 and isinstance(item, int):
otype = item
elif (i % 2) == 1 and isinstance(item, bytes) and otype is not None:
options.append(dns.edns.GenericOption(otype, item))
otype = None
else:
raise ValueError(
f"Unexpected format of option list {opt_rr[offset]}"
)
opt = dns.rdtypes.ANY.OPT.OPT(udp_payload_size, dns.rdatatype.OPT, options)
rem = (len(opt_rr) - offset) - 1
flags = utils.reverse_u16(self.deref(opt_rr[offset + 1])) if rem > 0 else 0
Expand Down
9 changes: 4 additions & 5 deletions cbor4dns/encode.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ def to_obj(self):


class OptRR:
opt_tag = 20
opt_tag = 141

def __init__(
self,
Expand All @@ -159,17 +159,16 @@ def __init__(
def walk(self):
for obj in self.to_obj():
if isinstance(obj, list):
for otype, oval in obj:
yield otype
yield oval
for item in obj:
yield item
else:
yield obj

def to_obj(self):
res = []
if self.udp_payload_size > 512:
res.append(self.udp_payload_size)
res.append(self.options)
res.append(list(itertools.chain.from_iterable(self.options)))
res.extend(self.rcode_v_flags.to_obj())
return cbor2.CBORTag(self.opt_tag, res)

Expand Down
20 changes: 10 additions & 10 deletions tests/test_encode.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
b"\x33\xa3\x66\xb5"
)
QUERY_AAAA_CBOR = (
b"\x83\x19\x01 \x81kexample.org\x81\xd4\x82\x19\x04"
b"\xd0\x81\x82\nH\x99!\te3\xa3f\xb5"
b"\x83\x19\x01 \x81kexample.org\x81\xd8\x8d\x82\x19\x04\xd0"
b"\x82\nH\x99!\te3\xa3f\xb5"
if cbor4dns.encode.RR.encode_opts
else b"\x83\x19\x01 \x81kexample.org\x81W\x00\x00)\x04"
b"\xd0\x00\x00\x00\x00\x00\x0c\x00\n\x00\x08\x99!\te3\xa3f\xb5"
Expand All @@ -29,8 +29,8 @@
b"\xa8\x46\x19\xa4"
)
QUERY_A_CBOR = (
b"\x83\x19\x01 \x82kexample.org\x01\x81\xd4\x82\x19\x04\xd0"
b"\x81\x82\nHt^l\x10\xa8F\x19\xa4"
b"\x83\x19\x01 \x82kexample.org\x01\x81\xd8\x8d\x82\x19\x04\xd0"
b"\x82\nHt^l\x10\xa8F\x19\xa4"
if cbor4dns.encode.RR.encode_opts
else b"\x83\x19\x01 \x82kexample.org\x01\x81W\x00\x00)\x04"
b"\xd0\x00\x00\x00\x00\x00\x0c\x00\n\x00\x08t^l\x10\xa8F\x19\xa4"
Expand Down Expand Up @@ -90,8 +90,8 @@
b"\x05\x00\x00H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x83wc0.org.afilias-n"
b"st.info\x1a\x00\x01\xb1\xf0P \x01\x05\x00\x00\x0b\x00\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x01\x83vd0.org.afilias-nst.org\x1a\x00\x01\xb1\xf0P "
b"\x01\x05\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd4"
b"\x82\x19\x10\x00\x81\x82\nX\x18\x16\x19\xc4\x7fn\xd6\xc4\xab\xef\xec\xe8yd5F"
b"\x01\x05\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd8\x8d"
b"\x82\x19\x10\x00\x82\nX\x18\x16\x19\xc4\x7fn\xd6\xc4\xab\xef\xec\xe8yd5F"
b"\xd3{\x9c\xb7\xd5a\xaa\xd9\xc2"
if cbor4dns.encode.RR.encode_opts
else b"\x85\x19\x81\x80\x81kexample.org\x81\x82\x19YQP&\x06(\x00\x02 "
Expand Down Expand Up @@ -175,8 +175,8 @@
b"\xf0P \x01\x05\x00\x00H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x83wc0.org."
b"afilias-nst.info\x1a\x00\x01\xb1\xf0P \x01\x05\x00\x00\x0b\x00\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x01\x83vd0.org.afilias-nst.org\x1a\x00\x01\xb1\xf0P "
b"\x01\x05\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd4\x82\x19"
b"\x10\x00\x81\x82\nX\x18\x16\x19\xc4\x7fn\xd6\xc4\xab\xef\xec\xe8yd5F\xd3{"
b"\x01\x05\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd8\x8d\x82\x19"
b"\x10\x00\x82\nX\x18\x16\x19\xc4\x7fn\xd6\xc4\xab\xef\xec\xe8yd5F\xd3{"
b"\x9c\xb7\xd5a\xaa\xd9\xc2"
if cbor4dns.encode.RR.encode_opts
else b"\x84\x19\x81\x80\x81\x82\x19YQP&\x06(\x00\x02 \x00\x01\x02H\x18"
Expand Down Expand Up @@ -239,7 +239,7 @@
b"\xd8\xe6K\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x83\xec\xe0\xd8\xe6K"
b"H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x83\xea\xe0\xd8\xe6K\x0b\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x01\x83\xed\xe0\xd8\xe6K\x0f\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd4\x82\x19\x10\x00\x81\x82\nX\x18\x16"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd8\x8d\x82\x19\x10\x00\x82\nX\x18\x16"
b"\x19\xc4\x7fn\xd6\xc4\xab\xef\xec\xe8yd5F\xd3{\x9c\xb7\xd5a\xaa\xd9\xc2"
if cbor4dns.encode.RR.encode_opts
else b"\x82\x91\x1a\x00\x01\xb1\xf0corgu.org.afilias-nst.info\xd8\xd9q.org.afi"
Expand Down Expand Up @@ -280,7 +280,7 @@
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x83\xec\xe0\xd8\xe6KH\x00\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x01\x83\xea\xe0\xd8\xe6K\x0b\x00\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x01\x83\xed\xe0\xd8\xe6K\x0f\x00"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd4\x82\x19\x10\x00\x81\x82\nX\x18\x16"
b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd8\x8d\x82\x19\x10\x00\x82\nX\x18\x16"
b"\x19\xc4\x7fn\xd6\xc4\xab\xef\xec\xe8yd5F\xd3{\x9c\xb7\xd5a\xaa\xd9\xc2"
if cbor4dns.encode.RR.encode_opts
else b"\x82\x91\x1a\x00\x01\xb1\xf0corgu.org.afilias-nst.info\xd8\xd9q.org."
Expand Down

0 comments on commit bf8e6f2

Please sign in to comment.