]> granicus.if.org Git - pdns/commitdiff
implement first ghetto nsec3 generation code - all wrong
authorBert Hubert <bert.hubert@netherlabs.nl>
Thu, 13 May 2010 17:18:48 +0000 (17:18 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Thu, 13 May 2010 17:18:48 +0000 (17:18 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1615 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh
pdns/dnsbackend.hh
pdns/packethandler.cc
pdns/packethandler.hh
pdns/pdnssec.cc

index c34cfe923902a1a9e80a72cbb1e0029c56c303d0..970c2a59ddd19b1da5c2eb17dbcb96bb919d5425 100644 (file)
@@ -244,20 +244,22 @@ GSQLBackend::GSQLBackend(const string &mode, const string &suffix)
 }
 
 bool GSQLBackend::updateDNSSECOrderAndAuth(uint32_t domain_id, const std::string& zonename, const std::string& qname, bool auth)
+{
+  string ins=toLower(labelReverse(makeRelative(qname, zonename)));
+  return this->updateDNSSECOrderAndAuthAbsolute(domain_id, qname, ins, auth);
+}
+
+bool GSQLBackend::updateDNSSECOrderAndAuthAbsolute(uint32_t domain_id, const std::string& qname, const std::string& ordername, bool auth)
 {
   char output[1024];
   // ordername='%s',auth=%d where name='%s' and domain_id='%d'
   
-  string ins=toLower(labelReverse(makeRelative(qname, zonename)));
-  snprintf(output, sizeof(output)-1, d_setOrderAuthQuery.c_str(), sqlEscape(ins).c_str(), auth, sqlEscape(qname).c_str(), domain_id);
+  snprintf(output, sizeof(output)-1, d_setOrderAuthQuery.c_str(), sqlEscape(ordername).c_str(), auth, sqlEscape(qname).c_str(), domain_id);
   cerr<<"sql: '"<<output<<"'\n";
   
   d_db->doCommand(output);
-
   return true;
 }
-
-
 bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string& qname, std::string& before, std::string& after)
 {
   cerr<<"gsql before/after called for id="<<id<<", qname="<<qname<<endl;
index 56b88c568e38f15b121e7b308094af628b981daa..07224982e851c7215c18b50c1ccd7a8edb2d6d31 100644 (file)
@@ -41,6 +41,8 @@ public:
   void setNotified(uint32_t domain_id, uint32_t serial);
   virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string& qname, 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);
+
 
 private:
   string d_qname;
index d23637093eb3042de52f1f5b6371a985fdf131a6..229b3be8c34dd7d6383186347588b54111ee0662 100644 (file)
@@ -87,6 +87,12 @@ public:
     return false;
   }
 
+  virtual bool updateDNSSECOrderAndAuthAbsolute(uint32_t domain_id, const std::string& qname, const std::string& ordername, bool auth)
+  {
+    return false;
+  }
+
+
   //! Initiates a list of the specified domain
   /** Once initiated, DNSResourceRecord objects can be retrieved using get(). Should return false
       if the backend does not consider itself responsible for the id passed.
index 8e772d10b04ffb5373a180e19da7474e795ef476..437c92153491dfe9ab38a4ec5499a593b2aac018 100644 (file)
@@ -464,6 +464,34 @@ void PacketHandler::emitNSEC(const std::string& begin, const std::string& end, c
   r->addRecord(rr);
 }
 
+void PacketHandler::emitNSEC3(NSEC3PARAMRecordContent *ns3rc, const std::string& auth, const std::string& begin, const std::string& end, const std::string& toNSEC3, DNSPacket *r, int mode)
+{
+  cerr<<"We should emit NSEC3 '"<<toBase32Hex(begin)<<"' - ('"<<toNSEC3<<"') - '"<<toBase32Hex(end)<<"'"<<endl;
+  NSEC3RecordContent n3rc;
+  n3rc.d_set.insert(QType::RRSIG);
+  n3rc.d_set.insert(QType::NSEC3);
+  n3rc.d_salt=ns3rc->d_salt;
+  n3rc.d_iterations = ns3rc->d_iterations;
+  n3rc.d_algorithm = 1;
+
+  DNSResourceRecord rr;
+  B.lookup(QType(QType::ANY), begin);
+  while(B.get(rr)) {
+    n3rc.d_set.insert(rr.qtype.getCode());    
+  }
+  
+  n3rc.d_nexthash=end;
+
+  rr.qname=dotConcat(toBase32Hex(begin), auth);
+  rr.ttl=3600;
+  rr.qtype=QType::NSEC3;
+  rr.content=n3rc.getZoneRepresentation();
+  cerr<<"nsec3: '"<<rr.content<<"'"<<endl;
+  rr.d_place = (mode == 2 ) ? DNSResourceRecord::ANSWER: DNSResourceRecord::AUTHORITY;
+  rr.auth = true;
+  r->addRecord(rr);
+}
+
 
 
 
@@ -491,8 +519,21 @@ void PacketHandler::addNSEC3(DNSPacket *p, DNSPacket *r, const string& target, c
   cerr<<"NSEC3 generator called!"<<endl;
   cerr<<nsec3param.content<<endl;
   NSEC3PARAMRecordContent *ns3rc=dynamic_cast<NSEC3PARAMRecordContent*>(DNSRecordContent::mastermake(QType::NSEC3PARAM, 1, nsec3param.content));
-  cerr<<"NSEC3 hash, "<<ns3rc->d_iterations<<" iterations, salt '"<<makeHexDump(ns3rc->d_salt)<<"': "<<toBase32Hex(hashQNameWithSalt(ns3rc->d_iterations, ns3rc->d_salt, p->qdomain))<<endl;
-  
+  string hashed=toBase32Hex(hashQNameWithSalt(ns3rc->d_iterations, ns3rc->d_salt, p->qdomain));
+  cerr<<"NSEC3 hash, "<<ns3rc->d_iterations<<" iterations, salt '"<<makeHexDump(ns3rc->d_salt)<<"': "<<hashed<<endl;
+
+  SOAData sd;
+  sd.db = (DNSBackend*)-1;
+  if(!B.getSOA(auth, sd)) {
+    cerr<<"Could not get SOA for domain in NSEC3\n";
+    return;
+  }
+
+  string before,after;
+  cerr<<"Calling getBeforeandAfterAbsolute!"<<endl;
+  sd.db->getBeforeAndAfterNamesAbsolute(sd.domain_id,  hashed, before, after); 
+  cerr<<"Done calling, before='"<<before<<"', after='"<<after<<"'"<<endl;
+  emitNSEC3( ns3rc, auth, fromBase32Hex(before), fromBase32Hex(after), target, r, mode);
 }
 
 void PacketHandler::addNSEC(DNSPacket *p, DNSPacket *r, const string& target, const string& auth, int mode)
index b7c1a402729d035c73fdcdc4b6444feaff49e7d4..3c131cbc18e22c9294425640fa7feee1fa4e0eed 100644 (file)
@@ -47,6 +47,7 @@ using namespace std;
     a complete reply.
 
 */
+class NSEC3PARAMRecordContent;
 
 class PacketHandler
 {
@@ -98,6 +99,8 @@ private:
   void addNSEC(DNSPacket *p, DNSPacket* r, const string &target, const std::string& auth, int mode);
   void addNSEC3(DNSPacket *p, DNSPacket* r, const string &target, const std::string& auth, const DNSResourceRecord& nsec3param, int mode);
   void emitNSEC(const std::string& before, const std::string& after, const std::string& toNSEC, DNSPacket *r, int mode);
+  void emitNSEC3(NSEC3PARAMRecordContent *ns3rc, const std::string& auth, const std::string& begin, const std::string& end, const std::string& toNSEC3, DNSPacket *r, int mode);
+
   void synthesiseRRSIGs(DNSPacket* p, DNSPacket* r);
   void makeNXDomain(DNSPacket* p, DNSPacket* r, const std::string& target, SOAData& sd);
   void makeNOError(DNSPacket* p, DNSPacket* r, const std::string& target, SOAData& sd);
index e7c4f23e8f31c36cd7b7df4cd057996ed5791d16..b09ddae6552c252b6d8730f01cf85d765e9a5463 100644 (file)
@@ -116,9 +116,10 @@ void orderZone(const std::string& zone)
   salt.assign(tmp, 2);
   BOOST_FOREACH(const string& qname, qnames)
   {
-    
-    cerr<<"'"<<qname<<"' -> '"<<toBase32Hex(hashQNameWithSalt(100, salt, qname)) <<"'"<<endl;
-    sd.db->updateDNSSECOrderAndAuth(sd.domain_id, zone, qname, true);
+    string hashed=toBase32Hex(hashQNameWithSalt(100, salt, qname));
+    cerr<<"'"<<qname<<"' -> '"<< hashed <<"'"<<endl;
+       sd.db->updateDNSSECOrderAndAuthAbsolute(sd.domain_id, qname, hashed, true);
+    // sd.db->updateDNSSECOrderAndAuth(sd.domain_id, zone, qname, true);
   }
   cerr<<"Done listing"<<endl;
 }