Changeset 1790
- Timestamp:
- 01/02/11 19:34:10 (2 years ago)
- Location:
- trunk/pdns/pdns
- Files:
-
- 10 modified
-
Makefile.am (modified) (2 diffs)
-
backends/gsql/gsqlbackend.cc (modified) (3 diffs)
-
backends/gsql/gsqlbackend.hh (modified) (1 diff)
-
common_startup.cc (modified) (1 diff)
-
dbdnsseckeeper.cc (modified) (4 diffs)
-
dnssecinfra.cc (modified) (4 diffs)
-
dnssecinfra.hh (modified) (1 diff)
-
dnsseckeeper.hh (modified) (4 diffs)
-
packethandler.cc (modified) (4 diffs)
-
tcpreceiver.cc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pdns/pdns/Makefile.am
r1782 r1790 45 45 aes/aestab.c aes/aestab.h aes/brg_endian.h aes/brg_types.h aes/dns_random.cc \ 46 46 randomhelper.cc namespaces.hh nsecrecords.cc base32.cc dbdnsseckeeper.cc dnssecinfra.cc \ 47 dnsseckeeper.hh dnssecinfra.hh base32.hh 47 dnsseckeeper.hh dnssecinfra.hh base32.hh dns.cc 48 48 49 49 # … … 61 61 backends/gsql/gsqlbackend.cc \ 62 62 backends/gsql/gsqlbackend.hh backends/gsql/ssql.hh zoneparser-tng.cc \ 63 dynlistener.cc 63 dynlistener.cc dns.cc 64 64 65 65 pdnssec_LDFLAGS=@moduleobjects@ @modulelibs@ @DYNLINKFLAGS@ @LIBDL@ @THREADFLAGS@ -Lext/polarssl/library/ -
trunk/pdns/pdns/backends/gsql/gsqlbackend.cc
r1781 r1790 20 20 #include <sstream> 21 21 #include <boost/foreach.hpp> 22 #include <boost/format.hpp> 22 23 using namespace boost; 23 24 … … 248 249 249 250 d_GetDomainMetadataQuery = "select content from domains, domainmetadata where domain_id=domains.id and name='%s' and domainmetadata.kind='%s'"; 251 d_ClearDomainMetadataQuery = "delete from domainmetadata where domain_id=(select id from domains where name='%s') and domainmetadata.kind='%s'"; 250 252 d_SetDomainMetadataQuery = "insert into domainmetadata (domain_id, kind, content) select id, '%s', '%s' from domains where name='%s'"; 251 253 } … … 379 381 { 380 382 char output[16384]; 381 snprintf(output,sizeof(output)-1,d_SetDomainMetadataQuery.c_str(), 382 sqlEscape(kind).c_str(), sqlEscape(*meta.begin()).c_str(), sqlEscape(name).c_str()); 383 384 try { 385 d_db->doCommand(output); 383 384 if(!meta.empty()) 385 snprintf(output,sizeof(output)-1,d_SetDomainMetadataQuery.c_str(), 386 sqlEscape(kind).c_str(), sqlEscape(*meta.begin()).c_str(), sqlEscape(name).c_str()); 387 388 string clearQuery = (boost::format(d_ClearDomainMetadataQuery) % sqlEscape(name) % sqlEscape(kind)).str(); 389 390 try { 391 d_db->doCommand(clearQuery); 392 if(!meta.empty()) 393 d_db->doCommand(output); 386 394 } 387 395 catch (SSqlException &e) { 388 396 throw AhuException("GSQLBackend unable to store metadata key: "+e.txtReason()); 389 397 } 398 390 399 return true; 391 400 } -
trunk/pdns/pdns/backends/gsql/gsqlbackend.hh
r1781 r1790 85 85 string d_ListDomainKeysQuery; 86 86 string d_GetDomainMetadataQuery; 87 string d_ClearDomainMetadataQuery; 87 88 string d_SetDomainMetadataQuery; 88 89 protected: -
trunk/pdns/pdns/common_startup.cc
r1763 r1790 100 100 ::arg().set("webserver-port","Port of webserver to listen on")="8081"; 101 101 ::arg().set("webserver-password","Password required for accessing the webserver")=""; 102 ::arg().set("key-repository", "Where DNSSEC keying material lives")="./keys";103 102 104 103 ::arg().setSwitch("out-of-zone-additional-processing","Do out of zone additional processing")="yes"; -
trunk/pdns/pdns/dbdnsseckeeper.cc
r1781 r1790 38 38 DNSSECPrivateKey dpk; 39 39 dpk.d_key.create(bits); 40 40 addKey(name, keyOrZone, dpk, active); 41 } 42 43 void DNSSECKeeper::addKey(const std::string& name, bool keyOrZone, const DNSSECPrivateKey& dpk, bool active) 44 { 41 45 DNSBackend::KeyData kd; 42 46 kd.flags = 256 + keyOrZone; 43 47 kd.active = active; 44 kd.content = dpk.d_key.convertToISC( algorithm);48 kd.content = dpk.d_key.convertToISC(5); 45 49 46 50 // now store it … … 80 84 } 81 85 throw runtime_error("Can't find a key with id "+lexical_cast<string>(id)+" for zone '"+zname+"'"); 82 83 84 86 } 85 87 … … 130 132 UeberBackend db; 131 133 db.setDomainMetadata(zname, "NSEC3PARAM", meta); 132 133 // XXX do db134 134 } 135 135 136 136 void DNSSECKeeper::unsetNSEC3PARAM(const std::string& zname) 137 137 { 138 // XXX do db 138 UeberBackend db; 139 db.setDomainMetadata(zname, "NSEC3PARAM", vector<string>()); 139 140 } 140 141 … … 175 176 } 176 177 177 178 bool getSignerFor(const std::string& qname, std::string &signer) 179 { 180 DNSSECKeeper dk; 181 182 signer=qname; 183 do { 184 if(dk.haveActiveKSKFor(signer)) 185 return true; 186 } while(chopOff(signer)); 187 return false; 188 } 189 190 DNSKEYRecordContent getDNSKEYFor(const std::string& qname, bool withKSK, RSAContext* rc) 191 { 192 DNSSECKeeper dk; 193 cerr<<"Asked for a DNSKEY for '"<<qname<<"', withKSK="<<withKSK<<"\n"; 194 DNSSECPrivateKey dpk; 195 196 if(!withKSK) { 197 DNSSECKeeper::keyset_t zskset=dk.getKeys(qname, false); 198 BOOST_FOREACH(DNSSECKeeper::keyset_t::value_type value, zskset) { 199 if(value.second.active) { 200 cerr<<"Found a ZSK for '"<<qname<<"', key tag = "<<value.first.getDNSKEY().getTag()<<endl; 201 *rc=value.first.d_key; 202 return value.first.getDNSKEY(); 203 } 204 else 205 cerr<<"Found an inactive ZSK for '"<<qname<<"', key tag = "<<value.first.getDNSKEY().getTag()<<endl; 206 } 207 cerr<<"Could not find an active ZSK for '"<<qname<<"'"<<endl; 208 exit(1); 209 } 210 else if(dk.haveActiveKSKFor(qname, &dpk)) { 211 cerr<<"Found a KSK for '"<<qname<<"'"<<endl; 212 *rc=dpk.d_key; 213 return dpk.getDNSKEY(); 214 } else { 215 cerr<<"DID NOT FIND A ZSK for '"<<qname<<"'"<<endl; 216 exit(1); 217 } 218 } 219 220 int getRRSIGForRRSET(const std::string signQName, uint16_t signQType, uint32_t signTTL, 221 vector<shared_ptr<DNSRecordContent> >& toSign, RRSIGRecordContent& rrc, bool ksk) 222 { 223 if(toSign.empty()) 224 return -1; 225 226 rrc.d_type=signQType; 227 228 // d_algorithm gets filled out by fillOutRRSIG, since it gets the key 229 rrc.d_labels=countLabels(signQName); 230 rrc.d_originalttl=signTTL; 231 rrc.d_siginception=getCurrentInception();; 232 rrc.d_sigexpire = rrc.d_siginception + 14*86400; 233 234 rrc.d_tag=0; 235 if(!getSignerFor(signQName, rrc.d_signer)) { 236 cerr<<"No signer known for '"<<signQName<<"'\n"; 237 return -1; 238 } 239 240 string hash= getSHA1HashForRRSET(signQName, rrc, toSign); 241 fillOutRRSIG(signQName, rrc, hash, toSign, ksk); 242 return 0; 243 } 244 245 void addSignature(const std::string signQName, const std::string& wildcardname, uint16_t signQType, uint32_t signTTL, DNSPacketWriter::Place signPlace, vector<shared_ptr<DNSRecordContent> >& toSign, DNSPacketWriter& pw) 246 { 247 // cerr<<"Asked to sign '"<<signQName<<"'|"<<DNSRecordContent::NumberToType(signQType)<<", "<<toSign.size()<<" records\n"; 248 249 RRSIGRecordContent rrc; 250 if(toSign.empty()) 251 return; 252 253 for(int ksk = 0; ksk < 2; ++ksk) { 254 if(getRRSIGForRRSET(wildcardname.empty() ? signQName : wildcardname, signQType, signTTL, toSign, rrc, ksk) < 0) { 255 cerr<<"Error signing a record!"<<endl; 256 return; 257 } 258 259 pw.startRecord(signQName, QType::RRSIG, 3600, 1, 260 signQType==QType::DNSKEY ? DNSPacketWriter:: ANSWER : signPlace); 261 rrc.toPacket(pw); 262 263 pw.commit(); 264 if(signQType != QType::DNSKEY) 265 break; 266 } 267 268 toSign.clear(); 269 } 270 271 // XXXX FIXME THINK ABOUT LOCKING HERE 272 map<pair<string, uint16_t>, RRSIGRecordContent> g_rrsigs; 273 274 void fillOutRRSIG(const std::string& signQName, RRSIGRecordContent& rrc, const std::string& hash, vector<shared_ptr<DNSRecordContent> >& toSign, bool withKSK) 275 { 276 RSAContext rc; 277 278 DNSKEYRecordContent drc=getDNSKEYFor(rrc.d_signer, withKSK, &rc); 279 rrc.d_tag = drc.getTag(); 280 rrc.d_algorithm = drc.d_algorithm; 281 282 if(g_rrsigs.count(make_pair(hash, rrc.d_tag))) { 283 // cerr<<"RRSIG cache hit !"<<endl; 284 rrc = g_rrsigs[make_pair(hash, rrc.d_tag)]; 285 return; 286 } 287 288 string realhash=getSHA1HashForRRSET(signQName, rrc, toSign); 289 290 unsigned char signature[mpi_size(&rc.getContext().N)]; 291 292 int ret=rsa_pkcs1_sign(&rc.getContext(), RSA_PRIVATE, SIG_RSA_SHA1, 20, (unsigned char*) realhash.c_str(), signature); 293 294 if(ret!=0) { 295 cerr<<"signing returned: "<<ret<<endl; 296 exit(1); 297 } 298 299 rrc.d_signature.assign((char*)signature, sizeof(signature)); 300 301 g_rrsigs[make_pair(hash, rrc.d_tag)] = rrc; 302 303 } -
trunk/pdns/pdns/dnssecinfra.cc
r1785 r1790 36 36 } 37 37 38 std::string RSAContext::convertToISC(unsigned int algorithm) 38 std::string RSAContext::convertToISC(unsigned int algorithm) const 39 39 { 40 40 string ret; 41 typedef vector<pair<string, mpi*> > outputs_t;41 typedef vector<pair<string, const mpi*> > outputs_t; 42 42 outputs_t outputs; 43 43 push_back(outputs)("Modulus", &d_context.N)("PublicExponent",&d_context.E) … … 293 293 } 294 294 295 bool getSignerFor(const std::string& keyRepositoryDir, const std::string& qname, std::string &signer)296 {297 DNSSECKeeper dk(keyRepositoryDir);298 299 signer=qname;300 do {301 if(dk.haveActiveKSKFor(signer))302 return true;303 } while(chopOff(signer));304 return false;305 }306 295 307 296 int countLabels(const std::string& signQName) … … 319 308 320 309 321 DNSKEYRecordContent getDNSKEYFor(const std::string& keyRepositoryDir, const std::string& qname, bool withKSK, RSAContext* rc)322 {323 DNSSECKeeper dk(keyRepositoryDir);324 cerr<<"Asked for a DNSKEY for '"<<qname<<"', withKSK="<<withKSK<<"\n";325 DNSSECPrivateKey dpk;326 327 if(!withKSK) {328 DNSSECKeeper::keyset_t zskset=dk.getKeys(qname, false);329 BOOST_FOREACH(DNSSECKeeper::keyset_t::value_type value, zskset) {330 if(value.second.active) {331 cerr<<"Found a ZSK for '"<<qname<<"', key tag = "<<value.first.getDNSKEY().getTag()<<endl;332 *rc=value.first.d_key;333 return value.first.getDNSKEY();334 }335 else336 cerr<<"Found an inactive ZSK for '"<<qname<<"', key tag = "<<value.first.getDNSKEY().getTag()<<endl;337 }338 cerr<<"Could not find an active ZSK for '"<<qname<<"'"<<endl;339 exit(1);340 }341 else if(dk.haveActiveKSKFor(qname, &dpk)) {342 cerr<<"Found a KSK for '"<<qname<<"'"<<endl;343 *rc=dpk.d_key;344 return dpk.getDNSKEY();345 } else {346 cerr<<"DID NOT FIND A ZSK for '"<<qname<<"'"<<endl;347 exit(1);348 }349 }350 351 // XXXX FIXME THINK ABOUT LOCKING HERE352 map<pair<string, uint16_t>, RRSIGRecordContent> g_rrsigs;353 354 void fillOutRRSIG(const std::string& keyrepodir, const std::string& signQName, RRSIGRecordContent& rrc, const std::string& hash, vector<shared_ptr<DNSRecordContent> >& toSign, bool withKSK)355 {356 RSAContext rc;357 358 DNSKEYRecordContent drc =getDNSKEYFor(keyrepodir, rrc.d_signer, withKSK, &rc);359 rrc.d_tag = drc.getTag();360 rrc.d_algorithm = drc.d_algorithm;361 362 if(g_rrsigs.count(make_pair(hash, rrc.d_tag))) {363 // cerr<<"RRSIG cache hit !"<<endl;364 rrc = g_rrsigs[make_pair(hash, rrc.d_tag)];365 return;366 }367 368 string realhash=getSHA1HashForRRSET(signQName, rrc, toSign);369 370 unsigned char signature[mpi_size(&rc.getContext().N)];371 372 int ret=rsa_pkcs1_sign(&rc.getContext(), RSA_PRIVATE, SIG_RSA_SHA1, 20, (unsigned char*) realhash.c_str(), signature);373 374 if(ret!=0) {375 cerr<<"signing returned: "<<ret<<endl;376 exit(1);377 }378 379 rrc.d_signature.assign((char*)signature, sizeof(signature));380 381 g_rrsigs[make_pair(hash, rrc.d_tag)] = rrc;382 383 }384 385 310 uint32_t getCurrentInception() 386 311 { … … 390 315 } 391 316 392 393 int getRRSIGForRRSET(const std::string& keyrepodir, const std::string signQName, uint16_t signQType, uint32_t signTTL,394 vector<shared_ptr<DNSRecordContent> >& toSign, RRSIGRecordContent& rrc, bool ksk)395 {396 if(toSign.empty())397 return -1;398 399 rrc.d_type=signQType;400 401 // d_algorithm gets filled out by fillOutRRSIG, since it gets the key402 rrc.d_labels=countLabels(signQName);403 rrc.d_originalttl=signTTL;404 rrc.d_siginception=getCurrentInception();;405 rrc.d_sigexpire = rrc.d_siginception + 14*86400;406 407 rrc.d_tag=0;408 if(!getSignerFor(keyrepodir, signQName, rrc.d_signer)) {409 cerr<<"No signer known for '"<<signQName<<"'\n";410 return -1;411 }412 413 string hash= getSHA1HashForRRSET(signQName, rrc, toSign);414 fillOutRRSIG(keyrepodir, signQName, rrc, hash, toSign, ksk);415 return 0;416 }417 418 void addSignature(const std::string& keyrepodir, const std::string signQName, const std::string& wildcardname, uint16_t signQType, uint32_t signTTL, DNSPacketWriter::Place signPlace, vector<shared_ptr<DNSRecordContent> >& toSign, DNSPacketWriter& pw)419 {420 // cerr<<"Asked to sign '"<<signQName<<"'|"<<DNSRecordContent::NumberToType(signQType)<<", "<<toSign.size()<<" records\n";421 422 RRSIGRecordContent rrc;423 if(toSign.empty())424 return;425 426 for(int ksk = 0; ksk < 2; ++ksk) {427 if(getRRSIGForRRSET(keyrepodir, wildcardname.empty() ? signQName : wildcardname, signQType, signTTL, toSign, rrc, ksk) < 0) {428 cerr<<"Error signing a record!"<<endl;429 return;430 }431 432 pw.startRecord(signQName, QType::RRSIG, 3600, 1,433 signQType==QType::DNSKEY ? DNSPacketWriter:: ANSWER : signPlace);434 rrc.toPacket(pw);435 436 pw.commit();437 if(signQType != QType::DNSKEY)438 break;439 }440 441 toSign.clear();442 }443 317 444 318 -
trunk/pdns/pdns/dnssecinfra.hh
r1785 r1790 38 38 39 39 DNSKEYRecordContent getDNSKEYFor(const std::string& keyrepodir, const std::string& qname, bool withKSK, RSAContext* rc); 40 void fillOutRRSIG(const std::string& keyrepodir, const std::string&signQName, RRSIGRecordContent& rrc, const std::string& hash, vector<shared_ptr<DNSRecordContent> >& toSign, bool withKSK=false);40 void fillOutRRSIG(const std::string& signQName, RRSIGRecordContent& rrc, const std::string& hash, vector<shared_ptr<DNSRecordContent> >& toSign, bool withKSK=false); 41 41 uint32_t getCurrentInception(); 42 void addSignature(const std::string & keyrepodir, const std::stringsignQName, const std::string& wildcardname, uint16_t signQType, uint32_t signTTL, DNSPacketWriter::Place signPlace, vector<shared_ptr<DNSRecordContent> >& toSign, DNSPacketWriter& pw);43 int getRRSIGForRRSET(const std::string & keyrepodir, const std::stringsignQName, uint16_t signQType, uint32_t signTTL,42 void addSignature(const std::string signQName, const std::string& wildcardname, uint16_t signQType, uint32_t signTTL, DNSPacketWriter::Place signPlace, vector<shared_ptr<DNSRecordContent> >& toSign, DNSPacketWriter& pw); 43 int getRRSIGForRRSET(const std::string signQName, uint16_t signQType, uint32_t signTTL, 44 44 vector<shared_ptr<DNSRecordContent> >& toSign, RRSIGRecordContent &rrc, bool ksk); 45 45 -
trunk/pdns/pdns/dnsseckeeper.hh
r1785 r1790 68 68 69 69 void create(unsigned int bits); 70 std::string convertToISC(unsigned int algorithm) ;70 std::string convertToISC(unsigned int algorithm) const; 71 71 72 72 private: … … 102 102 103 103 public: 104 explicit DNSSECKeeper(const std::string& dirname) : d_dirname(dirname){}105 106 104 bool haveActiveKSKFor(const std::string& zone, DNSSECPrivateKey* ksk=0); 107 105 … … 109 107 DNSSECPrivateKey getKeyById(const std::string& zone, unsigned int id); 110 108 void addKey(const std::string& zname, bool keyOrZone, int algorithm=5, int bits=0, bool active=true); 109 void addKey(const std::string& zname, bool keyOrZone, const DNSSECPrivateKey& dpk, bool active=true); 111 110 void removeKey(const std::string& zname, unsigned int id); 112 111 void activateKey(const std::string& zname, unsigned int id); … … 118 117 void setNSEC3PARAM(const std::string& zname, const NSEC3PARAMRecordContent& n3p); 119 118 void unsetNSEC3PARAM(const std::string& zname); 120 121 private:122 std::string d_dirname;123 119 }; 124 120 -
trunk/pdns/pdns/packethandler.cc
r1775 r1790 205 205 206 206 DNSResourceRecord rr; 207 DNSSECKeeper dk(::arg()["key-repository"]); 208 207 DNSSECKeeper dk; 209 208 210 209 bool haveOne=false; … … 244 243 245 244 DNSResourceRecord rr; 246 DNSSECKeeper dk (::arg()["key-repository"]);245 DNSSECKeeper dk; 247 246 248 247 NSEC3PARAMRecordContent ns3prc; … … 535 534 void PacketHandler::addNSECX(DNSPacket *p, DNSPacket *r, const string& target, const string& auth, int mode) 536 535 { 537 DNSSECKeeper dk (::arg()["key-repository"]);536 DNSSECKeeper dk; 538 537 NSEC3PARAMRecordContent ns3rc; 539 538 cerr<<"Doing NSEC3PARAM lookup for '"<<auth<<"': "; … … 950 949 RRSIGRecordContent rrc; 951 950 for(int ksk =0 ; ksk < 2; ++ksk) { 952 getRRSIGForRRSET( ::arg()["key-repository"],p->qdomain, iter.first, 3600, iter.second, rrc, ksk);951 getRRSIGForRRSET(p->qdomain, iter.first, 3600, iter.second, rrc, ksk); 953 952 rr.content=rrc.getZoneRepresentation(); 954 953 r->addRecord(rr); -
trunk/pdns/pdns/tcpreceiver.cc
r1763 r1790 462 462 // this is where the DNSKEYs go 463 463 464 DNSSECKeeper dk (::arg()["key-repository"]);464 DNSSECKeeper dk; 465 465 DNSSECKeeper::keyset_t keys = dk.getKeys(target); 466 466 BOOST_FOREACH(const DNSSECKeeper::keyset_t::value_type& value, keys) {