]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
feat: Add DRIP records (HHIT and BRID)
authorPieter Lexis <pieter.lexis@powerdns.com>
Fri, 19 Sep 2025 09:16:42 +0000 (11:16 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Wed, 24 Sep 2025 11:54:49 +0000 (13:54 +0200)
These are defined in draft-ietf-drip-registries-33.

pdns/dnsrecords.cc
pdns/dnsrecords.hh
pdns/qtype.cc
pdns/qtype.hh
pdns/test-dnsrecords_cc.cc

index ca15552ac64d8371d11e69eaa83f77b6b301ba2b..31cd51eed680fe67ab0ae1545bdae618ec02e9ed 100644 (file)
@@ -371,6 +371,14 @@ boilerplate_conv(HTTPS,
                  }
                  )
 
+boilerplate_conv(HHIT,
+                 conv.xfrBlob(d_data);
+                 )
+
+boilerplate_conv(BRID,
+                 conv.xfrBlob(d_data);
+                 )
+
 boilerplate_conv(SMIMEA,
                  conv.xfr8BitInt(d_certusage);
                  conv.xfr8BitInt(d_selector);
@@ -833,6 +841,16 @@ std::shared_ptr<SVCBBaseRecordContent> HTTPSRecordContent::clone() const
 
 /* SVCB end */
 
+std::shared_ptr<DRIPBaseRecordContent> HHITRecordContent::clone() const
+{
+  return {std::make_shared<HHITRecordContent>(*this)};
+}
+
+std::shared_ptr<DRIPBaseRecordContent> BRIDRecordContent::clone() const
+{
+  return {std::make_shared<BRIDRecordContent>(*this)};
+}
+
 boilerplate_conv(TKEY,
                  conv.xfrName(d_algo);
                  conv.xfr32BitInt(d_inception);
@@ -963,6 +981,8 @@ static void reportOtherTypes(const ReportIsOnlyCallableByReportAllTypes& guard)
    OPENPGPKEYRecordContent::report(guard);
    SVCBRecordContent::report(guard);
    HTTPSRecordContent::report(guard);
+   HHITRecordContent::report(guard);
+   BRIDRecordContent::report(guard);
    DLVRecordContent::report(guard);
    DNSRecordContent::regist(QClass::ANY, QType::TSIG, &TSIGRecordContent::make, &TSIGRecordContent::make, "TSIG");
    DNSRecordContent::regist(QClass::ANY, QType::TKEY, &TKEYRecordContent::make, &TKEYRecordContent::make, "TKEY");
index ccfbd13a365b2f4c555dc2bb10066805386b9796..2677cd6b1dbdbd0109bea79564e9a8a078c9073f 100644 (file)
@@ -716,6 +716,30 @@ public:
   std::shared_ptr<SVCBBaseRecordContent> clone() const override;
 };
 
+class DRIPBaseRecordContent : public DNSKEYRecordContent
+{
+public:
+  [[nodiscard]] size_t sizeEstimate() const override
+  {
+    return sizeof(*this) + d_data.size();
+  }
+  virtual std::shared_ptr<DRIPBaseRecordContent> clone() const = 0;
+protected:
+  string d_data;
+};
+
+class HHITRecordContent : public DRIPBaseRecordContent {
+public:
+  includeboilerplate(HHIT);
+  std::shared_ptr<DRIPBaseRecordContent> clone() const override;
+};
+
+class BRIDRecordContent : public DRIPBaseRecordContent {
+public:
+  includeboilerplate(BRID);
+  std::shared_ptr<DRIPBaseRecordContent> clone() const override;
+};
+
 class RRSIGRecordContent : public DNSRecordContent
 {
 public:
index b72749c8357a6f10ad202c4983fd693b164f0d79..c5eb47c855da701c9088cfca16a0dd7cc41263c9 100644 (file)
@@ -76,6 +76,8 @@ const map<const string, uint16_t> QType::names = {
   {"ZONEMD", 63},
   {"SVCB", 64},
   {"HTTPS", 65},
+  {"HHIT", 67},
+  {"BRID", 68},
   {"SPF", 99},
   {"NID", 104},
   {"L32", 105},
index d03b3963e918938a96561ee924457c8368d62649..fa9bde78f88525e06d8c90a86f4ae0fbd4650ad1 100644 (file)
@@ -120,6 +120,8 @@ public:
     ZONEMD = 63,
     SVCB = 64,
     HTTPS = 65,
+    HHIT = 67,
+    BRID = 68,
     SPF = 99,
     NID = 104,
     L32 = 105,
index 321d9a6e8520a50462efd271e68fbefbb50313a1..d787e863315e4d13baa5eadb68425da552c8edf1 100644 (file)
@@ -259,6 +259,11 @@ BOOST_AUTO_TEST_CASE(test_record_types) {
      (CASE_L(QType::SVCB, R"XXX(16 foo.example.org. alpn=f\\\092oo\092,bar,h2)XXX", R"XXX(16 foo.example.org. alpn=f\\\\oo\\,bar,h2)XXX", "\x00\x10\3foo\7example\3org\x00\x00\x01\x00\x0c\x08\x66\\oo,bar\x02h2"))
      // END SVCB draft test vectors
 
+     (CASE_S(QType::HHIT, "1234abcd", "\xd7\x6d\xf8\x69\xb7\x1d"))
+     (CASE_L(QType::HHIT, "1234 abcd", "1234abcd", "\xd7\x6d\xf8\x69\xb7\x1d"))
+     (CASE_S(QType::BRID, "1234abcd", "\xd7\x6d\xf8\x69\xb7\x1d"))
+     (CASE_L(QType::BRID, "1234 abcd", "1234abcd", "\xd7\x6d\xf8\x69\xb7\x1d"))
+
      (CASE_S(QType::SPF, "\"v=spf1 a:mail.rec.test ~all\"", "\x1bv=spf1 a:mail.rec.test ~all"))
 
      (CASE_S(QType::NID, "15 0123:4567:89AB:CDEF", "\x00\x0F\x01\x23\x45\x67\x89\xab\xcd\xef"))