]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Import ENT support, done by Kees Monshouwer. Additional testing by Ruben d'Arco.
authorPeter van Dijk <peter.van.dijk@netherlabs.nl>
Mon, 1 Oct 2012 14:35:23 +0000 (14:35 +0000)
committerPeter van Dijk <peter.van.dijk@netherlabs.nl>
Mon, 1 Oct 2012 14:35:23 +0000 (14:35 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2721 d19b8d6e-7fed-0310-83ef-9ca221ded41b

76 files changed:
modules/gmysqlbackend/gmysqlbackend.cc
modules/gpgsqlbackend/gpgsqlbackend.cc
modules/gsqlite3backend/gsqlite3backend.cc
modules/tinydnsbackend/data
modules/tinydnsbackend/data.cdb
pdns/backends/bind/bindbackend2.cc
pdns/backends/bind/bindbackend2.hh
pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh
pdns/botansigners.cc
pdns/common_startup.cc
pdns/dnsbackend.hh
pdns/nsecrecords.cc
pdns/packethandler.cc
pdns/pdns.conf-dist
pdns/pdnssec.cc
pdns/slavecommunicator.cc
pdns/tcpreceiver.cc
regression-tests.nobackend/tinydns-data-check/expected_result
regression-tests/any-wildcard-dnssec/expected_result.narrow
regression-tests/cleandig
regression-tests/ds-at-unsecure-delegation/expected_result.narrow
regression-tests/ds-at-unsecure-zone-cut/expected_result.narrow
regression-tests/ds-inside-delegation/expected_result.narrow
regression-tests/ent-any/command [new file with mode: 0755]
regression-tests/ent-any/description [new file with mode: 0644]
regression-tests/ent-any/expected_result [new file with mode: 0644]
regression-tests/ent-any/expected_result.narrow [new file with mode: 0644]
regression-tests/ent-any/expected_result.nsec3 [new file with mode: 0644]
regression-tests/ent-any/skip.nodnssec [new file with mode: 0644]
regression-tests/ent-axfr/command [new file with mode: 0755]
regression-tests/ent-axfr/description [new file with mode: 0644]
regression-tests/ent-axfr/expected_result [new file with mode: 0644]
regression-tests/ent-axfr/expected_result.nsec3 [new file with mode: 0644]
regression-tests/ent-axfr/skip.nodnssec [new file with mode: 0644]
regression-tests/ent-axfr/use.drill [new file with mode: 0644]
regression-tests/ent-rr-enclosed-in-ent/command [new file with mode: 0755]
regression-tests/ent-rr-enclosed-in-ent/description [new file with mode: 0644]
regression-tests/ent-rr-enclosed-in-ent/expected_result [new file with mode: 0644]
regression-tests/ent-rr-enclosed-in-ent/expected_result.narrow [new file with mode: 0644]
regression-tests/ent-rr-enclosed-in-ent/expected_result.nsec3 [new file with mode: 0644]
regression-tests/ent-rr-enclosed-in-ent/skip.nodnssec [new file with mode: 0644]
regression-tests/ent-soa/command [new file with mode: 0755]
regression-tests/ent-soa/description [new file with mode: 0644]
regression-tests/ent-soa/expected_result [new file with mode: 0644]
regression-tests/ent-soa/expected_result.narrow [new file with mode: 0644]
regression-tests/ent-soa/expected_result.nsec3 [new file with mode: 0644]
regression-tests/ent-soa/skip.nodnssec [new file with mode: 0644]
regression-tests/ent-wildcard-below-ent/command [new file with mode: 0755]
regression-tests/ent-wildcard-below-ent/description [new file with mode: 0644]
regression-tests/ent-wildcard-below-ent/expected_result [new file with mode: 0644]
regression-tests/ent-wildcard-below-ent/expected_result.narrow [new file with mode: 0644]
regression-tests/ent-wildcard-below-ent/expected_result.nsec3 [new file with mode: 0644]
regression-tests/ent-wildcard-below-ent/skip.nodnssec [new file with mode: 0644]
regression-tests/ent/command [new file with mode: 0755]
regression-tests/ent/description [new file with mode: 0644]
regression-tests/ent/expected_result [new file with mode: 0644]
regression-tests/ent/expected_result.narrow [new file with mode: 0644]
regression-tests/ent/expected_result.nsec3 [new file with mode: 0644]
regression-tests/ent/skip.nodnssec [new file with mode: 0644]
regression-tests/five-levels-wildcard-one-below-apex/expected_result.narrow
regression-tests/five-levels-wildcard/expected_result.narrow
regression-tests/minimal-nxdomain/expected_result.narrow
regression-tests/nsec-glue-at-delegation/expected_result
regression-tests/nsec-glue-at-delegation/expected_result.narrow
regression-tests/nsec-glue-at-delegation/expected_result.nsec3
regression-tests/nsec-glue/expected_result.narrow
regression-tests/nsec-middle/expected_result.narrow
regression-tests/nsec-wildcard/expected_result.narrow
regression-tests/nxdomain-below-nonempty-terminal/expected_result.narrow
regression-tests/second-level-nxdomain/expected_result.narrow
regression-tests/start-test-stop
regression-tests/test.com
regression-tests/two-level-nxdomain/expected_result.narrow
regression-tests/underscore-sorting/expected_result.narrow
regression-tests/underscore-sorting/expected_result.nsec3

index 947c7cddf72d4ab67d73af71db4c21a9bf69f8c5..86ca233aaa5d2f1a6e5c5e7e347d73f62ba16408 100644 (file)
@@ -92,7 +92,11 @@ public:
     declare(suffix,"get-order-after-query","DNSSEC Ordering Query, after", "select min(ordername) from records where ordername > '%s' and domain_id=%d and ordername is not null");
     declare(suffix,"get-order-last-query","DNSSEC Ordering Query, last", "select ordername, name from records where ordername != '' and domain_id=%d and ordername is not null order by 1 desc limit 1");
     declare(suffix,"set-order-and-auth-query", "DNSSEC set ordering query", "update records set ordername='%s',auth=%d where name='%s' and domain_id='%d'");
-    declare(suffix,"nullify-ordername-and-auth-query", "DNSSEC nullify ordername query", "update records set ordername=NULL,auth=0 where name='%s' and type='%s' and domain_id='%d'");
+    declare(suffix,"nullify-ordername-query", "DNSSEC nullify ordername query", "update records set ordername=NULL where domain_id='%d' and name='%s' and type is null");
+    declare(suffix,"nullify-ordername-and-auth-query", "DNSSEC nullify ordername and auth query", "update records set ordername=NULL,auth=0 where name='%s' and type='%s' and domain_id='%d'");
+    declare(suffix,"remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id='%d' and type is null");
+    declare(suffix,"insert-empty-non-terminal-query", "insert empty non-terminal in zone", "insert into records (domain_id,name,type,auth) values ('%d','%s',null,'1')");
+    declare(suffix,"delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id='%d' and name='%s' and type is null");
 
     declare(suffix,"update-serial-query","", "update domains set notified_serial=%d where id=%d");
     declare(suffix,"update-lastcheck-query","", "update domains set last_check=%d where id=%d");
index 8748edd12df3e49b6faaedfea8b05cc62d72793a..ad6f760e9ee2e2b62f739aba6a5d90fe3c2e8472 100644 (file)
@@ -90,7 +90,11 @@ public:
     declare(suffix,"get-order-last-query","DNSSEC Ordering Query, last", "select ordername, name from records where ordername != '' and domain_id=%d and ordername is not null order by 1 using ~>~ limit 1");
     declare(suffix,"set-order-and-auth-query", "DNSSEC set ordering query", "update records set ordername=E'%s',auth=(%d = 1) where name=E'%s' and domain_id='%d'");
 
-    declare(suffix,"nullify-ordername-and-auth-query", "DNSSEC nullify ordername query", "update records set ordername=NULL,auth=false where name=E'%s' and type=E'%s' and domain_id='%d'");
+    declare(suffix,"nullify-ordername-query", "DNSSEC nullify ordername query", "update records set ordername=NULL where domain_id='%d' and name='%s' and type is null");
+    declare(suffix,"nullify-ordername-and-auth-query", "DNSSEC nullify ordername and auth query", "update records set ordername=NULL,auth=false where name=E'%s' and type=E'%s' and domain_id='%d'");
+    declare(suffix,"remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id='%d' and type is null");
+    declare(suffix,"insert-empty-non-terminal-query", "insert empty non-terminal in zone", "insert into records (domain_id,name,type,auth) values ('%d','%s',null,true)");
+    declare(suffix,"delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id='%d' and name='%s' and type is null");
     
     declare(suffix,"update-serial-query","", "update domains set notified_serial=%d where id=%d");
     declare(suffix,"update-lastcheck-query","", "update domains set last_check=%d where id=%d");
index b9a91a1ad8541e659140dc87cc87f1acdc6d17b5..f7692582aba6cd76210d4efdbbeb4b9f2f4a8758 100644 (file)
@@ -89,7 +89,11 @@ public:
     declare(suffix,"get-order-last-query","DNSSEC Ordering Query, last", "select ordername, name from records where ordername != '' and domain_id=%d and ordername is not null order by 1 desc limit 1");
     declare(suffix,"set-order-and-auth-query", "DNSSEC set ordering query", "update records set ordername='%s',auth=%d where name='%s' and domain_id='%d'");
 
-    declare(suffix,"nullify-ordername-and-auth-query", "DNSSEC nullify ordername query", "update records set ordername=NULL,auth=0 where name='%s' and type='%s' and domain_id='%d'");
+    declare(suffix,"nullify-ordername-query", "DNSSEC nullify ordername query", "update records set ordername=NULL where domain_id='%d' and name='%s' and type is null");
+    declare(suffix,"nullify-ordername-and-auth-query", "DNSSEC nullify ordername and auth query", "update records set ordername=NULL,auth=0 where name='%s' and type='%s' and domain_id='%d'");
+    declare(suffix,"remove-empty-non-terminals-from-zone-query", "remove all empty non-terminals from zone", "delete from records where domain_id='%d' and type is null");
+    declare(suffix,"insert-empty-non-terminal-query", "insert empty non-terminal in zone", "insert into records (domain_id,name,type,auth) values ('%d','%s',null,'1')");
+    declare(suffix,"delete-empty-non-terminal-query", "delete empty non-terminal from zone", "delete from records where domain_id='%d' and name='%s' and type is null");
     
     declare( suffix, "master-zone-query", "Data", "select master from domains where name='%s' and type='SLAVE'");
 
index 521a3099b1d03cf9863024a0e80eba9eced884a0..072b40846598257148a4d6a4728b3534e8693148 100644 (file)
@@ -20132,6 +20132,8 @@ Ztest.com:ns1.test.com.:ahu.example.com.:2005092501:28800:7200:604800:86400:3600
 :_underscore.test.com:16:\030underscores\040are\040terrible:3600
 +blah.test.com:192.168.6.1:3600
 &blah.test.com::blah.test.com.:3600
++b.c.test.com:5.6.7.8:3600
++\052.a.b.c.test.com:8.7.6.5:3600
 +counter.test.com:1.1.1.5:3600
 :_double._tcp.dc.test.com:33:\000\000\000d\001\205\007server1\004test\003com\000:3600
 :_double._tcp.dc.test.com:33:\000\001\000d\001\205\007server1\004test\003com\000:3600
index f1f624ff0b54576af757b849246bea6bdaf6af63..3cefcd81cb793364c24590cbf3392eb2080c8951 100644 (file)
Binary files a/modules/tinydnsbackend/data.cdb and b/modules/tinydnsbackend/data.cdb differ
index b60b13c4f7cbbae3c445e46f109bed3e1ee3bc12..2b0ee4ae5a58822342a84fd8e5273e0d98458f03 100644 (file)
@@ -437,6 +437,9 @@ void Bind2Backend::insert(shared_ptr<State> stage, int id, const string &qnameu,
   bdr.qtype=qtype.getCode();
   bdr.content=content; 
   bdr.nsec3hash = hashed;
+  
+  if (!qtype.getCode()) // Set auth on empty non-terminals
+    bdr.auth=true;
 
   if(bdr.qtype == QType::MX || bdr.qtype == QType::SRV) { 
     prio=atoi(bdr.content.c_str());
@@ -602,6 +605,56 @@ void Bind2Backend::fixupAuth(shared_ptr<recordstorage_t> records)
   }
 }
 
+void Bind2Backend::doEmptyNonTerminals(shared_ptr<State> stage, int id, bool nsec3zone, NSEC3PARAMRecordContent ns3pr)
+{
+  BB2DomainInfo bb2 = stage->id_zone_map[id];
+
+  bool doent=true;
+  set<string> qnames, nonterm;
+  string qname, shorter, hashed;
+
+  uint32_t maxent = ::arg().asNum("max-ent-entries");
+
+  BOOST_FOREACH(const Bind2DNSRecord& bdr, *bb2.d_records)
+    if (bdr.auth)
+      qnames.insert(labelReverse(bdr.qname));
+
+  BOOST_FOREACH(const string& qname, qnames)
+  {
+    shorter=qname;
+
+    while(chopOff(shorter))
+    {
+      if(!qnames.count(shorter) && !nonterm.count(shorter))
+      {
+        if(!(maxent))
+        {
+          L<<Logger::Error<<"Zone '"<<bb2.d_name<<"' has too many empty non terminals."<<endl;
+          doent=false;
+          break;
+        }
+        nonterm.insert(shorter);
+        --maxent;
+      }
+    }
+    if(!doent)
+      return;
+  }
+
+  DNSResourceRecord rr;
+  rr.qtype="0";
+  rr.content="";
+  rr.ttl=0;
+  rr.priority=0;
+  BOOST_FOREACH(const string& qname, nonterm)
+  {
+    rr.qname=qname+"."+bb2.d_name+".";
+    if(nsec3zone)
+      hashed=toLower(toBase32Hex(hashQNameWithSalt(ns3pr.d_iterations, ns3pr.d_salt, rr.qname)));
+    insert(stage, id, rr.qname, rr.qtype, rr.content, rr.ttl, rr.priority, hashed);
+  }
+}
+
 void Bind2Backend::loadConfig(string* status)
 {
   // Interference with createSlaveDomain()
@@ -702,8 +755,8 @@ void Bind2Backend::loadConfig(string* status)
         
             // sort(staging->id_zone_map[bbd->d_id].d_records->begin(), staging->id_zone_map[bbd->d_id].d_records->end());
             
-            shared_ptr<recordstorage_t > records=staging->id_zone_map[bbd->d_id].d_records;
-            fixupAuth(records);
+            fixupAuth(staging->id_zone_map[bbd->d_id].d_records);
+            doEmptyNonTerminals(staging, bbd->d_id, nsec3zone, ns3pr);
             
             staging->id_zone_map[bbd->d_id].setCtime();
             staging->id_zone_map[bbd->d_id].d_loaded=true; 
@@ -827,6 +880,7 @@ void Bind2Backend::queueReload(BB2DomainInfo *bbd)
     // cerr<<"Sorting done"<<endl;
     
     fixupAuth(staging->id_zone_map[bbd->d_id].d_records);
+    doEmptyNonTerminals(staging, bbd->d_id, nsec3zone, ns3pr);
     staging->id_zone_map[bbd->d_id].setCtime();
 
     s_state->id_zone_map[bbd->d_id]=staging->id_zone_map[bbd->d_id]; // move over
@@ -856,9 +910,9 @@ bool Bind2Backend::findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const std::str
 
   //cout<<"starting lower bound for: '"<<domain<<"'"<<endl;
 
-  recordstorage_t::const_iterator iter = bbd.d_records->lower_bound(domain);
+  recordstorage_t::const_iterator iter = bbd.d_records->upper_bound(domain);
 
-  while(iter == bbd.d_records->end() || (iter->qname) > domain || (!(iter->auth) && !(iter->qtype == QType::NS)))
+  while(iter == bbd.d_records->end() || (iter->qname) > domain || (!(iter->auth) && (!(iter->qtype == QType::NS))) || (!(iter->qtype)))
     iter--;
 
   before=iter->qname;
@@ -874,7 +928,7 @@ bool Bind2Backend::findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const std::str
     //cerr<<"\tFound: '"<<(iter->qname)<<"' (nsec3hash='"<<(iter->nsec3hash)<<"')"<<endl;
     // this iteration is theoretically unnecessary - glue always sorts right behind a delegation
     // so we will never get here. But let's do it anyway.
-    while(!(iter->auth) && !(iter->qtype == QType::NS))
+    while((!(iter->auth) && (!(iter->qtype == QType::NS))) || (!(iter->qtype)))
     {
       iter++;
       if(iter == bbd.d_records->end())
index 617fa011bc7128f35daac1e503d70b1154025248..fea1af67cec8075fb4f0b63dfd9e5a3556ef4773 100644 (file)
@@ -246,6 +246,7 @@ private:
   static string DLListRejectsHandler(const vector<string>&parts, Utility::pid_t ppid);
   static string DLReloadNowHandler(const vector<string>&parts, Utility::pid_t ppid);
   static void fixupAuth(shared_ptr<recordstorage_t> records);
+  static void doEmptyNonTerminals(shared_ptr<State> stage, int id, bool nsec3zone, NSEC3PARAMRecordContent ns3pr);
   void loadConfig(string *status=0);
   static void nukeZoneRecords(BB2DomainInfo *bbd);
 };
index 12396e8abd17b01e8780ee7cc03ed8c98b6c8a09..18e342e9b5e4d6331b49bd5ee45485db63db1d9f 100644 (file)
@@ -287,7 +287,11 @@ GSQLBackend::GSQLBackend(const string &mode, const string &suffix)
     d_afterOrderQuery = getArg("get-order-after-query");
     d_lastOrderQuery = getArg("get-order-last-query");
     d_setOrderAuthQuery = getArg("set-order-and-auth-query");
+    d_nullifyOrderNameQuery = getArg("nullify-ordername-query");
     d_nullifyOrderNameAndAuthQuery = getArg("nullify-ordername-and-auth-query");
+    d_removeEmptyNonTerminalsFromZoneQuery = getArg("remove-empty-non-terminals-from-zone-query");
+    d_insertEmptyNonTerminalQuery = getArg("insert-empty-non-terminal-query");
+    d_deleteEmptyNonTerminalQuery = getArg("delete-empty-non-terminal-query");
     
     d_AddDomainKeyQuery = getArg("add-domain-key-query");
     d_ListDomainKeysQuery = getArg("list-domain-keys-query");
@@ -326,6 +330,17 @@ bool GSQLBackend::updateDNSSECOrderAndAuthAbsolute(uint32_t domain_id, const std
   return true;
 }
 
+bool GSQLBackend::nullifyDNSSECOrderName(uint32_t domain_id, const std::string& qname)
+{
+  if(!d_dnssecQueries)
+    return false;
+  char output[1024];
+
+  snprintf(output, sizeof(output)-1, d_nullifyOrderNameQuery.c_str(), domain_id, sqlEscape(qname).c_str());
+  d_db->doCommand(output);
+  return true;
+}
+
 bool GSQLBackend::nullifyDNSSECOrderNameAndAuth(uint32_t domain_id, const std::string& qname, const std::string& type)
 {
   if(!d_dnssecQueries)
@@ -337,6 +352,50 @@ bool GSQLBackend::nullifyDNSSECOrderNameAndAuth(uint32_t domain_id, const std::s
   return true;
 }
 
+bool GSQLBackend::updateEmptyNonTerminals(uint32_t domain_id, const std::string& zonename, set<string>& insert, set<string>& erase, bool remove)
+{
+  if(!d_dnssecQueries)
+    return false;
+  char output[1024];
+
+  if(remove) {
+    snprintf(output,sizeof(output)-1,d_removeEmptyNonTerminalsFromZoneQuery.c_str(), domain_id);
+    try {
+      d_db->doCommand(output);
+    }
+    catch (SSqlException &e) {
+      throw AhuException("GSQLBackend unable to delete empty non-terminal records from domain_id "+itoa(domain_id)+": "+e.txtReason());
+      return false;
+    }
+  }
+  else
+  {
+    BOOST_FOREACH(const string qname, erase) {
+      snprintf(output,sizeof(output)-1,d_deleteEmptyNonTerminalQuery.c_str(), domain_id, sqlEscape(qname).c_str());
+      try {
+        d_db->doCommand(output);
+      }
+      catch (SSqlException &e) {
+        throw AhuException("GSQLBackend unable to delete empty non-terminal rr "+qname+" from domain_id "+itoa(domain_id)+": "+e.txtReason());
+        return false;
+      }
+    }
+  }
+
+  BOOST_FOREACH(const string qname, insert) {
+    snprintf(output,sizeof(output)-1,d_insertEmptyNonTerminalQuery.c_str(), domain_id, sqlEscape(qname).c_str());
+    try {
+      d_db->doCommand(output);
+    }
+    catch (SSqlException &e) {
+      throw AhuException("GSQLBackend unable to insert empty non-terminal rr "+qname+" in domain_id "+itoa(domain_id)+": "+e.txtReason());
+      return false;
+    }
+  }
+
+  return true;
+}
+
 bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string& qname, std::string& unhashed, std::string& before, std::string& after)
 {
   if(!d_dnssecQueries)
index 7186ec20899025e9fd60aa75fc2c1fc0b9d3560e..08db1dce77d9579f8b993f631c3435286b770576 100644 (file)
@@ -43,7 +43,9 @@ public:
   virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string& qname, std::string& unhashed, std::string& before, std::string& after);
   bool updateDNSSECOrderAndAuth(uint32_t domain_id, const std::string& zonename, const std::string& qname, bool auth);
   virtual bool updateDNSSECOrderAndAuthAbsolute(uint32_t domain_id, const std::string& qname, const std::string& ordername, bool auth);
+  virtual bool nullifyDNSSECOrderName(uint32_t domain_id, const std::string& qname);
   virtual bool nullifyDNSSECOrderNameAndAuth(uint32_t domain_id, const std::string& qname, const std::string& type);
+  virtual bool updateEmptyNonTerminals(uint32_t domain_id, const std::string& zonename, set<string>& insert ,set<string>& erase, bool remove);
 
   virtual bool calculateSOASerial(const string& domain, const SOAData& sd, time_t& serial);
 
@@ -92,7 +94,11 @@ private:
   string d_afterOrderQuery;
   string d_lastOrderQuery;
   string d_setOrderAuthQuery;
+  string d_nullifyOrderNameQuery;
   string d_nullifyOrderNameAndAuthQuery;
+  string d_removeEmptyNonTerminalsFromZoneQuery;
+  string d_insertEmptyNonTerminalQuery;
+  string d_deleteEmptyNonTerminalQuery;
 
   string d_AddDomainKeyQuery;
   string d_ListDomainKeysQuery;
index 78b756dc172f1297df4f76c428e79d6d7d2f62f2..2974a6b73da1f36c05d3b6486a0ec5eb9facd8f1 100644 (file)
@@ -6,7 +6,6 @@
 #include <botan/rsa.h>
 #include <botan/pubkey.h>
 #include <botan/look_pk.h>
-#include <botan/numthry.h>
 #include "dnssecinfra.hh"
 
 using namespace Botan;
@@ -93,15 +92,13 @@ DNSCryptoKeyEngine::storvector_t BotanRSADNSCryptoKeyEngine::convertToISCVector(
 #if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)  
   BigInt d1 = d_key->get_d() % (d_key->get_p() - 1);
   BigInt d2 = d_key->get_d() % (d_key->get_q() - 1);
-  BigInt c = inverse_mod(d_key->get_q(), d_key->get_p());
 #else
   BigInt d1 = d_key->get_d1();
   BigInt d2 = d_key->get_d2();
-  BigInt c = d_key->get_c();
 #endif
   storvect.push_back(make_pair("Exponent1", asRaw(d1)));
   storvect.push_back(make_pair("Exponent2", asRaw(d2)));
-  storvect.push_back(make_pair("Coefficient", asRaw(c)));
+  storvect.push_back(make_pair("Coefficient", asRaw(d_key->get_q())));
   return storvect;
 }
 
index 3018a9a2d77b0fe52127089488f6d365b8c3a8c5..baedec5905ed6e0eb939d6a411c8b4e7cc37956d 100644 (file)
@@ -132,6 +132,7 @@ void declareArguments()
   ::arg().set("setgid","If set, change group id to this gid for more security")="";
 
   ::arg().set("max-cache-entries", "Maximum number of cache entries")="1000000";
+  ::arg().set("max-ent-entries", "Maximum number of empty non-terminals in a zone")="100000";
   ::arg().set("entropy-source", "If set, read entropy from this file")="/dev/urandom";
 
   ::arg().set("lua-prequery-script", "Lua script with prequery handler")="";
index 6a40965600aabb89224dd6cb7abe106c1eb40ba2..4b8b9c46427bf27a544fb40fd937058e201d0dc6 100644 (file)
@@ -136,6 +136,16 @@ public:
     return false;
   }
 
+  virtual bool updateEmptyNonTerminals(uint32_t domain_id, const std::string& zonename, set<string>& insert, set<string>& erase, bool remove)
+  {
+    return false;
+  }
+
+  virtual bool nullifyDNSSECOrderName(uint32_t domain_id, const std::string& qname)
+  {
+    return false;
+  }
+
   virtual bool nullifyDNSSECOrderNameAndAuth(uint32_t domain_id, const std::string& qname, const std::string& type)
   {
     return false;
index aa16b2b4e9f905fb386cdbebbadc563dcf246a3a..15fccdc4f6f89340324b9db7af90e5a35d0b31a0 100644 (file)
@@ -172,8 +172,11 @@ void NSEC3RecordContent::toPacket(DNSPacketWriter& pw)
 
   res[0] = static_cast<unsigned char>(window);
   res[1] = static_cast<unsigned char>(len);
-  tmp.assign(res, res+len+2);
-  pw.xfrBlob(tmp);
+
+  if (len) {
+    tmp.assign(res, res+len+2);
+    pw.xfrBlob(tmp);
+  }
 }
 
 NSEC3RecordContent::DNSRecordContent* NSEC3RecordContent::make(const DNSRecord &dr, PacketReader& pr) 
index 87434d01e430ed1ef7dfd69f529b282e3ea1e84b..ce6f934b682661f61e2b84a86c46e542feb45623 100644 (file)
@@ -424,16 +424,14 @@ void PacketHandler::emitNSEC(const std::string& begin, const std::string& end, c
   DNSResourceRecord rr;
   B.lookup(QType(QType::ANY), begin);
   while(B.get(rr)) {
-    if(rr.domain_id == sd.domain_id && (rr.qtype.getCode() == QType::NS || rr.auth)) 
+    if(rr.domain_id == sd.domain_id && (rr.qtype.getCode() == QType::NS || rr.auth))
       nrc.d_set.insert(rr.qtype.getCode());    
   }
   
   nrc.d_next=end;
 
-  rr.ttl = sd.default_ttl;
-
   rr.qname=begin;
-  // we can leave ttl untouched, either it is the default, or it is what we retrieved above
+  rr.ttl = sd.default_ttl;
   rr.qtype=QType::NSEC;
   rr.content=nrc.getZoneRepresentation();
   rr.d_place = (mode == 5 ) ? DNSResourceRecord::ANSWER: DNSResourceRecord::AUTHORITY;
@@ -446,33 +444,37 @@ void emitNSEC3(DNSBackend& B, const NSEC3PARAMRecordContent& ns3prc, const SOADa
 {
 //  cerr<<"We should emit NSEC3 '"<<toLower(toBase32Hex(begin))<<"' - ('"<<toNSEC3<<"') - '"<<toLower(toBase32Hex(end))<<"' (unhashed: '"<<unhashed<<"')"<<endl;
   NSEC3RecordContent n3rc;
-  n3rc.d_set.insert(QType::RRSIG);
   n3rc.d_salt=ns3prc.d_salt;
   n3rc.d_flags = ns3prc.d_flags;
   n3rc.d_iterations = ns3prc.d_iterations;
   n3rc.d_algorithm = 1; // SHA1, fixed in PowerDNS for now
 
-  DNSResourceRecord nsec3rr, rr;
-  B.lookup(QType(QType::ANY), unhashed);
-  while(B.get(rr)) {
-    n3rc.d_set.insert(rr.qtype.getCode());    
-  }
+  DNSResourceRecord rr;
+  if(!unhashed.empty()) {
+    B.lookup(QType(QType::ANY), unhashed);
+    while(B.get(rr)) {
+      if(rr.domain_id == sd.domain_id && rr.qtype.getCode()) // skip out of zone data and empty non-terminals
+        n3rc.d_set.insert(rr.qtype.getCode());
+    }
 
-  if(unhashed == sd.qname) {
-    n3rc.d_set.insert(QType::NSEC3PARAM);
-    n3rc.d_set.insert(QType::DNSKEY);
+    if(unhashed == sd.qname) {
+      n3rc.d_set.insert(QType::NSEC3PARAM);
+      n3rc.d_set.insert(QType::DNSKEY);
+    }
   }
+
+  if (n3rc.d_set.size())
+    n3rc.d_set.insert(QType::RRSIG);
   
   n3rc.d_nexthash=end;
 
-  rr.ttl = sd.default_ttl;
   rr.qname=dotConcat(toLower(toBase32Hex(begin)), sd.qname);
-  
+  rr.ttl = sd.default_ttl;
   rr.qtype=QType::NSEC3;
   rr.content=n3rc.getZoneRepresentation();
-  
   rr.d_place = (mode == 5 ) ? DNSResourceRecord::ANSWER: DNSResourceRecord::AUTHORITY;
   rr.auth = true;
+  
   r->addRecord(rr);
 }
 
@@ -484,7 +486,7 @@ void PacketHandler::emitNSEC3(const NSEC3PARAMRecordContent& ns3prc, const SOADa
 
 /*
    mode 0 = No Data Responses, QTYPE is not DS
-   mode 1 = No Data Responses, QTYPE is DS (can we do this already?)
+   mode 1 = No Data Responses, QTYPE is DS
    mode 2 = Wildcard No Data Responses
    mode 3 = Wildcard Answer Responses
    mode 4 = Name Error Responses
@@ -542,8 +544,10 @@ bool getNSEC3Hashes(bool narrow, DNSBackend* db, int id, const std::string& hash
   if(narrow) { // nsec3-narrow
     ret=true;
     before=hashed;
-    if(decrement)
+    if(decrement) {
       decrementHash(before);
+      unhashed.clear();
+    }
     after=hashed;
     incrementHash(after);
   }
@@ -650,36 +654,24 @@ void PacketHandler::addNSEC(DNSPacket *p, DNSPacket *r, const string& target, co
 
   string before,after;
   //cerr<<"Calling getBeforeandAfter!"<<endl;
+
   if (mode == 2) {
+    // wildcard NO-DATA
     sd.db->getBeforeAndAfterNames(sd.domain_id, auth, p->qdomain, before, after);
+    emitNSEC(before, after, target, sd, r, mode);
+    sd.db->getBeforeAndAfterNames(sd.domain_id, auth, target, before, after);
   }
   else {
     sd.db->getBeforeAndAfterNames(sd.domain_id, auth, target, before, after);
   }
-  // cerr<<"Done calling, before='"<<before<<"', after='"<<after<<"'"<<endl;
-
-  // this stuff is wrong (but it appears to work)
+  emitNSEC(before, after, target, sd, r, mode);
   
-  if(mode == 0 || mode == 1 || mode == 5)
-    emitNSEC(target, after, target, sd, r, mode);
-  
-  if(mode == 2 || mode == 4)  {
-    emitNSEC(before, after, target, sd, r, mode);
-
-    if (mode == 2) {
-      sd.db->getBeforeAndAfterNames(sd.domain_id, auth, target, before, after);
-      emitNSEC(target, after, auth, sd, r, mode);
-    }
-    else {
+  if (mode == 4) {
       // this one does wildcard denial, if applicable
       sd.db->getBeforeAndAfterNames(sd.domain_id, auth, auth, before, after);
       emitNSEC(auth, after, auth, sd, r, mode);
-    }
   }
 
-  if(mode == 3)
-    emitNSEC(before, after, target, sd, r, mode);
-
   return;
 }
 
@@ -1289,14 +1281,20 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
       }
     }
     else if(weDone) {
+      bool haveRecords = false;
       BOOST_FOREACH(rr, rrset) {
-        if((p->qtype.getCode() == QType::ANY || rr.qtype == p->qtype) && rr.auth) 
+        if((p->qtype.getCode() == QType::ANY || rr.qtype == p->qtype) && rr.qtype.getCode() && rr.auth) {
           r->addRecord(rr);
+          haveRecords = true;
+        }
       }
 
-      if(p->qtype.getCode() == QType::ANY) {
-        completeANYRecords(p, r, sd, target);
+      if (haveRecords) {
+        if(p->qtype.getCode() == QType::ANY)
+          completeANYRecords(p, r, sd, target);
       }
+      else
+        makeNOError(p, r, rr.qname, sd, 0);
 
       goto sendit;
     }
index aaf4879e9b8e287bf8abc20a4e6d57e897fa68d9..873f6f7f37aeb18f056eaf6509c5511d684830d9 100644 (file)
 #
 # max-cache-entries=1000000
 
+#################################
+# max-ent-entries      Maximum number of empty non-terminals in a zone
+#
+# max-ent-entries=100000
+
 #################################
 # max-queue-length     Maximum queuelength before considering situation lost
 #
index 2d62a2c5b7250e929f9d9388d344fa2c1d4f36bc..db09cef15cd7f329c7c84ad27972ca09a66e2944 100644 (file)
@@ -66,6 +66,7 @@ void loadMainConfig(const std::string& configdir)
   cleanSlashes(configname);
   
   ::arg().laxFile(configname.c_str());
+  ::arg().set("max-ent-entries", "Maximum number of empty non-terminals in a zone")="100000";
   ::arg().set("module-dir","Default directory for modules")=LIBDIR;
   BackendMakers().launch(::arg()["launch"]); // vrooooom!
   ::arg().laxFile(configname.c_str());    
@@ -108,22 +109,28 @@ void rectifyZone(DNSSECKeeper& dk, const std::string& zone)
     return;
   } 
   sd.db->list(zone, sd.domain_id);
-  DNSResourceRecord rr;
 
-  set<string> qnames, nsset, dsnames;
+  DNSResourceRecord rr;
+  set<string> qnames, nsset, dsnames, nonterm, insnonterm, delnonterm;
+  bool doent=true;
   
   while(sd.db->get(rr)) {
-    qnames.insert(rr.qname);
-    if(rr.qtype.getCode() == QType::NS && !pdns_iequals(rr.qname, zone)) 
-      nsset.insert(rr.qname);
-    if(rr.qtype.getCode() == QType::DS)
-      dsnames.insert(rr.qname);
+    if (rr.qtype.getCode())
+    {
+      qnames.insert(rr.qname);
+      if(rr.qtype.getCode() == QType::NS && !pdns_iequals(rr.qname, zone)) 
+        nsset.insert(rr.qname);
+      if(rr.qtype.getCode() == QType::DS)
+        dsnames.insert(rr.qname);
+    }
+    else
+      if(doent)
+        delnonterm.insert(rr.qname);
   }
 
   NSEC3PARAMRecordContent ns3pr;
   bool narrow;
   bool haveNSEC3=dk.getNSEC3PARAM(zone, &ns3pr, &narrow);
-  string hashed;
   if(!haveNSEC3) 
     cerr<<"Adding NSEC ordering information"<<endl;
   else if(!narrow)
@@ -133,20 +140,29 @@ void rectifyZone(DNSSECKeeper& dk, const std::string& zone)
   
   if(doTransaction)
     sd.db->startTransaction("", -1);
+    
+  bool realrr=true;
+  string hashed;
+
+  uint32_t maxent = ::arg().asNum("max-ent-entries");
+
+  dononterm:;
   BOOST_FOREACH(const string& qname, qnames)
   {
-    string shorter(qname);
     bool auth=true;
+    string shorter(qname);
 
-    do {
-      if(nsset.count(shorter)) {  
-        auth=false;
-        break;
-      }
-    }while(chopOff(shorter));
+    if(realrr) {
+      do {
+        if(nsset.count(shorter)) {
+          auth=false;
+          break;
+        }
+      } while(chopOff(shorter));
 
-    if(dsnames.count(qname))
-      auth=true;
+      if(dsnames.count(qname))
+        auth=true;
+    }
 
     if(haveNSEC3)
     {
@@ -156,7 +172,7 @@ void rectifyZone(DNSSECKeeper& dk, const std::string& zone)
           cerr<<"'"<<qname<<"' -> '"<< hashed <<"'"<<endl;
       }
       sd.db->updateDNSSECOrderAndAuthAbsolute(sd.domain_id, qname, hashed, auth);
-      if(!auth || dsnames.count(qname))
+      if((!auth || dsnames.count(qname)) && realrr)
       {
         sd.db->nullifyDNSSECOrderNameAndAuth(sd.domain_id, qname, "NS");
         sd.db->nullifyDNSSECOrderNameAndAuth(sd.domain_id, qname, "A");
@@ -165,14 +181,62 @@ void rectifyZone(DNSSECKeeper& dk, const std::string& zone)
     }
     else // NSEC
     {
-      sd.db->updateDNSSECOrderAndAuth(sd.domain_id, zone, qname, auth);
-      if(!auth || dsnames.count(qname))
+      if(realrr)
       {
-        sd.db->nullifyDNSSECOrderNameAndAuth(sd.domain_id, qname, "A");
-        sd.db->nullifyDNSSECOrderNameAndAuth(sd.domain_id, qname, "AAAA");
+        sd.db->updateDNSSECOrderAndAuth(sd.domain_id, zone, qname, auth);
+        if(!auth || dsnames.count(qname))
+        {
+          sd.db->nullifyDNSSECOrderNameAndAuth(sd.domain_id, qname, "A");
+          sd.db->nullifyDNSSECOrderNameAndAuth(sd.domain_id, qname, "AAAA");
+        }
+      }
+      else
+      {
+        sd.db->nullifyDNSSECOrderName(sd.domain_id, qname);
+      }
+    }
+
+    if(auth && realrr && doent)
+    {
+      shorter=qname;
+      while(!pdns_iequals(shorter, zone) && chopOff(shorter))
+      {
+        if(!qnames.count(shorter) && !nonterm.count(shorter))
+        {
+          if(!(maxent))
+          {
+            cerr<<"Zone '"<<zone<<"' has too many empty non terminals."<<endl;
+            insnonterm.clear();
+            delnonterm.clear();
+            doent=false;
+            break;
+          }
+          nonterm.insert(shorter);
+          if (!delnonterm.count(shorter))
+            insnonterm.insert(shorter);
+          else
+            delnonterm.erase(shorter);
+          --maxent;
+        }
       }
     }
   }
+
+  if(realrr)
+  {
+    //cerr<<"Total: "<<nonterm.size()<<" Insert: "<<insnonterm.size()<<" Delete: "<<delnonterm.size()<<endl;
+    if(!insnonterm.empty() || !delnonterm.empty() || !doent)
+    {
+      sd.db->updateEmptyNonTerminals(sd.domain_id, zone, insnonterm, delnonterm, !doent);
+    }
+    if(doent)
+    {
+      realrr=false;
+      qnames=nonterm;
+      goto dononterm;
+    }
+  }
+
   if(doTransaction)
     sd.db->commitTransaction();
 }
index 18e1ebb1267675399121d9e7ca7392d07ffa9ae0..eb4324fc527033c99f7d8533a93f064e0904b83c 100644 (file)
@@ -113,7 +113,7 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
     domain_id=di.id;
 
     Resolver::res_t recs;
-    set<string> nsset, qnames, dsnames;
+    set<string> nsset, qnames, dsnames, nonterm, delnonterm;
     
     ComboAddress raddr(remote, 53);
     
@@ -201,19 +201,12 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
           dnssecZone = gotPresigned = true;
           continue;
         }
-          
+
         if(!endsOn(i->qname, domain)) { 
           L<<Logger::Error<<"Remote "<<remote<<" tried to sneak in out-of-zone data '"<<i->qname<<"'|"<<i->qtype.getName()<<" during AXFR of zone '"<<domain<<"', ignoring"<<endl;
           continue;
         }
         
-        if(i->qtype.getCode() == QType::NS && !pdns_iequals(i->qname, domain)) 
-          nsset.insert(i->qname);
-        if(i->qtype.getCode() != QType::RRSIG) // this excludes us hashing RRSIGs for NSEC(3)
-          qnames.insert(i->qname);
-        if(i->qtype.getCode() == QType::DS)
-          dsnames.insert(i->qname);
-          
         i->domain_id=domain_id;
 #if 0
         if(i->qtype.getCode()>=60000)
@@ -233,6 +226,12 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
         }
         else {
           di.backend->feedRecord(*i);
+          if(i->qtype.getCode() == QType::NS && !pdns_iequals(i->qname, domain)) 
+            nsset.insert(i->qname);
+          if(i->qtype.getCode() != QType::RRSIG) // this excludes us hashing RRSIGs for NSEC(3)
+            qnames.insert(i->qname);
+          if(i->qtype.getCode() == QType::DS)
+           dsnames.insert(i->qname);
         }
       }
     }
@@ -243,20 +242,29 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
       haveNSEC3 = false;
     }
 
+    bool doent=true;
+    bool realrr=true;
     string hashed;
+
+    uint32_t maxent = ::arg().asNum("max-ent-entries");
+
+    dononterm:;
     BOOST_FOREACH(const string& qname, qnames)
     {
-      string shorter(qname);
       bool auth=true;
-      do {
-        if(nsset.count(shorter)) {  
-          auth=false;
-          break;
-        }
-      }while(chopOff(shorter));
-      
-      if(dsnames.count(qname))
-        auth=true;
+      string shorter(qname);
+
+      if(realrr) {
+        do {
+          if(nsset.count(shorter)) {
+            auth=false;
+            break;
+          }
+        }while(chopOff(shorter));
+
+        if(dsnames.count(qname))
+          auth=true;
+      }
 
       if(dnssecZone && haveNSEC3)
       {
@@ -264,7 +272,7 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
           hashed=toLower(toBase32Hex(hashQNameWithSalt(ns3pr.d_iterations, ns3pr.d_salt, qname)));
         }
         di.backend->updateDNSSECOrderAndAuthAbsolute(domain_id, qname, hashed, auth); // this should always be done
-        if(!auth || dsnames.count(qname))
+        if((!auth || dsnames.count(qname)) && realrr)
         {
           di.backend->nullifyDNSSECOrderNameAndAuth(domain_id, qname, "NS");
           di.backend->nullifyDNSSECOrderNameAndAuth(domain_id, qname, "A");
@@ -273,14 +281,48 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
       }
       else // NSEC
       {
-        di.backend->updateDNSSECOrderAndAuth(domain_id, domain, qname, auth);
-        if(!auth || dsnames.count(qname))
+        if(realrr)
         {
-          di.backend->nullifyDNSSECOrderNameAndAuth(domain_id, qname, "A");
-          di.backend->nullifyDNSSECOrderNameAndAuth(domain_id, qname, "AAAA");
+          di.backend->updateDNSSECOrderAndAuth(domain_id, domain, qname, auth);
+          if(!auth || dsnames.count(qname))
+          {
+            di.backend->nullifyDNSSECOrderNameAndAuth(domain_id, qname, "A");
+            di.backend->nullifyDNSSECOrderNameAndAuth(domain_id, qname, "AAAA");
+          }
+        }
+      }
+
+      if(auth && realrr && doent)
+      {
+        shorter=qname;
+        while(!pdns_iequals(shorter, domain) && chopOff(shorter))
+        {
+          if(!qnames.count(shorter) && !nonterm.count(shorter))
+          {
+            if(!(maxent))
+            {
+              L<<Logger::Error<<"AXFR zone "<<domain<<" has too many empty non terminals."<<endl;
+              nonterm.empty();
+              doent=false;
+              break;
+            }
+            nonterm.insert(shorter);
+            --maxent;
+          }
         }
       }
     }
+
+    if(!nonterm.empty() && realrr && doent)
+    {
+      if(di.backend->updateEmptyNonTerminals(domain_id, domain, nonterm, delnonterm, false))
+      {
+        realrr=false;
+        qnames=nonterm;
+        goto dononterm;
+      }
+    }
+
     di.backend->commitTransaction();
     di.backend->setFresh(domain_id);
     PC.purge(domain+"$");
index b3d20723fad9e236efc7a5e6d93d3cdfe5ddcde4..b88856cc0b5ab94c930a47ea3e45397c378085e4 100644 (file)
@@ -639,11 +639,19 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
       continue;
     records++;
     if(securedZone && (rr.auth || (!NSEC3Zone && rr.qtype.getCode() == QType::NS) || rr.qtype.getCode() == QType::DS)) { // this is probably NSEC specific, NSEC3 is different
-      keyname = NSEC3Zone ? hashQNameWithSalt(ns3pr.d_iterations, ns3pr.d_salt, rr.qname) : labelReverse(rr.qname);
-      NSECXEntry& ne = nsecxrepo[keyname];
-      ne.d_set.insert(rr.qtype.getCode());
-      ne.d_ttl = sd.default_ttl;
+      if (NSEC3Zone || rr.qtype.getCode()) {
+        keyname = NSEC3Zone ? hashQNameWithSalt(ns3pr.d_iterations, ns3pr.d_salt, rr.qname) : labelReverse(rr.qname);
+        NSECXEntry& ne = nsecxrepo[keyname];
+        ne.d_ttl = sd.default_ttl;
+        if (rr.qtype.getCode()) {
+          ne.d_set.insert(rr.qtype.getCode());
+        }
+      }
     }
+
+    if (!rr.qtype.getCode())
+      continue; // skip empty non-terminals
+
     if(rr.qtype.getCode() == QType::SOA)
       continue; // skip SOA - would indicate end of AXFR
 
@@ -673,7 +681,8 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
       for(nsecxrepo_t::const_iterator iter = nsecxrepo.begin(); iter != nsecxrepo.end(); ++iter) {
         NSEC3RecordContent n3rc;
         n3rc.d_set = iter->second.d_set;
-        n3rc.d_set.insert(QType::RRSIG);
+        if (n3rc.d_set.size())
+          n3rc.d_set.insert(QType::RRSIG);
         n3rc.d_salt=ns3pr.d_salt;
         n3rc.d_flags = ns3pr.d_flags;
         n3rc.d_iterations = ns3pr.d_iterations;
@@ -686,7 +695,7 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
     
         rr.qname = dotConcat(toLower(toBase32Hex(iter->first)), sd.qname);
     
-        rr.ttl = iter->second.d_ttl;
+        rr.ttl = sd.default_ttl;
         rr.content = n3rc.getZoneRepresentation();
         rr.qtype = QType::NSEC3;
         rr.d_place = DNSResourceRecord::ANSWER;
@@ -720,7 +729,7 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
   
       rr.qname = labelReverse(iter->first);
   
-      rr.ttl = iter->second.d_ttl;
+      rr.ttl = sd.default_ttl;
       rr.content = nrc.getZoneRepresentation();
       rr.qtype = QType::NSEC;
       rr.d_place = DNSResourceRecord::ANSWER;
index 87ab6efab3cc9efa93f566ab611a1dc10e564d19..8713faa7a6b1d3aaead1f21afe4e3750dc3b978a 100644 (file)
@@ -1,7 +1,7 @@
 b6d1c64a890e3f3ce40970724a12eb0b  ../regression-tests/example.com
-bb578fbd58265c977dc83a52bde80928  ../regression-tests/test.com
+451fb64d4a6b33b63124556d789ac3d0  ../regression-tests/test.com
 7d726bc367bf5e6ee5f1689994c6b6d4  ../regression-tests/wtest.com
 a0670eef8fba3e16908057af8de2c2f2  ../regression-tests/dnssec-parent.com
 42dd3a56c7d268e75836371878819ec4  ../regression-tests/delegated.dnssec-parent.com
 24514dc104b22206daeb973ff9303545  ../regression-tests/minimal.com
-61490253e7b3a9ac1e0be2214c16cfa0  ../modules/tinydnsbackend/data.cdb
+f1e5a8ab3243ad2c47b29d06f22bdeaf  ../modules/tinydnsbackend/data.cdb
index ac424097697aabf74926678afb313bb0a722a2b3..198d560cce72ee6abce2e8d93a000f00f36da7a2 100644 (file)
@@ -1,6 +1,6 @@
 0      www.something.wtest.com.        IN      A       3600    4.3.2.1
 0      www.something.wtest.com.        IN      RRSIG   3600    A 8 3 3600 [expiry] [inception] [keytag] wtest.com. ...
-1      7q60llva2bt9ucubvn553q9s2pf8ho38.wtest.com.     IN      NSEC3   86400   1 1 1 abcd 7Q60LLVA2BT9UCUBVN553Q9S2PF8HO3A RRSIG
+1      7q60llva2bt9ucubvn553q9s2pf8ho38.wtest.com.     IN      NSEC3   86400   1 1 1 abcd 7Q60LLVA2BT9UCUBVN553Q9S2PF8HO3A
 1      7q60llva2bt9ucubvn553q9s2pf8ho38.wtest.com.     IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] wtest.com. ...
 2      .       IN      OPT     32768   
 Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
index 0789f1dd3bca5f641231959e556d9b77e56bb393..c9a14ea26d403dfcf1cd10c4ffaf18525f1b1338 100755 (executable)
@@ -1,5 +1,8 @@
 #!/bin/sh
+if [ ! -f $testname/use.drill ]
+then
 ../pdns/sdig $nameserver $port $1 $2 $3 | LC_ALL=C sort
+fi
 ../pdns/nsec3dig $nameserver $port $1 $2 > $testname/nsec3dig.out 2>&1
 drill -a -p $port -o rd -D -S -k trustedkeys $1 $2 @$nameserver > $testname/drillchase.out 2>&1 
 echo RETVAL: $? >> $testname/drillchase.out
@@ -12,4 +15,8 @@ then
        unbound-host -v -C unbound-host.conf -t $2 $1 > $testname/unbound-host.out 2>&1
        echo RETVAL: $? >> $testname/unbound-host.out
 fi
+if [ -f $testname/use.drill ]
+then
+       cat $testname/drill.out
+fi
 grep -i bogus $testname/*.out
index addd099613ef305e8432df449293c50dd21312e2..9f73d539029d3638f4a0cb6ec62e6c60c3536173 100644 (file)
@@ -1,6 +1,6 @@
 1      example.com.    IN      RRSIG   86400   SOA 8 2 100000 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      SOA     86400   ns1.example.com. ahu.example.com. 2000081501 28800 7200 604800 86400
-1      t67rqvqprigd7rtb5fah6c3o7g9th3iv.example.com.   IN      NSEC3   86400   1 1 1 abcd T67RQVQPRIGD7RTB5FAH6C3O7G9TH3J1 NS RRSIG
+1      t67rqvqprigd7rtb5fah6c3o7g9th3iv.example.com.   IN      NSEC3   86400   1 1 1 abcd T67RQVQPRIGD7RTB5FAH6C3O7G9TH3J1
 1      t67rqvqprigd7rtb5fah6c3o7g9th3iv.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      vtnq6ocn2vkuiv3nju14oqtaen2mt5sk.example.com.   IN      NSEC3   86400   1 1 1 abcd VTNQ6OCN2VKUIV3NJU14OQTAEN2MT5SL NS SOA MX RRSIG DNSKEY NSEC3PARAM
 1      vtnq6ocn2vkuiv3nju14oqtaen2mt5sk.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
index f1f8edd9b6a294fd7e1f74f35a8600e4c2833230..8b9130ea2034a25582104bc97d39d8bec9dace8f 100644 (file)
@@ -1,4 +1,4 @@
-1      be6iqh4fjrtdhacqk7g3iq96qcvf2qoi.dnssec-parent.com.     IN      NSEC3   86400   1 1 1 abcd BE6IQH4FJRTDHACQK7G3IQ96QCVF2QOK A NS SOA RRSIG
+1      be6iqh4fjrtdhacqk7g3iq96qcvf2qoi.dnssec-parent.com.     IN      NSEC3   86400   1 1 1 abcd BE6IQH4FJRTDHACQK7G3IQ96QCVF2QOK
 1      be6iqh4fjrtdhacqk7g3iq96qcvf2qoi.dnssec-parent.com.     IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] dnssec-parent.com. ...
 1      dnssec-parent.com.      IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] dnssec-parent.com. ...
 1      dnssec-parent.com.      IN      SOA     3600    ns1.dnssec-parent.com. ahu.example.com. 2005092501 28800 7200 604800 86400
index 9f62772b37d09ed3b97ce48a3c32a86e0110cc78..e10c2abb7171087c61374e8957c15656df0dc077 100644 (file)
@@ -1,4 +1,4 @@
-1      t67rqvqprigd7rtb5fah6c3o7g9th3iv.example.com.   IN      NSEC3   86400   1 1 1 abcd T67RQVQPRIGD7RTB5FAH6C3O7G9TH3J1 NS RRSIG
+1      t67rqvqprigd7rtb5fah6c3o7g9th3iv.example.com.   IN      NSEC3   86400   1 1 1 abcd T67RQVQPRIGD7RTB5FAH6C3O7G9TH3J1
 1      usa.example.com.        IN      NS      120     usa-ns1.usa.example.com.
 1      usa.example.com.        IN      NS      120     usa-ns2.usa.example.com.
 1      vtnq6ocn2vkuiv3nju14oqtaen2mt5sk.example.com.   IN      NSEC3   86400   1 1 1 abcd VTNQ6OCN2VKUIV3NJU14OQTAEN2MT5SL NS SOA MX RRSIG DNSKEY NSEC3PARAM
diff --git a/regression-tests/ent-any/command b/regression-tests/ent-any/command
new file mode 100755 (executable)
index 0000000..4c54b85
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+cleandig c.test.com ANY dnssec
diff --git a/regression-tests/ent-any/description b/regression-tests/ent-any/description
new file mode 100644 (file)
index 0000000..b2abf57
--- /dev/null
@@ -0,0 +1 @@
+Check if the empty non-terminal exists (ANY query)
diff --git a/regression-tests/ent-any/expected_result b/regression-tests/ent-any/expected_result
new file mode 100644 (file)
index 0000000..baa54f6
--- /dev/null
@@ -0,0 +1,7 @@
+1      blah.test.com.  IN      NSEC    86400   b.c.test.com. NS RRSIG NSEC
+1      blah.test.com.  IN      RRSIG   86400   NSEC 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=ANY
diff --git a/regression-tests/ent-any/expected_result.narrow b/regression-tests/ent-any/expected_result.narrow
new file mode 100644 (file)
index 0000000..5205970
--- /dev/null
@@ -0,0 +1,7 @@
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      NSEC3   86400   1 1 1 abcd S6G5SHC1JVOVL5FL9E943ADLONQLN7G5
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=ANY
diff --git a/regression-tests/ent-any/expected_result.nsec3 b/regression-tests/ent-any/expected_result.nsec3
new file mode 100644 (file)
index 0000000..1cc03b5
--- /dev/null
@@ -0,0 +1,7 @@
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      NSEC3   86400   1 1 1 abcd SA5VVPQN1COEJGJ3HBKFEKDNII8KKSQA
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=ANY
diff --git a/regression-tests/ent-any/skip.nodnssec b/regression-tests/ent-any/skip.nodnssec
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regression-tests/ent-axfr/command b/regression-tests/ent-axfr/command
new file mode 100755 (executable)
index 0000000..6ff578f
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+USEDRILL=1 cleandig test.com AXFR dnssec | grep -P 'IN\tNSEC' | LC_ALL=C sort
diff --git a/regression-tests/ent-axfr/description b/regression-tests/ent-axfr/description
new file mode 100644 (file)
index 0000000..f686869
--- /dev/null
@@ -0,0 +1 @@
+Are all NSECx records present in the AXFR output (including empty non-terminals)
diff --git a/regression-tests/ent-axfr/expected_result b/regression-tests/ent-axfr/expected_result
new file mode 100644 (file)
index 0000000..e7c6915
--- /dev/null
@@ -0,0 +1,16 @@
+*.a.b.c.test.com.      86400   IN      NSEC    counter.test.com. A RRSIG NSEC 
+*.test.test.com.       86400   IN      NSEC    sub.test.test.com. CNAME RRSIG NSEC 
+_double._tcp.dc.test.com.      86400   IN      NSEC    _ldap._tcp.dc.test.com. SRV RRSIG NSEC 
+_ldap._tcp.dc.test.com.        86400   IN      NSEC    enum.test.com. SRV RRSIG NSEC 
+_underscore.test.com.  86400   IN      NSEC    blah.test.com. TXT RRSIG NSEC 
+b.c.test.com.  86400   IN      NSEC    *.a.b.c.test.com. A RRSIG NSEC 
+blah.test.com. 86400   IN      NSEC    b.c.test.com. NS RRSIG NSEC 
+counter.test.com.      86400   IN      NSEC    _double._tcp.dc.test.com. A RRSIG NSEC 
+enum.test.com. 86400   IN      NSEC    server1.test.com. NAPTR RRSIG NSEC 
+server1.test.com.      86400   IN      NSEC    *.test.test.com. A RP RRSIG NSEC 
+sub.test.test.com.     86400   IN      NSEC    www.test.test.com. NS RRSIG NSEC 
+test.com.      86400   IN      NSEC    _underscore.test.com. NS SOA MX RRSIG NSEC DNSKEY 
+very-long-txt.test.com.        86400   IN      NSEC    within-server.test.com. TXT RRSIG NSEC 
+within-server.test.com.        86400   IN      NSEC    www.test.com. CNAME RRSIG NSEC 
+www.test.com.  86400   IN      NSEC    test.com. CNAME RRSIG NSEC 
+www.test.test.com.     86400   IN      NSEC    very-long-txt.test.com. A RRSIG NSEC 
diff --git a/regression-tests/ent-axfr/expected_result.nsec3 b/regression-tests/ent-axfr/expected_result.nsec3
new file mode 100644 (file)
index 0000000..1bdb901
--- /dev/null
@@ -0,0 +1,20 @@
+2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.     86400   IN      NSEC3   1 1 1 abcd  79u3das6ucctns1br3tvd8qkanni351l NS SOA MX RRSIG DNSKEY NSEC3PARAM 
+79u3das6ucctns1br3tvd8qkanni351l.test.com.     86400   IN      NSEC3   1 1 1 abcd  7mmura8h40be5n4koan7rnmkursamh99
+7mmura8h40be5n4koan7rnmkursamh99.test.com.     86400   IN      NSEC3   1 1 1 abcd  88f1bqrb2iscvfel2sqqcksvflnekap6
+88f1bqrb2iscvfel2sqqcksvflnekap6.test.com.     86400   IN      NSEC3   1 1 1 abcd  a5labagjjevr86gh0hf3jg7nufhga5ar CNAME RRSIG 
+a5labagjjevr86gh0hf3jg7nufhga5ar.test.com.     86400   IN      NSEC3   1 1 1 abcd  aovp95mr44hqefrqus6nomsd944bm3vb A RRSIG 
+aovp95mr44hqefrqus6nomsd944bm3vb.test.com.     86400   IN      NSEC3   1 1 1 abcd  b022o9dksaj737fh77e7kqqtj3om56ki A RRSIG 
+b022o9dksaj737fh77e7kqqtj3om56ki.test.com.     86400   IN      NSEC3   1 1 1 abcd  dafc69cv5n2tfcf6ovbvtv94drgmqjo5
+dafc69cv5n2tfcf6ovbvtv94drgmqjo5.test.com.     86400   IN      NSEC3   1 1 1 abcd  eban51bjgugorb20unp5peec7s5d2eka TXT RRSIG 
+eban51bjgugorb20unp5peec7s5d2eka.test.com.     86400   IN      NSEC3   1 1 1 abcd  h5855rvon2aasm8qv1nk49i1b2mkbejp SRV RRSIG 
+h5855rvon2aasm8qv1nk49i1b2mkbejp.test.com.     86400   IN      NSEC3   1 1 1 abcd  iai9hin25meh689r5v5gtifk8om5di0e A RRSIG 
+iai9hin25meh689r5v5gtifk8om5di0e.test.com.     86400   IN      NSEC3   1 1 1 abcd  igf4m7otecach14p0a6ingi7dbuas5b2 A RRSIG 
+igf4m7otecach14p0a6ingi7dbuas5b2.test.com.     86400   IN      NSEC3   1 1 1 abcd  o1l0fb73hi3qp4a3fnqjsleanlc883i3 A RP RRSIG 
+o1l0fb73hi3qp4a3fnqjsleanlc883i3.test.com.     86400   IN      NSEC3   1 1 1 abcd  plud9qqecuril62gcfp8br44i7eoq7c9 TXT RRSIG 
+plud9qqecuril62gcfp8br44i7eoq7c9.test.com.     86400   IN      NSEC3   1 1 1 abcd  qd81ag9inqts1ocs7api0pji94k27btr SRV RRSIG 
+qd81ag9inqts1ocs7api0pji94k27btr.test.com.     86400   IN      NSEC3   1 1 1 abcd  s6g5shc1jvovl5fl9e943adlonqln7g4 CNAME RRSIG 
+s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.     86400   IN      NSEC3   1 1 1 abcd  sa5vvpqn1coejgj3hbkfekdnii8kksqa
+sa5vvpqn1coejgj3hbkfekdnii8kksqa.test.com.     86400   IN      NSEC3   1 1 1 abcd  sra2sm4pl136bultass7qqnlblipe8am NAPTR RRSIG 
+sra2sm4pl136bultass7qqnlblipe8am.test.com.     86400   IN      NSEC3   1 1 1 abcd  vlvujatanof6feajoesti9kq4s0crst3 CNAME RRSIG 
+test.com.      86400   IN      NSEC3PARAM      1 0 1 abcd 
+vlvujatanof6feajoesti9kq4s0crst3.test.com.     86400   IN      NSEC3   1 1 1 abcd  2eu2gulbu53h9uvhfalshpbo2a83t6l2
diff --git a/regression-tests/ent-axfr/skip.nodnssec b/regression-tests/ent-axfr/skip.nodnssec
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regression-tests/ent-axfr/use.drill b/regression-tests/ent-axfr/use.drill
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regression-tests/ent-rr-enclosed-in-ent/command b/regression-tests/ent-rr-enclosed-in-ent/command
new file mode 100755 (executable)
index 0000000..64f4fab
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+cleandig b.c.test.com TXT dnssec
diff --git a/regression-tests/ent-rr-enclosed-in-ent/description b/regression-tests/ent-rr-enclosed-in-ent/description
new file mode 100644 (file)
index 0000000..6091578
--- /dev/null
@@ -0,0 +1 @@
+Check NSECx records if a record is enclosed (above and below) in empty-non-terminals.
diff --git a/regression-tests/ent-rr-enclosed-in-ent/expected_result b/regression-tests/ent-rr-enclosed-in-ent/expected_result
new file mode 100644 (file)
index 0000000..720708f
--- /dev/null
@@ -0,0 +1,7 @@
+1      b.c.test.com.   IN      NSEC    86400   *.a.b.c.test.com. A RRSIG NSEC
+1      b.c.test.com.   IN      RRSIG   86400   NSEC 8 4 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='b.c.test.com.', qtype=TXT
diff --git a/regression-tests/ent-rr-enclosed-in-ent/expected_result.narrow b/regression-tests/ent-rr-enclosed-in-ent/expected_result.narrow
new file mode 100644 (file)
index 0000000..1408e9b
--- /dev/null
@@ -0,0 +1,7 @@
+1      a5labagjjevr86gh0hf3jg7nufhga5ar.test.com.      IN      NSEC3   86400   1 1 1 abcd A5LABAGJJEVR86GH0HF3JG7NUFHGA5AS A RRSIG
+1      a5labagjjevr86gh0hf3jg7nufhga5ar.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='b.c.test.com.', qtype=TXT
diff --git a/regression-tests/ent-rr-enclosed-in-ent/expected_result.nsec3 b/regression-tests/ent-rr-enclosed-in-ent/expected_result.nsec3
new file mode 100644 (file)
index 0000000..9c10fb9
--- /dev/null
@@ -0,0 +1,7 @@
+1      a5labagjjevr86gh0hf3jg7nufhga5ar.test.com.      IN      NSEC3   86400   1 1 1 abcd AOVP95MR44HQEFRQUS6NOMSD944BM3VB A RRSIG
+1      a5labagjjevr86gh0hf3jg7nufhga5ar.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='b.c.test.com.', qtype=TXT
diff --git a/regression-tests/ent-rr-enclosed-in-ent/skip.nodnssec b/regression-tests/ent-rr-enclosed-in-ent/skip.nodnssec
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regression-tests/ent-soa/command b/regression-tests/ent-soa/command
new file mode 100755 (executable)
index 0000000..554149d
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+cleandig c.test.com SOA dnssec
diff --git a/regression-tests/ent-soa/description b/regression-tests/ent-soa/description
new file mode 100644 (file)
index 0000000..3fdd3d2
--- /dev/null
@@ -0,0 +1 @@
+Check if the empty non-terminal exists (SOA query)
diff --git a/regression-tests/ent-soa/expected_result b/regression-tests/ent-soa/expected_result
new file mode 100644 (file)
index 0000000..862bcff
--- /dev/null
@@ -0,0 +1,7 @@
+1      blah.test.com.  IN      NSEC    86400   b.c.test.com. NS RRSIG NSEC
+1      blah.test.com.  IN      RRSIG   86400   NSEC 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=SOA
diff --git a/regression-tests/ent-soa/expected_result.narrow b/regression-tests/ent-soa/expected_result.narrow
new file mode 100644 (file)
index 0000000..43adea9
--- /dev/null
@@ -0,0 +1,7 @@
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      NSEC3   86400   1 1 1 abcd S6G5SHC1JVOVL5FL9E943ADLONQLN7G5
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=SOA
diff --git a/regression-tests/ent-soa/expected_result.nsec3 b/regression-tests/ent-soa/expected_result.nsec3
new file mode 100644 (file)
index 0000000..a9eac7b
--- /dev/null
@@ -0,0 +1,7 @@
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      NSEC3   86400   1 1 1 abcd SA5VVPQN1COEJGJ3HBKFEKDNII8KKSQA
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=SOA
diff --git a/regression-tests/ent-soa/skip.nodnssec b/regression-tests/ent-soa/skip.nodnssec
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regression-tests/ent-wildcard-below-ent/command b/regression-tests/ent-wildcard-below-ent/command
new file mode 100755 (executable)
index 0000000..54a72e8
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+cleandig something.a.b.c.test.com A dnssec
diff --git a/regression-tests/ent-wildcard-below-ent/description b/regression-tests/ent-wildcard-below-ent/description
new file mode 100644 (file)
index 0000000..de9da16
--- /dev/null
@@ -0,0 +1 @@
+Check RRSIG label count if there are empty non-terminals involved
diff --git a/regression-tests/ent-wildcard-below-ent/expected_result b/regression-tests/ent-wildcard-below-ent/expected_result
new file mode 100644 (file)
index 0000000..6f1d98a
--- /dev/null
@@ -0,0 +1,7 @@
+0      something.a.b.c.test.com.       IN      A       3600    8.7.6.5
+0      something.a.b.c.test.com.       IN      RRSIG   3600    A 8 5 3600 [expiry] [inception] [keytag] test.com. ...
+1      *.a.b.c.test.com.       IN      NSEC    86400   counter.test.com. A RRSIG NSEC
+1      *.a.b.c.test.com.       IN      RRSIG   86400   NSEC 8 5 86400 [expiry] [inception] [keytag] test.com. ...
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='something.a.b.c.test.com.', qtype=A
diff --git a/regression-tests/ent-wildcard-below-ent/expected_result.narrow b/regression-tests/ent-wildcard-below-ent/expected_result.narrow
new file mode 100644 (file)
index 0000000..431d99f
--- /dev/null
@@ -0,0 +1,7 @@
+0      something.a.b.c.test.com.       IN      A       3600    8.7.6.5
+0      something.a.b.c.test.com.       IN      RRSIG   3600    A 8 5 3600 [expiry] [inception] [keytag] test.com. ...
+1      qjeirdhb04ir4vbs5pbbhbue69dlq9nr.test.com.      IN      NSEC3   86400   1 1 1 abcd QJEIRDHB04IR4VBS5PBBHBUE69DLQ9NT
+1      qjeirdhb04ir4vbs5pbbhbue69dlq9nr.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='something.a.b.c.test.com.', qtype=A
diff --git a/regression-tests/ent-wildcard-below-ent/expected_result.nsec3 b/regression-tests/ent-wildcard-below-ent/expected_result.nsec3
new file mode 100644 (file)
index 0000000..45bd639
--- /dev/null
@@ -0,0 +1,7 @@
+0      something.a.b.c.test.com.       IN      A       3600    8.7.6.5
+0      something.a.b.c.test.com.       IN      RRSIG   3600    A 8 5 3600 [expiry] [inception] [keytag] test.com. ...
+1      qd81ag9inqts1ocs7api0pji94k27btr.test.com.      IN      NSEC3   86400   1 1 1 abcd S6G5SHC1JVOVL5FL9E943ADLONQLN7G4 CNAME RRSIG
+1      qd81ag9inqts1ocs7api0pji94k27btr.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='something.a.b.c.test.com.', qtype=A
diff --git a/regression-tests/ent-wildcard-below-ent/skip.nodnssec b/regression-tests/ent-wildcard-below-ent/skip.nodnssec
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regression-tests/ent/command b/regression-tests/ent/command
new file mode 100755 (executable)
index 0000000..2c9876b
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+cleandig c.test.com A dnssec
diff --git a/regression-tests/ent/description b/regression-tests/ent/description
new file mode 100644 (file)
index 0000000..25296cf
--- /dev/null
@@ -0,0 +1 @@
+Check if the empty non-terminal exists (A query)
diff --git a/regression-tests/ent/expected_result b/regression-tests/ent/expected_result
new file mode 100644 (file)
index 0000000..4400426
--- /dev/null
@@ -0,0 +1,7 @@
+1      blah.test.com.  IN      NSEC    86400   b.c.test.com. NS RRSIG NSEC
+1      blah.test.com.  IN      RRSIG   86400   NSEC 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=A
diff --git a/regression-tests/ent/expected_result.narrow b/regression-tests/ent/expected_result.narrow
new file mode 100644 (file)
index 0000000..80c8ba8
--- /dev/null
@@ -0,0 +1,7 @@
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      NSEC3   86400   1 1 1 abcd S6G5SHC1JVOVL5FL9E943ADLONQLN7G5
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=A
diff --git a/regression-tests/ent/expected_result.nsec3 b/regression-tests/ent/expected_result.nsec3
new file mode 100644 (file)
index 0000000..a4e0734
--- /dev/null
@@ -0,0 +1,7 @@
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      NSEC3   86400   1 1 1 abcd SA5VVPQN1COEJGJ3HBKFEKDNII8KKSQA
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      RRSIG   3600    SOA 8 2 3600 [expiry] [inception] [keytag] test.com. ...
+1      test.com.       IN      SOA     3600    ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+2      .       IN      OPT     32768   
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='c.test.com.', qtype=A
diff --git a/regression-tests/ent/skip.nodnssec b/regression-tests/ent/skip.nodnssec
new file mode 100644 (file)
index 0000000..e69de29
index a3a2083fc720eb174acc8a451cbdd7ea13bd66f9..c2928f31ac290a695dbe82a73d5529b56d0f392d 100644 (file)
@@ -1,6 +1,6 @@
 0      www.a.b.c.d.e.something.wtest.com.      IN      A       3600    4.3.2.1
 0      www.a.b.c.d.e.something.wtest.com.      IN      RRSIG   3600    A 8 3 3600 [expiry] [inception] [keytag] wtest.com. ...
-1      pqgjjrj5si55uc1208gt1hp1k217fhqu.wtest.com.     IN      NSEC3   86400   1 1 1 abcd PQGJJRJ5SI55UC1208GT1HP1K217FHR0 RRSIG
+1      pqgjjrj5si55uc1208gt1hp1k217fhqu.wtest.com.     IN      NSEC3   86400   1 1 1 abcd PQGJJRJ5SI55UC1208GT1HP1K217FHR0
 1      pqgjjrj5si55uc1208gt1hp1k217fhqu.wtest.com.     IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] wtest.com. ...
 2      .       IN      OPT     32768   
 Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
index 42a06912ec773aab2910cff6df3d854693b84792..2c086cb3e212012b630cc8df6e68fec11960a3f0 100644 (file)
@@ -1,6 +1,6 @@
 0      www.a.b.c.d.e.wtest.com.        IN      A       3600    6.7.8.9
 0      www.a.b.c.d.e.wtest.com.        IN      RRSIG   3600    A 8 7 3600 [expiry] [inception] [keytag] wtest.com. ...
-1      pet5iqbgccga60p2n38nmuanrk50papg.wtest.com.     IN      NSEC3   86400   1 1 1 abcd PET5IQBGCCGA60P2N38NMUANRK50PAPI RRSIG
+1      pet5iqbgccga60p2n38nmuanrk50papg.wtest.com.     IN      NSEC3   86400   1 1 1 abcd PET5IQBGCCGA60P2N38NMUANRK50PAPI
 1      pet5iqbgccga60p2n38nmuanrk50papg.wtest.com.     IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] wtest.com. ...
 2      .       IN      OPT     32768   
 Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
index f0c15c31da1c08e795a91df6107c4c302d9cab5a..ed29f92c1531c9acd3978a68c4a35ec13ea43246 100644 (file)
@@ -1,3 +1,3 @@
 1      09lo11rs63u9b3d538a86ijvqcqt9312.minimal.com.   IN      NSEC3   86400   1 1 1 abcd 09LO11RS63U9B3D538A86IJVQCQT9313 NS SOA RRSIG DNSKEY NSEC3PARAM
-1      8hki26qt36v6qs8cll4e4nvjit38uhap.minimal.com.   IN      NSEC3   86400   1 1 1 abcd 8HKI26QT36V6QS8CLL4E4NVJIT38UHAR RRSIG
-1      9oadfe8c55evko75kb06spdl23p4fmrh.minimal.com.   IN      NSEC3   86400   1 1 1 abcd 9OADFE8C55EVKO75KB06SPDL23P4FMRJ RRSIG
+1      8hki26qt36v6qs8cll4e4nvjit38uhap.minimal.com.   IN      NSEC3   86400   1 1 1 abcd 8HKI26QT36V6QS8CLL4E4NVJIT38UHAR
+1      9oadfe8c55evko75kb06spdl23p4fmrh.minimal.com.   IN      NSEC3   86400   1 1 1 abcd 9OADFE8C55EVKO75KB06SPDL23P4FMRJ
index 6a223b6de6e84eacdbe592aaff0439ff2ea5e97c..29dffa737c1c3900549bd066985828f0685e4a65 100644 (file)
@@ -1,5 +1,5 @@
 1      blah.test.com.  IN      NS      3600    blah.test.com.
-1      blah.test.com.  IN      NSEC    86400   counter.test.com. NS RRSIG NSEC
+1      blah.test.com.  IN      NSEC    86400   b.c.test.com. NS RRSIG NSEC
 1      blah.test.com.  IN      RRSIG   86400   NSEC 8 3 86400 [expiry] [inception] [keytag] test.com. ...
 2      .       IN      OPT     32768   
 2      blah.test.com.  IN      A       3600    192.168.6.1
index 88e1d7f56494e176e44d7c6904b9240bf4094047..78cb4a2331b4e29f56ddb583bd911ae8a7c20ca5 100644 (file)
@@ -1,7 +1,7 @@
 1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      NSEC3   86400   1 1 1 abcd 2EU2GULBU53H9UVHFALSHPBO2A83T6L3 NS SOA MX RRSIG DNSKEY NSEC3PARAM
 1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
 1      blah.test.com.  IN      NS      3600    blah.test.com.
-1      s96h2qicbt8d9i5aa43kp8sjjresq4ka.test.com.      IN      NSEC3   86400   1 1 1 abcd S96H2QICBT8D9I5AA43KP8SJJRESQ4KC A NS RRSIG
+1      s96h2qicbt8d9i5aa43kp8sjjresq4ka.test.com.      IN      NSEC3   86400   1 1 1 abcd S96H2QICBT8D9I5AA43KP8SJJRESQ4KC
 1      s96h2qicbt8d9i5aa43kp8sjjresq4ka.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
 2      .       IN      OPT     32768   
 2      blah.test.com.  IN      A       3600    192.168.6.1
index 81624823bd95aefbd73739d3f44fd7786d9083b7..c290970e5a115774d26f447a2364d9a50216f2ba 100644 (file)
@@ -1,8 +1,8 @@
-1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      NSEC3   86400   1 1 1 abcd 88F1BQRB2ISCVFEL2SQQCKSVFLNEKAP6 NS SOA MX RRSIG DNSKEY NSEC3PARAM
+1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      NSEC3   86400   1 1 1 abcd 79U3DAS6UCCTNS1BR3TVD8QKANNI351L NS SOA MX RRSIG DNSKEY NSEC3PARAM
 1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
 1      blah.test.com.  IN      NS      3600    blah.test.com.
-1      qd81ag9inqts1ocs7api0pji94k27btr.test.com.      IN      NSEC3   86400   1 1 1 abcd SA5VVPQN1COEJGJ3HBKFEKDNII8KKSQA CNAME RRSIG
-1      qd81ag9inqts1ocs7api0pji94k27btr.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      NSEC3   86400   1 1 1 abcd SA5VVPQN1COEJGJ3HBKFEKDNII8KKSQA
+1      s6g5shc1jvovl5fl9e943adlonqln7g4.test.com.      IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] test.com. ...
 2      .       IN      OPT     32768   
 2      blah.test.com.  IN      A       3600    192.168.6.1
 Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 0, opcode: 0
index 6a1c2d557f0e2077663f5b08d458033390cd5aff..a2bf76ad40b94353c4d9186b52cb4a68a25c07de 100644 (file)
@@ -1,8 +1,8 @@
-1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      NSEC3   86400   1 1 1 abcd 9FAG9508OQU3M22QAC0U5EQGG45V8CF2 RRSIG
+1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      NSEC3   86400   1 1 1 abcd 9FAG9508OQU3M22QAC0U5EQGG45V8CF2
 1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      RRSIG   86400   SOA 8 2 100000 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      SOA     86400   ns1.example.com. ahu.example.com. 2000081501 28800 7200 604800 86400
-1      kt3ll2fgp7p2s71mk7frk5igi8pc8gl1.example.com.   IN      NSEC3   86400   1 1 1 abcd KT3LL2FGP7P2S71MK7FRK5IGI8PC8GL3 RRSIG
+1      kt3ll2fgp7p2s71mk7frk5igi8pc8gl1.example.com.   IN      NSEC3   86400   1 1 1 abcd KT3LL2FGP7P2S71MK7FRK5IGI8PC8GL3
 1      kt3ll2fgp7p2s71mk7frk5igi8pc8gl1.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      vtnq6ocn2vkuiv3nju14oqtaen2mt5sk.example.com.   IN      NSEC3   86400   1 1 1 abcd VTNQ6OCN2VKUIV3NJU14OQTAEN2MT5SL NS SOA MX RRSIG DNSKEY NSEC3PARAM
 1      vtnq6ocn2vkuiv3nju14oqtaen2mt5sk.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
index 0db51e55c8c8bd7d248d5eb71aaa5970019ea09f..bd6a24a871d03e0f9c267495a251a0a0a20a5e75 100644 (file)
@@ -1,8 +1,8 @@
-1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      NSEC3   86400   1 1 1 abcd 9FAG9508OQU3M22QAC0U5EQGG45V8CF2 RRSIG
+1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      NSEC3   86400   1 1 1 abcd 9FAG9508OQU3M22QAC0U5EQGG45V8CF2
 1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      RRSIG   86400   SOA 8 2 100000 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      SOA     86400   ns1.example.com. ahu.example.com. 2000081501 28800 7200 604800 86400
-1      sthvu2kihc96kc1tu8v3curr8og5dghn.example.com.   IN      NSEC3   86400   1 1 1 abcd STHVU2KIHC96KC1TU8V3CURR8OG5DGHP RRSIG
+1      sthvu2kihc96kc1tu8v3curr8og5dghn.example.com.   IN      NSEC3   86400   1 1 1 abcd STHVU2KIHC96KC1TU8V3CURR8OG5DGHP
 1      sthvu2kihc96kc1tu8v3curr8og5dghn.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      vtnq6ocn2vkuiv3nju14oqtaen2mt5sk.example.com.   IN      NSEC3   86400   1 1 1 abcd VTNQ6OCN2VKUIV3NJU14OQTAEN2MT5SL NS SOA MX RRSIG DNSKEY NSEC3PARAM
 1      vtnq6ocn2vkuiv3nju14oqtaen2mt5sk.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
index da2aca705555c655c2c2af4b23ced85f5d5ec8c3..d7d9fa5485e233f8f4730f422086681495c813d6 100644 (file)
@@ -1,4 +1,4 @@
-1      368r0s1q794jmkdrcpf6f85v316hd9ak.wtest.com.     IN      NSEC3   86400   1 1 1 abcd 368R0S1Q794JMKDRCPF6F85V316HD9AM RRSIG
+1      368r0s1q794jmkdrcpf6f85v316hd9ak.wtest.com.     IN      NSEC3   86400   1 1 1 abcd 368R0S1Q794JMKDRCPF6F85V316HD9AM
 1      368r0s1q794jmkdrcpf6f85v316hd9ak.wtest.com.     IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] wtest.com. ...
 1      54njs65s8u96tkffrft6l7j1t1556vik.wtest.com.     IN      NSEC3   86400   1 1 1 abcd 54NJS65S8U96TKFFRFT6L7J1T1556VIL TXT RRSIG
 1      54njs65s8u96tkffrft6l7j1t1556vik.wtest.com.     IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] wtest.com. ...
index e48b9b515bd36ec813c21340c20c3bf5df5e0b24..eedcaaffb2ce0d3911717582af39cddcd4e0ccfe 100644 (file)
@@ -2,9 +2,9 @@
 1      5uvgfm2vjcje09svs7lfb22i1uuqjf98.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      RRSIG   86400   SOA 8 2 100000 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      SOA     86400   ns1.example.com. ahu.example.com. 2000081501 28800 7200 604800 86400
-1      sdgbafmjek5v4t8c89q9u0n03qmcslor.example.com.   IN      NSEC3   86400   1 1 1 abcd SDGBAFMJEK5V4T8C89Q9U0N03QMCSLOT RRSIG
+1      sdgbafmjek5v4t8c89q9u0n03qmcslor.example.com.   IN      NSEC3   86400   1 1 1 abcd SDGBAFMJEK5V4T8C89Q9U0N03QMCSLOT
 1      sdgbafmjek5v4t8c89q9u0n03qmcslor.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
-1      tsdp8hajlfgr90cv4ib634g1m25nc5up.example.com.   IN      NSEC3   86400   1 1 1 abcd TSDP8HAJLFGR90CV4IB634G1M25NC5UR RRSIG
+1      tsdp8hajlfgr90cv4ib634g1m25nc5up.example.com.   IN      NSEC3   86400   1 1 1 abcd TSDP8HAJLFGR90CV4IB634G1M25NC5UR
 1      tsdp8hajlfgr90cv4ib634g1m25nc5up.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 2      .       IN      OPT     32768   
 Rcode: 3, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
index 286acc62166e27e8371a95aabecea9d6308815ea..1145e1d9035516502cde969bc48461f8298ec3d5 100644 (file)
@@ -2,9 +2,9 @@
 1      5uvgfm2vjcje09svs7lfb22i1uuqjf98.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      RRSIG   86400   SOA 8 2 100000 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      SOA     86400   ns1.example.com. ahu.example.com. 2000081501 28800 7200 604800 86400
-1      k6ta8mhi455hk3jskn0b2st81j6fa1l0.example.com.   IN      NSEC3   86400   1 1 1 abcd K6TA8MHI455HK3JSKN0B2ST81J6FA1L2 RRSIG
+1      k6ta8mhi455hk3jskn0b2st81j6fa1l0.example.com.   IN      NSEC3   86400   1 1 1 abcd K6TA8MHI455HK3JSKN0B2ST81J6FA1L2
 1      k6ta8mhi455hk3jskn0b2st81j6fa1l0.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
-1      tsdp8hajlfgr90cv4ib634g1m25nc5up.example.com.   IN      NSEC3   86400   1 1 1 abcd TSDP8HAJLFGR90CV4IB634G1M25NC5UR RRSIG
+1      tsdp8hajlfgr90cv4ib634g1m25nc5up.example.com.   IN      NSEC3   86400   1 1 1 abcd TSDP8HAJLFGR90CV4IB634G1M25NC5UR
 1      tsdp8hajlfgr90cv4ib634g1m25nc5up.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 2      .       IN      OPT     32768   
 Rcode: 3, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
index 8dbbda92a8603a404bde2f02e8c5ec97b947cc21..bf1fce0ec4ec7f79ed6b54dd8200006d85506976 100755 (executable)
@@ -389,4 +389,4 @@ then
        read l
 fi
 kill $(cat pdns*.pid)
-rm pdns*.pid
\ No newline at end of file
+rm pdns*.pid
index 79db956dfa798f83528dbdfff4663c0a38fde612..63e3ef6afb5069fdc2d4ac38eac0e6dbde08c230 100644 (file)
@@ -29,3 +29,5 @@ blah                  IN      A       192.168.6.1
 very-long-txt          IN      TXT     "A very long TXT record! boy you won't believe how long. A very long TXT record! boy you won't believe how long. A very long TXT record! boy you won't believe how long. A very long TXT record! boy you won't believe how long. A very long TXT record! boy you won't believe how long!"
 within-server          IN      CNAME   outpost.example.com.
 _underscore            IN      TXT     "underscores are terrible"
+b.c                    IN      A       5.6.7.8
+*.a.b.c                        IN      A       8.7.6.5
index 46383544fffd2b09f77249d4eb73178953a0ecf7..1f16385a957875f0acb0d18498e16b5d312d8083 100644 (file)
@@ -1,6 +1,6 @@
-1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      NSEC3   86400   1 1 1 abcd 9FAG9508OQU3M22QAC0U5EQGG45V8CF2 RRSIG
+1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      NSEC3   86400   1 1 1 abcd 9FAG9508OQU3M22QAC0U5EQGG45V8CF2
 1      9fag9508oqu3m22qac0u5eqgg45v8cf0.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
-1      ectnliqstqsjnnrpuhjj5h0j3c3odkk3.example.com.   IN      NSEC3   86400   1 1 1 abcd ECTNLIQSTQSJNNRPUHJJ5H0J3C3ODKK5 RRSIG
+1      ectnliqstqsjnnrpuhjj5h0j3c3odkk3.example.com.   IN      NSEC3   86400   1 1 1 abcd ECTNLIQSTQSJNNRPUHJJ5H0J3C3ODKK5
 1      ectnliqstqsjnnrpuhjj5h0j3c3odkk3.example.com.   IN      RRSIG   86400   NSEC3 8 3 86400 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      RRSIG   86400   SOA 8 2 100000 [expiry] [inception] [keytag] example.com. ...
 1      example.com.    IN      SOA     86400   ns1.example.com. ahu.example.com. 2000081501 28800 7200 604800 86400
index 33f671b381fcce3b3e35c608a8c33bf6d992c927..8e1056a8ff34e180a6caf542c13b730cef3e47bf 100644 (file)
@@ -1,3 +1,3 @@
 1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      NSEC3   86400   1 1 1 abcd 2EU2GULBU53H9UVHFALSHPBO2A83T6L3 NS SOA MX RRSIG DNSKEY NSEC3PARAM
-1      npce7etkesd3umcst08psfape1cnno5o.test.com.      IN      NSEC3   86400   1 1 1 abcd NPCE7ETKESD3UMCST08PSFAPE1CNNO5Q RRSIG
-1      nqf0papl2qmp38upr87f930kmebc0o0n.test.com.      IN      NSEC3   86400   1 1 1 abcd NQF0PAPL2QMP38UPR87F930KMEBC0O0P RRSIG
+1      npce7etkesd3umcst08psfape1cnno5o.test.com.      IN      NSEC3   86400   1 1 1 abcd NPCE7ETKESD3UMCST08PSFAPE1CNNO5Q
+1      nqf0papl2qmp38upr87f930kmebc0o0n.test.com.      IN      NSEC3   86400   1 1 1 abcd NQF0PAPL2QMP38UPR87F930KMEBC0O0P
index ecd2d3a3681d6623dff5215ae5f908ad77442644..3f24c777c181edb067defdf9a5d4e106e233c19e 100644 (file)
@@ -1,2 +1,2 @@
-1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      NSEC3   86400   1 1 1 abcd 88F1BQRB2ISCVFEL2SQQCKSVFLNEKAP6 NS SOA MX RRSIG DNSKEY NSEC3PARAM
+1      2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com.      IN      NSEC3   86400   1 1 1 abcd 79U3DAS6UCCTNS1BR3TVD8QKANNI351L NS SOA MX RRSIG DNSKEY NSEC3PARAM
 1      igf4m7otecach14p0a6ingi7dbuas5b2.test.com.      IN      NSEC3   86400   1 1 1 abcd O1L0FB73HI3QP4A3FNQJSLEANLC883I3 A RP RRSIG