[ruby/resolv] Implement dohpath SvcParam

(https://github.com/ruby/resolv/pull/33)

* Implement dohpath SvcParam [RFC 9461]

This patch implements "dohpath" SvcParam proposed in
[draft-ietf-add-svcb-dns-08]. This parameter specifies a URI template
for the :path used in DNS-over-HTTPS requests.

"dohpath" is employed by [DDR], also a to-be-published Proposed Standard
that specifies how to upgrade DNS transport to a more secure one, i.d.,
DNS-over-TLS or DNS-over-HTTPS. DDR is deployed in the public DNS
resolvers including Cloudflare DNS, Google Public DNS, and Quad9.

[RFC 9461]: https://datatracker.ietf.org/doc/rfc9461/
[DDR]: https://datatracker.ietf.org/doc/draft-ietf-add-ddr/

https://github.com/ruby/resolv/commit/da9c023539

Co-authored-by: Sorah Fukumori <her@sorah.jp>
This commit is contained in:
Kasumi Hanazuki 2023-11-24 10:42:02 +09:00 committed by git
parent 608a518b42
commit e3b485213d
2 changed files with 57 additions and 1 deletions

View File

@ -2027,6 +2027,35 @@ class Resolv
end
end
##
# "dohpath" SvcParam -- DNS over HTTPS path template [RFC9461]
class DoHPath < SvcParam
KeyName = :dohpath
KeyNumber = 7
ClassHash[KeyName] = ClassHash[KeyNumber] = self # :nodoc:
##
# URI template for DoH queries.
attr_reader :template
##
# Initialize "dohpath" ScvParam.
def initialize(template)
@template = template.encode('utf-8')
end
def encode(msg) # :nodoc:
msg.put_bytes(@template)
end
def self.decode(msg) # :nodoc:
template = msg.get_bytes.force_encoding('utf-8')
return self.new(template)
end
end
end
##

View File

@ -83,7 +83,6 @@ class TestResolvSvcbHttps < Test::Unit::TestCase
assert_equal expected, msg.encode
end
## Test vectors from [RFC9460]
def test_alias_mode
@ -201,4 +200,32 @@ class TestResolvSvcbHttps < Test::Unit::TestCase
assert_equal wire, msg.encode
end
## For [RFC9461]
def test_dohpath
wire = wrap_rdata 64, 1, "\x00\x01\x03one\x03one\x03one\x03one\x00" +
"\x00\x01\x00\x03\x02h2" +
"\x00\x03\x00\x02\x01\xbb" +
"\x00\x04\x00\x08\x01\x01\x01\x01\x01\x00\x00\x01" +
"\x00\x06\x00\x20" +
("\x26\x06\x47\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11" +
"\x26\x06\x47\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01") +
"\x00\x07\x00\x10/dns-query{?dns}"
msg = Resolv::DNS::Message.decode(wire)
_, _, rr = msg.answer.first
assert_equal 1, rr.priority
assert_equal Resolv::DNS::Name.create('one.one.one.one.'), rr.target
assert_equal 5, rr.params.count
assert_equal ['h2'], rr.params[:alpn].protocol_ids
assert_equal 443, rr.params[:port].port
assert_equal [Resolv::IPv4.create('1.1.1.1'), Resolv::IPv4.create('1.0.0.1')],
rr.params[:ipv4hint].addresses
assert_equal [Resolv::IPv6.create('2606:4700:4700::1111'), Resolv::IPv6.create('2606:4700:4700::1001')],
rr.params[:ipv6hint].addresses
assert_equal '/dns-query{?dns}', rr.params[:dohpath].template
assert_equal wire, msg.encode
end
end