From: Bert Hubert Date: Sun, 18 Apr 2010 19:10:27 +0000 (+0000) Subject: sdig dnssec playground X-Git-Tag: rec-3.3~146 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=181fcd293c19bffd226fec2fffe8e3e7230ce5d6;p=pdns sdig dnssec playground git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1556 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/toysdig.cc b/pdns/toysdig.cc new file mode 100644 index 000000000..cbf014cb0 --- /dev/null +++ b/pdns/toysdig.cc @@ -0,0 +1,223 @@ +#include "dnsparser.hh" +#include "sstuff.hh" +#include "misc.hh" +#include "dnswriter.hh" +#include "dnsrecords.hh" +#include "statbag.hh" +#include "iputils.hh" +#include +#include +#include +#include +#include +#include "dnssecinfra.hh" +#include "base32.hh" + +StatBag S; + +MOADNSParser* askQuestion(DNSPacketWriter&, vector& packet, const char* remote, uint16_t port=53) +{ + int sock=socket(AF_INET, SOCK_DGRAM, 0); + + if(sock < 0) + unixDie("Creating SCTP socket"); + + ComboAddress dest(remote + (*remote=='@'), port); + struct msghdr msg; + struct iovec iomsg; + + msg.msg_name=&dest; + msg.msg_namelen=dest.getSocklen(); + msg.msg_iov=&iomsg; + iomsg.iov_base=&*packet.begin(); + iomsg.iov_len=packet.size(); + msg.msg_iovlen=1; + msg.msg_control=0; + msg.msg_controllen=0; + msg.msg_flags=0; // just to be sure + + sendmsg(sock, &msg, 0); + + char replybuf[4096]; + socklen_t destlen=dest.getSocklen(); + int len=recvfrom(sock, replybuf, sizeof(replybuf), 0, (struct sockaddr*)&dest, &destlen); + if(len < 0) + unixDie("recvfrom on sctp"); + + string reply(replybuf, len); + + return new MOADNSParser(reply); +} + +void getKeys(const std::string& qname, uint16_t tag); + +void doVerifySignature(const std::string& qname, map > >& dkrcs, pair >, vector > >& records) +{ + rsa_context rsa; + + BOOST_FOREACH(shared_ptr& rrc, records.second) { + cerr<<"\nVerifying "<d_type)<<"\n"; + + cerr<<"Signer is: "<d_signer<<" for which we have "<d_signer].size()<<" DNSKEYs, want the one with"; + cerr<<" tag: "<d_tag<d_signer, rrc->d_tag); + + if(dkrcs[rrc->d_signer].empty()) { + cerr<<"\tNo keys!\n"; + return; + } + + vector >& signRecords= records.first; + + string hash=getSHA1HashForRRSET(qname, *rrc.get(), signRecords); + int ret; + int success=0; + BOOST_FOREACH(shared_ptr dkrc, dkrcs[rrc->d_signer]) { + if(dkrc->getTag() != rrc->d_tag) { + cerr<<"Skipping key with wrong tag "<getTag()<< " != needed "<d_tag<d_signature.c_str() ) ) != 0) { + fprintf(stderr, "Verification with tag %d failed with error %d\n", dkrc->getTag(), ret); + } + else { + fprintf(stderr, "DNSSEC Record verified Ok with tag %d!\n", dkrc->getTag()); + success++; + break; + } + } + if(success) + cerr<<"\t at least one verification was succesful!\n"; + } +} + +typedef map > > dkrc_t; +dkrc_t dkrc; + +void getKeys(const std::string& qname, uint16_t tag) +{ + BOOST_FOREACH(shared_ptr& drc, dkrc[qname]) { + if(drc->getTag() == tag) + return; + } + + vector packet; + + DNSPacketWriter pw(packet, qname, QType::DNSKEY); + + pw.getHeader()->id=1234; + pw.getHeader()->rd=1; + + pw.addOpt(4000, 0, EDNSOpts::DNSSECOK); // int udpsize, int extRCode, int Z + pw.commit(); + + MOADNSParser* mdp=askQuestion(pw, packet, "199.249.112.1", 53); + if(mdp->d_header.tc) { + cerr<<"Truncated!\n"; + } + for(MOADNSParser::answers_t::const_iterator i=mdp->d_answers.begin(); i!=mdp->d_answers.end(); ++i) { + if(i->first.d_type==QType::DNSKEY) { + shared_ptr dkrcptr=dynamic_pointer_cast(i->first.d_content); + dkrc[i->first.d_label].push_back(dkrcptr); + cerr<<"Added DNSKEY for '"< packet; + + DNSPacketWriter pw(packet, argv[1], DNSRecordContent::TypeToNumber(argv[2])); + + pw.getHeader()->id=1234; + pw.getHeader()->rd=0; + + pw.addOpt(4000, 0, EDNSOpts::DNSSECOK); // int udpsize, int extRCode, int Z + pw.commit(); + + MOADNSParser* mdp=askQuestion(pw, packet, argv[3], argc>4 ? atoi(argv[4]) : 53); + if(mdp->d_header.tc) { + cerr<<"Truncated!\n"; + } + + typedef map< pair, + pair >, vector > + > > grouped_t; + grouped_t grouped; + + string salt; + int iterations; + for(MOADNSParser::answers_t::const_iterator i=mdp->d_answers.begin(); i!=mdp->d_answers.end(); ++i) { + cout<first.d_place-1<<"\t"<first.d_label<<"\tIN\t"<first.d_type); + cout<<"\t"<first.d_ttl<<"\t"<< i->first.d_content->getZoneRepresentation()<<"\n"; + + if(i->first.d_type==QType::DNSKEY) { + dkrc[i->first.d_label].push_back(dynamic_pointer_cast(i->first.d_content)); + } + + if(i->first.d_type==QType::NSEC3) { + salt=dynamic_pointer_cast(i->first.d_content)->d_salt; + iterations=dynamic_pointer_cast(i->first.d_content)->d_iterations; + } + + + if(i->first.d_type!=QType::RRSIG) + grouped[make_pair(i->first.d_label, i->first.d_type)].first.push_back(i->first.d_content); + else { + shared_ptr rrc=dynamic_pointer_cast(i->first.d_content); + grouped[make_pair(i->first.d_label, rrc->d_type)].second.push_back(rrc); + cerr<<"Algorithm = "<<(int)rrc->d_algorithm<& content, value.second) { + DSRecordContent dsrc = makeDSFromDNSKey(value.first, *content.get()); + cerr<<"ds: "<