diff --git a/Libraries/LibDNS/Message.cpp b/Libraries/LibDNS/Message.cpp index 62117851d49..c183b64e5e3 100644 --- a/Libraries/LibDNS/Message.cpp +++ b/Libraries/LibDNS/Message.cpp @@ -1141,6 +1141,19 @@ ErrorOr Records::DS::from_raw(ParseContext& ctx) return Records::DS { key_tag, algorithm, digest_type, move(digest) }; } +ErrorOr Records::DS::to_raw(ByteBuffer& buffer) const +{ + auto const output_size = 2 + 1 + 1 + digest.size(); + FixedMemoryStream stream { TRY(buffer.get_bytes_for_writing(output_size)) }; + + TRY(stream.write_value(static_cast>(key_tag))); + TRY(stream.write_value(static_cast(algorithm))); + TRY(stream.write_value(static_cast(digest_type))); + TRY(stream.write_until_depleted(digest.bytes())); + + return {}; +} + ErrorOr Records::SIG::from_raw(ParseContext& ctx) { // RFC 4034, 2.2. The SIG Resource Record. diff --git a/Libraries/LibDNS/Message.h b/Libraries/LibDNS/Message.h index d3270a35b82..45fe1d1afd9 100644 --- a/Libraries/LibDNS/Message.h +++ b/Libraries/LibDNS/Message.h @@ -484,7 +484,7 @@ struct DNSKEY { ErrorOr to_raw(ByteBuffer&) const; ErrorOr to_string() const { - return String::formatted("DNSKEY Flags: {}{}{}{}({}), Protocol: {}, Algorithm: {}, Public Key: {}", + return String::formatted("DNSKEY Flags: {}{}{}{}({}), Protocol: {}, Algorithm: {}, Public Key: {}, Tag: {}", is_secure_entry_point() ? "sep "sv : ""sv, is_zone_key() ? "zone "sv : ""sv, is_revoked() ? "revoked "sv : ""sv, @@ -492,7 +492,8 @@ struct DNSKEY { flags, protocol, DNSSEC::to_string(algorithm), - TRY(encode_base64(public_key))); + TRY(encode_base64(public_key)), + calculated_key_tag); } }; struct CDNSKEY : public DNSKEY { @@ -513,8 +514,15 @@ struct DS { static constexpr ResourceType type = ResourceType::DS; static ErrorOr from_raw(ParseContext&); - ErrorOr to_raw(ByteBuffer&) const { return Error::from_string_literal("Not implemented: DS::to_raw"); } - ErrorOr to_string() const { return "DS"_string; } + ErrorOr to_raw(ByteBuffer&) const; + ErrorOr to_string() const + { + return String::formatted("DS Key Tag: {}, Algorithm: {}, Digest Type: {}, Digest: {}", + key_tag, + DNSSEC::to_string(algorithm), + DNSSEC::to_string(digest_type), + TRY(encode_base64(digest))); + } }; struct CDS : public DS { template diff --git a/Libraries/LibDNS/Resolver.h b/Libraries/LibDNS/Resolver.h index 4b1eb1337a6..3d30eff128b 100644 --- a/Libraries/LibDNS/Resolver.h +++ b/Libraries/LibDNS/Resolver.h @@ -707,8 +707,15 @@ private: lookup.promise = move(promise); }; - if (is_root_zone) - return resolve_using_keys(move(parent_zone_keys)); + if (is_root_zone) { + return resolve_using_keys(Vector { Messages::Records::DNSKEY { + .flags = 256, + .protocol = 3, + .algorithm = Messages::DNSSEC::Algorithm::RSASHA256, + .public_key = MUST(decode_base64("AwEAAa96jeuknZlaeSrvyAJj6ZHv28hhOKkx3rLGXVaC6rXTsDc449/cidltpkyGwCJNnOAlFNKF2jBosZBU5eeHspaQWOmOElZsjICMQMC3aeHbGiShvZsx4wMYSjH8e7Vrhbu6irwCzVBApESjbUdpWWmEnhathWu1jo+siFUiRAAxm9qyJNg/wOZqqzL/dL/q8PkcRU5oUKEpUge71M3ej2/7CPqpdVwuMoTvoB+ZOT4YeGyxMvHmbrxlFzGOHOijtzN+u1TQNatX2XBuzZNQ1K+s2CXkPIZo7s6JgZyvaBevYtxPvYLw4z9mR7K2vaF18UYH9Z9GNUUeayffKC73PYc="sv)), + .calculated_key_tag = 38696, + } }); + } dbgln_if(DNS_DEBUG, "DNS: Starting DNSKEY lookup for {}", lookup.name); this->lookup(lookup.name, Messages::Class::IN, { Messages::ResourceType::DNSKEY }, { .validate_dnssec_locally = false })