From: Peter Thomassen Date: Mon, 15 Apr 2024 00:31:17 +0000 (+0200) Subject: auth: add support for RFC 9615 (DNSSEC bootstrapping) X-Git-Tag: rec-5.4.0-alpha0~21^2~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a8be26a28c73840c1f73de39e00259de086c334;p=thirdparty%2Fpdns.git auth: add support for RFC 9615 (DNSSEC bootstrapping) --- diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 466c16de18..5940ec682e 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -755,7 +755,7 @@ void PacketHandler::emitNSEC(std::unique_ptr& r, const DNSName& name, r->addRecord(std::move(rr)); } -void PacketHandler::emitNSEC3(std::unique_ptr& r, const NSEC3PARAMRecordContent& ns3prc, const DNSName& name, const string& namehash, const string& nexthash, int mode) +void PacketHandler::emitNSEC3(DNSPacket& p, std::unique_ptr& r, const NSEC3PARAMRecordContent& ns3prc, const DNSName& name, const string& namehash, const string& nexthash, int mode) { NSEC3RecordContent n3rc; n3rc.d_algorithm = ns3prc.d_algorithm; @@ -787,6 +787,13 @@ void PacketHandler::emitNSEC3(std::unique_ptr& r, const NSEC3PARAMRec } } } + } else if(mode == 6) { + if (p.qtype.getCode() != QType::CDS) { + n3rc.set(QType::CDS); + } + if (p.qtype.getCode() != QType::CDNSKEY) { + n3rc.set(QType::CDNSKEY); + } } #ifdef HAVE_LUA_RECORDS @@ -854,6 +861,7 @@ void PacketHandler::emitNSEC3(std::unique_ptr& r, const NSEC3PARAMRec mode 3 = Wildcard Answer Responses mode 4 = Name Error Responses mode 5 = Direct NSEC request + mode 6 = Authenticated DNSSEC bootstrapping (RFC 9615) */ void PacketHandler::addNSECX(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, int mode) { @@ -955,7 +963,7 @@ void PacketHandler::addNSEC3(DNSPacket& p, std::unique_ptr& r, const if (!after.empty()) { DLOG(g_log<<"Done calling for matching, hashed: '"<& r, const getNSEC3Hashes(narrow, hashed, true, unhashed, before, after); DLOG(g_log<<"Done calling for covering, hashed: '"<& r, const getNSEC3Hashes(narrow, hashed, (mode != 2), unhashed, before, after); DLOG(g_log<<"Done calling for '*', hashed: '"<& } } +bool PacketHandler::tryAuthSignal(DNSPacket& p, std::unique_ptr& r, DNSName &target) { + DLOG(g_log<addRecord(std::move(rr)); + haveOne=true; + } + } + if(!haveOne) + makeNOError(p, r, target, DNSName(), 6); // other type might exist + return true; +} + bool PacketHandler::tryDNAME(DNSPacket& p, std::unique_ptr& r, DNSName &target) { if(!d_doDNAME) @@ -1856,6 +1917,9 @@ bool PacketHandler::opcodeQueryInner2(DNSPacket& pkt, queryState &state, bool re state.r->setRcode(RCode::YXDomain); return true; } + if(tryAuthSignal(pkt, state.r, state.target)) { + return true; + } if (!(((pkt.qtype.getCode() == QType::CNAME) || (pkt.qtype.getCode() == QType::ANY)) && retargeted)) { makeNXDomain(pkt, state.r, state.target, wildcard); diff --git a/pdns/packethandler.hh b/pdns/packethandler.hh index d60e0a09b7..9d6551f068 100644 --- a/pdns/packethandler.hh +++ b/pdns/packethandler.hh @@ -89,7 +89,7 @@ private: bool getNSEC3Hashes(bool narrow, const std::string& hashed, bool decrement, DNSName& unhashed, std::string& before, std::string& after, int mode=0); void addNSEC3(DNSPacket& p, std::unique_ptr& r, const DNSName &target, const DNSName &wildcard, const NSEC3PARAMRecordContent& nsec3param, bool narrow, int mode); void emitNSEC(std::unique_ptr& r, const DNSName& name, const DNSName& next, int mode); - void emitNSEC3(std::unique_ptr& r, const NSEC3PARAMRecordContent &ns3rc, const DNSName& unhashed, const string& begin, const string& end, int mode); + void emitNSEC3(DNSPacket& p, std::unique_ptr& r, const NSEC3PARAMRecordContent &ns3rc, const DNSName& unhashed, const string& begin, const string& end, int mode); int processUpdate(DNSPacket& p); int forwardPacket(const string &msgPrefix, const DNSPacket& p, const DomainInfo& di); uint performUpdate(const string &msgPrefix, const DNSRecord *rr, DomainInfo *di, bool isPresigned, bool* narrow, bool* haveNSEC3, NSEC3PARAMRecordContent *ns3pr, bool *updatedSerial); @@ -101,6 +101,7 @@ private: void makeNOError(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, int mode); vector getBestReferralNS(DNSPacket& p, const DNSName &target); void getBestDNAMESynth(DNSPacket& p, DNSName &target, vector &ret); + bool tryAuthSignal(DNSPacket& p, std::unique_ptr& r, DNSName &target); bool tryDNAME(DNSPacket& p, std::unique_ptr& r, DNSName &target); bool tryReferral(DNSPacket& p, std::unique_ptr& r, const DNSName &target, bool retargeted);