Changeset 1909

Show
Ignore:
Timestamp:
01/26/11 00:27:29 (2 years ago)
Author:
ahu
Message:

this huge commit adds support for RSASHA512 & draft-ietf-dnsext-ecdsa using the provisional codepoints, which may still change.
ECDSAP256SHA256 and ECDSAP384SHA384 are supported.. iff you have Botan 1.9.x. Enable with ./configure --enable-botan19
GOST is just around the corner.
Btw: don't run this commit in production pls - normal service will return tomorrow

Location:
trunk/pdns
Files:
2 added
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/pdns/configure.ac

    r1846 r1909  
    119119AC_MSG_RESULT($enable_verbose_logging) 
    120120 
     121AC_MSG_CHECKING(whether we will be linking in Botan 1.9) 
     122AC_ARG_ENABLE(botan1.9,  
     123 [  --enable-botan1.9   Use Botan 1.9],enable_botan19=yes, enable_botan19=no) 
     124AC_MSG_RESULT($enable_botan19) 
     125AM_CONDITIONAL(BOTAN19,test x"$enable_botan19" = "xyes") 
     126 
     127 
    121128AC_MSG_CHECKING(whether we should build static binaries) 
    122129 
     
    191198 
    192199AC_MSG_RESULT($enable_recursor) 
    193  
    194200AM_CONDITIONAL(RECURSOR,test x"$enable_recursor" = "xyes") 
    195201 
  • trunk/pdns/pdns/Makefile.am

    r1862 r1909  
    1111if RECURSOR 
    1212sbin_PROGRAMS = pdns_server pdns_recursor 
    13 bin_PROGRAMS = pdns_control  rec_control pdnssec dnsreplay 
     13bin_PROGRAMS = pdns_control rec_control pdnssec dnsreplay 
    1414else 
    1515sbin_PROGRAMS = pdns_server  
     
    4141aes/aestab.c aes/aestab.h aes/brg_endian.h aes/brg_types.h aes/dns_random.cc \ 
    4242randomhelper.cc namespaces.hh nsecrecords.cc base32.cc dbdnsseckeeper.cc dnssecinfra.cc \ 
    43 dnsseckeeper.hh dnssecinfra.hh base32.hh dns.cc dnssecsigner.cc 
     43dnsseckeeper.hh dnssecinfra.hh base32.hh dns.cc dnssecsigner.cc polarrsakeyinfra.cc 
    4444 
    4545# 
    4646pdns_server_LDFLAGS=@moduleobjects@ @modulelibs@ @DYNLINKFLAGS@ @LIBDL@ @THREADFLAGS@ $(BOOST_FILESYSTEM_LDFLAGS) -Lext/polarssl/library 
    4747pdns_server_LDADD=$(BOOST_FILESYSTEM_LIBS) -lpolarssl 
     48 
     49if BOTAN19 
     50pdns_server_SOURCES += botan19signers.cc 
     51pdns_server_LDADD += -lbotan -lgmp 
     52endif 
    4853   
    4954pdnssec_SOURCES=pdnssec.cc dbdnsseckeeper.cc sstuff.hh dnsparser.cc dnsparser.hh dnsrecords.cc dnswriter.cc dnswriter.hh \ 
     
    5560        backends/gsql/gsqlbackend.cc \ 
    5661        backends/gsql/gsqlbackend.hh backends/gsql/ssql.hh zoneparser-tng.cc \ 
    57         dynlistener.cc dns.cc randombackend.cc dnssecsigner.cc 
     62        dynlistener.cc dns.cc randombackend.cc dnssecsigner.cc polarrsakeyinfra.cc 
    5863 
    5964pdnssec_LDFLAGS=@moduleobjects@ @modulelibs@ @DYNLINKFLAGS@ @LIBDL@ @THREADFLAGS@ -Lext/polarssl/library/  
    6065pdnssec_LDADD=$(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS) -lpolarssl $(BOOST_PROGRAM_OPTIONS_LIBS) 
     66 
     67if BOTAN19 
     68pdnssec_SOURCES += botan19signers.cc 
     69pdnssec_LDADD += -lbotan -lgmp 
     70endif 
    6171 
    6272sdig_SOURCES=sdig.cc sstuff.hh dnsparser.cc dnsparser.hh dnsrecords.cc dnswriter.cc dnswriter.hh \ 
     
    118128nproxy_SOURCES=nproxy.cc dnsparser.cc dnsrecords.cc dnsparser.hh  \ 
    119129        rcpgenerator.cc rcpgenerator.hh base64.cc base64.hh dnswriter.cc dnswriter.hh \ 
    120         sillyrecords.cc selectmplexer.cc mplexer.hh 
     130        sillyrecords.cc selectmplexer.cc pollmplexer.cc mplexer.hh 
    121131 
    122132nproxy_LDFLAGS= @DYNLINKFLAGS@ @THREADFLAGS@ $(BOOST_FILESYSTEM_LDFLAGS) $(BOOST_PROGRAM_OPTIONS_LDFLAGS) 
     
    125135notify_SOURCES=notify.cc dnsparser.cc dnsrecords.cc dnsparser.hh  \ 
    126136        rcpgenerator.cc rcpgenerator.hh base64.cc base64.hh dnswriter.cc dnswriter.hh \ 
    127         sillyrecords.cc selectmplexer.cc nsecrecords.cc base32.cc misc.cc unix_utility.cc \ 
     137        sillyrecords.cc selectmplexer.cc pollmplexer.cc nsecrecords.cc base32.cc misc.cc unix_utility.cc \ 
    128138        logger.cc qtype.cc statbag.cc 
    129139 
     
    159169aes/dns_random.cc aes/aescrypt.c aes/aeskey.c aes/aestab.c aes/aes_modes.c \ 
    160170lua-pdns-recursor.cc lua-pdns-recursor.hh randomhelper.cc  \ 
    161 recpacketcache.cc recpacketcache.hh dns.cc nsecrecords.cc base32.cc 
     171recpacketcache.cc recpacketcache.hh dns.cc nsecrecords.cc base32.cc pollmplexer.cc 
    162172 
    163173#../modules/gmysqlbackend/smysql.cc  
  • trunk/pdns/pdns/dbdnsseckeeper.cc

    r1905 r1909  
    7979void DNSSECKeeper::addKey(const std::string& name, bool keyOrZone, int algorithm, int bits, bool active) 
    8080{ 
    81   if(!bits) 
    82     bits = keyOrZone ? 2048 : 1024; 
     81  if(!bits) { 
     82    if(algorithm <= 10) 
     83      bits = keyOrZone ? 2048 : 1024; 
     84    else { 
     85      if(algorithm == 13) 
     86        bits = 256; 
     87      else if(algorithm == 14) 
     88        bits = 384; 
     89      else { 
     90        throw runtime_error("Can't guess key size for algoritm "+lexical_cast<string>(algorithm)); 
     91      } 
     92    } 
     93  } 
    8394  DNSSECPrivateKey dspk; 
    84   shared_ptr<DNSPrivateKey> dpk(new RSADNSPrivateKey); // defaults to RSA for now, could be smart w/algorithm! XXX FIXME 
     95  shared_ptr<DNSPrivateKey> dpk(DNSPrivateKey::make(algorithm)); // defaults to RSA for now, could be smart w/algorithm! XXX FIXME 
    8596  dpk->create(bits); 
    8697  dspk.setKey(dpk); 
     
    131142    DNSSECPrivateKey dpk; 
    132143    DNSKEYRecordContent dkrc; 
    133     dpk.setKey(shared_ptr<DNSPrivateKey>(DNSPrivateKey::fromISCString(dkrc, kd.content))); 
     144    dpk.setKey(shared_ptr<DNSPrivateKey>(DNSPrivateKey::makeFromISCString(dkrc, kd.content))); 
    134145    dpk.d_flags = kd.flags; 
    135146    dpk.d_algorithm = dkrc.d_algorithm; 
     
    277288 
    278289    DNSKEYRecordContent dkrc; 
    279     dpk.setKey(shared_ptr<DNSPrivateKey>(DNSPrivateKey::fromISCString(dkrc, kd.content))); 
     290    dpk.setKey(shared_ptr<DNSPrivateKey>(DNSPrivateKey::makeFromISCString(dkrc, kd.content))); 
    280291    dpk.d_flags = kd.flags; 
    281292    dpk.d_algorithm = dkrc.d_algorithm; 
  • trunk/pdns/pdns/dnssecinfra.cc

    r1905 r1909  
    88#include <boost/foreach.hpp> 
    99#include <boost/algorithm/string.hpp> 
    10 #include <polarssl/rsa.h> 
    11 #include <polarssl/base64.h> 
     10#include "dnssecinfra.hh"  
     11#include "dnsseckeeper.hh" 
     12 
    1213#include <polarssl/sha1.h> 
    1314#include <polarssl/sha2.h> 
    14 #include "dnssecinfra.hh"  
    15 #include "dnsseckeeper.hh" 
    16 #include <polarssl/havege.h> 
    17 #include <polarssl/base64.h> 
     15#include <polarssl/sha4.h> 
    1816#include <boost/assign/std/vector.hpp> // for 'operator+=()' 
    1917#include <boost/assign/list_inserter.hpp> 
     
    2321using namespace boost::assign; 
    2422 
    25 void RSADNSPrivateKey::create(unsigned int bits) 
    26 { 
    27   havege_state hs; 
    28   havege_init( &hs ); 
    29    
    30   rsa_init(&d_context, RSA_PKCS_V15, 0, havege_rand, &hs ); // FIXME this leaks memory 
    31   int ret=rsa_gen_key(&d_context, bits, 65537); 
    32   if(ret < 0)  
    33     throw runtime_error("Key generation failed"); 
    34 } 
    35  
    36 std::string RSADNSPrivateKey::getPubKeyHash() const 
    37 { 
    38   unsigned char hash[20]; 
    39   unsigned char N[mpi_size(&d_context.N)]; 
    40   mpi_write_binary(&d_context.N, N, sizeof(N)); 
    41   unsigned char E[mpi_size(&d_context.E)]; 
    42   mpi_write_binary(&d_context.E, E, sizeof(E)); 
    43    
    44   sha1_context ctx; 
    45   sha1_starts(&ctx); 
    46   sha1_update(&ctx, N, sizeof(N)); 
    47   sha1_update(&ctx, E, sizeof(E)); 
    48   sha1_finish(&ctx, hash); 
    49   return string((char*)hash, sizeof(hash)); 
    50 } 
    51  
    52 std::string RSADNSPrivateKey::sign(const std::string& hash) const 
    53 { 
    54   unsigned char signature[mpi_size(&d_context.N)]; 
    55   int ret=rsa_pkcs1_sign(const_cast<rsa_context*>(&d_context), RSA_PRIVATE,  
    56     hash.size()==20 ? SIG_RSA_SHA1 : SIG_RSA_SHA256,  
    57     hash.size(), 
    58     (const unsigned char*) hash.c_str(), signature); 
    59    
    60   if(ret!=0) { 
    61     cerr<<"signing returned: "<<ret<<endl; 
    62     exit(1); 
    63   } 
    64   return string((char*) signature, sizeof(signature)); 
    65 } 
    66  
    67 std::string RSADNSPrivateKey::convertToISC(unsigned int algorithm) const 
    68 { 
    69   string ret; 
    70   typedef vector<pair<string, const mpi*> > outputs_t; 
    71   outputs_t outputs; 
    72   push_back(outputs)("Modulus", &d_context.N)("PublicExponent",&d_context.E) 
    73     ("PrivateExponent",&d_context.D) 
    74     ("Prime1",&d_context.P) 
    75     ("Prime2",&d_context.Q) 
    76     ("Exponent1",&d_context.DP) 
    77     ("Exponent2",&d_context.DQ) 
    78     ("Coefficient",&d_context.QP); 
    79  
    80   ret = "Private-key-format: v1.2\nAlgorithm: "+lexical_cast<string>(algorithm); 
    81   switch(algorithm) { 
    82     case 5: 
    83     case 7 : 
    84       ret+= " (RSASHA1)"; 
    85       break; 
    86     case 8: 
    87       ret += " (RSASHA256)"; 
    88       break; 
    89   } 
    90   ret += "\n"; 
    91  
    92   BOOST_FOREACH(outputs_t::value_type value, outputs) { 
    93     ret += value.first; 
    94     ret += ": "; 
    95     unsigned char tmp[mpi_size(value.second)]; 
    96     mpi_write_binary(value.second, tmp, sizeof(tmp)); 
    97     unsigned char base64tmp[sizeof(tmp)*2]; 
    98     int dlen=sizeof(base64tmp); 
    99     base64_encode(base64tmp, &dlen, tmp, sizeof(tmp)); 
    100     ret.append((const char*)base64tmp, dlen); 
    101     ret.append(1, '\n'); 
    102   } 
    103   return ret; 
    104 } 
    105  
    106  
    107 DNSPrivateKey* DNSPrivateKey::fromISCFile(DNSKEYRecordContent& drc, const char* fname) 
     23DNSPrivateKey* DNSPrivateKey::makeFromISCFile(DNSKEYRecordContent& drc, const char* fname) 
    10824{ 
    10925  string sline, isc, key, value; 
     
    12137  fclose(fp); 
    12238 
    123   switch(algorithm) { 
    124     case 5: 
    125     case 7: 
    126     case 8: 
    127     case 10: 
    128       return RSADNSPrivateKey::fromISCString(drc, isc); 
    129       break; 
    130     default:  
    131       throw runtime_error("Unknown DNSSEC signature algorithm number "+lexical_cast<string>(algorithm)); 
    132       break; 
    133   } 
    134   return 0; 
    135 } 
    136  
    137 DNSPrivateKey* DNSPrivateKey::fromISCString(DNSKEYRecordContent& drc, const std::string& content) 
     39  DNSPrivateKey* dpk=make(algorithm); 
     40  dpk->fromISCString(drc, isc); 
     41  return dpk; 
     42} 
     43 
     44DNSPrivateKey* DNSPrivateKey::make(unsigned int algo) 
     45{ 
     46  makers_t& makers = getMakers(); 
     47  makers_t::const_iterator iter = makers.find(algo); 
     48  if(iter != makers.end()) 
     49    return (iter->second)(algo); 
     50  else { 
     51    throw runtime_error("Request to create key object for unknown algorithm number "+lexical_cast<string>(algo)); 
     52  } 
     53} 
     54 
     55void DNSPrivateKey::report(unsigned int algo, maker_t* maker) 
     56{ 
     57  getMakers()[algo]=maker; 
     58} 
     59DNSPrivateKey* DNSPrivateKey::makeFromISCString(DNSKEYRecordContent& drc, const std::string& content) 
    13860{ 
    13961  int algorithm = 0; 
     
    14769    } 
    14870  } 
    149   switch(algorithm) { 
    150     case 5: 
    151     case 7: 
    152     case 8: 
    153     case 10: 
    154       return RSADNSPrivateKey::fromISCString(drc, content); 
    155       break; 
    156     default:  
    157       throw runtime_error("Unknown DNSSEC signature algorithm number "+lexical_cast<string>(algorithm)); 
    158       break; 
     71  DNSPrivateKey* dpk=make(algorithm); 
     72  dpk->fromISCString(drc, content); 
     73  return dpk; 
     74} 
     75 
     76 
     77DNSPrivateKey* DNSPrivateKey::makeFromPEMString(DNSKEYRecordContent& drc, const std::string& raw) 
     78{ 
     79   
     80  BOOST_FOREACH(makers_t::value_type& val, getMakers()) 
     81  { 
     82    DNSPrivateKey* ret=0; 
     83    try { 
     84      ret = val.second(val.first); 
     85      ret->fromPEMString(drc, raw); 
     86      return ret; 
     87    } 
     88    catch(...) 
     89    { 
     90      delete ret; // fine if 0 
     91    } 
    15992  } 
    16093  return 0; 
    16194} 
    16295 
    163 DNSPrivateKey* RSADNSPrivateKey::fromISCString(DNSKEYRecordContent& drc, const std::string& content) 
    164 { 
    165   RSADNSPrivateKey* ret = new RSADNSPrivateKey(); 
    166    
    167   string sline; 
    168   string key,value; 
    169   map<string, mpi*> places; 
    170    
    171   rsa_init(&ret->d_context, RSA_PKCS_V15, 0, NULL, NULL ); 
    172  
    173   places["Modulus"]=&ret->d_context.N; 
    174   places["PublicExponent"]=&ret->d_context.E; 
    175   places["PrivateExponent"]=&ret->d_context.D; 
    176   places["Prime1"]=&ret->d_context.P; 
    177   places["Prime2"]=&ret->d_context.Q; 
    178   places["Exponent1"]=&ret->d_context.DP; 
    179   places["Exponent2"]=&ret->d_context.DQ; 
    180   places["Coefficient"]=&ret->d_context.QP; 
    181  
    182   string modulus, exponent; 
    183   istringstream str(content); 
    184   unsigned char decoded[1024]; 
    185   while(getline(str, sline)) { 
    186     tie(key,value)=splitField(sline, ':'); 
    187     trim(value); 
    188  
    189     if(places.count(key)) { 
    190       if(places[key]) { 
    191         int len=sizeof(decoded); 
    192         if(base64_decode(decoded, &len, (unsigned char*)value.c_str(), value.length()) < 0) { 
    193           cerr<<"Error base64 decoding '"<<value<<"'\n"; 
    194           exit(1); 
    195         } 
    196         //      B64Decode(value, decoded); 
    197         //      cerr<<key<<" decoded.length(): "<<8*len<<endl; 
    198         mpi_read_binary(places[key], decoded, len); 
    199         if(key=="Modulus") 
    200           modulus.assign((const char*)decoded,len); 
    201         if(key=="PublicExponent") 
    202           exponent.assign((const char*)decoded,len); 
    203       } 
    204     } 
    205     else { 
    206       if(key == "Algorithm")  
    207         drc.d_algorithm = atoi(value.c_str()); 
    208       else if(key != "Private-key-format") 
    209         cerr<<"Unknown field '"<<key<<"'\n"; 
    210     } 
    211   } 
    212   ret->d_context.len = ( mpi_msb( &ret->d_context.N ) + 7 ) >> 3; // no clue what this does 
    213  
    214   if(exponent.length() < 255)  
    215     drc.d_key.assign(1, (char) (unsigned int) exponent.length()); 
    216   else { 
    217     drc.d_key.assign(1, 0); 
    218     uint16_t len=htons(exponent.length()); 
    219     drc.d_key.append((char*)&len, 2); 
    220   } 
    221   drc.d_key.append(exponent); 
    222   drc.d_key.append(modulus); 
    223   drc.d_protocol=3; 
    224    
    225   return ret; 
    226 } 
    227  
    228 DNSPrivateKey* DNSPrivateKey::fromPEMString(DNSKEYRecordContent& drc, const std::string& raw) 
    229 { 
    230   return RSADNSPrivateKey::fromPEMString(drc, raw); 
    231 } 
    232  
    233 DNSPrivateKey* RSADNSPrivateKey::fromPEMString(DNSKEYRecordContent& drc, const std::string& raw) 
    234 { 
    235   vector<string> integers; 
    236   decodeDERIntegerSequence(raw, integers); 
    237   cerr<<"Got "<<integers.size()<<" integers"<<endl;  
    238   map<int, mpi*> places; 
    239    
    240   RSADNSPrivateKey* ret = new RSADNSPrivateKey; 
    241    
    242   rsa_init(&ret->d_context, RSA_PKCS_V15, 0, NULL, NULL ); 
    243  
    244   places[1]=&ret->d_context.N; 
    245   places[2]=&ret->d_context.E; 
    246   places[3]=&ret->d_context.D; 
    247   places[4]=&ret->d_context.P; 
    248   places[5]=&ret->d_context.Q; 
    249   places[6]=&ret->d_context.DP; 
    250   places[7]=&ret->d_context.DQ; 
    251   places[8]=&ret->d_context.QP; 
    252  
    253   string modulus, exponent; 
    254    
    255   for(int n = 0; n < 9 ; ++n) { 
    256     if(places.count(n)) { 
    257       if(places[n]) { 
    258         mpi_read_binary(places[n], (const unsigned char*)integers[n].c_str(), integers[n].length()); 
    259         if(n==1) 
    260           modulus=integers[n]; 
    261         if(n==2) 
    262           exponent=integers[n]; 
    263       } 
    264     } 
    265   } 
    266   ret->d_context.len = ( mpi_msb( &ret->d_context.N ) + 7 ) >> 3; // no clue what this does 
    267  
    268   if(exponent.length() < 255)  
    269     drc.d_key.assign(1, (char) (unsigned int) exponent.length()); 
    270   else { 
    271     drc.d_key.assign(1, 0); 
    272     uint16_t len=htons(exponent.length()); 
    273     drc.d_key.append((char*)&len, 2); 
    274   } 
    275   drc.d_key.append(exponent); 
    276   drc.d_key.append(modulus); 
    277   drc.d_protocol=3; 
    278    
    279   return ret; 
    280 } 
    281  
    282 void makeRSAPublicKeyFromDNS(rsa_context* rc, const DNSKEYRecordContent& dkrc) 
    283 { 
    284   rsa_init(rc, RSA_PKCS_V15, 0, NULL, NULL ); 
    285  
    286   mpi_read_binary(&rc->E, (unsigned char*)dkrc.getExponent().c_str(), dkrc.getExponent().length());    // exponent 
    287   mpi_read_binary(&rc->N, (unsigned char*)dkrc.getModulus().c_str(), dkrc.getModulus().length());    // modulus 
    288   rc->len = ( mpi_msb( &rc->N ) + 7 ) >> 3; // no clue what this does 
    289 } 
    29096 
    29197bool sharedDNSSECCompare(const shared_ptr<DNSRecordContent>& a, const shared_ptr<DNSRecordContent>& b) 
     
    316122  } 
    317123   
    318   if(rrc.d_algorithm <= 7 ) { 
     124  // algorithm 12 needs special GOST hash 
     125   
     126  if(rrc.d_algorithm <= 7 ) {  // RSASHA1 
    319127    unsigned char hash[20]; 
    320128    sha1((unsigned char*)toHash.c_str(), toHash.length(), hash); 
    321129    return string((char*)hash, sizeof(hash)); 
    322   } else { 
     130  } else if(rrc.d_algorithm == 8 || rrc.d_algorithm == 13) { // RSASHA256 or ECDSAP256 
    323131    unsigned char hash[32]; 
    324132    sha2((unsigned char*)toHash.c_str(), toHash.length(), hash, 0); 
    325133    return string((char*)hash, sizeof(hash)); 
     134  } else if(rrc.d_algorithm == 10) { // RSASHA512 
     135    unsigned char hash[64]; 
     136    sha4((unsigned char*)toHash.c_str(), toHash.length(), hash, 0); 
     137    return string((char*)hash, sizeof(hash)); 
     138  } else if(rrc.d_algorithm == 14) { // ECDSAP384 
     139    unsigned char hash[48]; 
     140    sha4((unsigned char*)toHash.c_str(), toHash.length(), hash, 1); // == 384 
     141    return string((char*)hash, sizeof(hash)); 
     142  } 
     143  else { 
     144    cerr<<"No idea how to hash for algorithm "<<(int)rrc.d_algorithm<<endl; 
     145    exit(1); 
    326146  } 
    327147} 
     
    347167} 
    348168 
    349 string RSADNSPrivateKey::getPublicKeyString()  const 
    350 { 
    351   string keystring; 
    352   char tmp[max(mpi_size(&d_context.E), mpi_size(&d_context.N))]; 
    353  
    354   mpi_write_binary(&d_context.E, (unsigned char*)tmp, mpi_size(&d_context.E) ); 
    355   string exponent((char*)tmp, mpi_size(&d_context.E)); 
    356  
    357   mpi_write_binary(&d_context.N, (unsigned char*)tmp, mpi_size(&d_context.N) ); 
    358   string modulus((char*)tmp, mpi_size(&d_context.N)); 
    359  
    360   if(exponent.length() < 255)  
    361     keystring.assign(1, (char) (unsigned int) exponent.length()); 
    362   else { 
    363     keystring.assign(1, 0); 
    364     uint16_t len=htons(exponent.length()); 
    365     keystring.append((char*)&len, 2); 
    366   } 
    367   keystring.append(exponent); 
    368   keystring.append(modulus); 
    369   return keystring; 
    370 } 
    371  
    372 DNSKEYRecordContent makeDNSKEYFromRSAKey(const DNSPrivateKey* pk, uint8_t algorithm, uint16_t flags) 
     169 
     170DNSKEYRecordContent makeDNSKEYFromDNSPrivateKey(const DNSPrivateKey* pk, uint8_t algorithm, uint16_t flags) 
    373171{ 
    374172  DNSKEYRecordContent drc; 
    375173   
    376  
    377174  drc.d_protocol=3; 
    378175  drc.d_algorithm = algorithm; 
     
    382179  return drc; 
    383180} 
    384  
    385181 
    386182int countLabels(const std::string& signQName) 
     
    396192} 
    397193 
    398  
    399  
    400194uint32_t getCurrentInception() 
    401195{ 
     
    404198  return now; 
    405199} 
    406  
    407  
    408200 
    409201std::string hashQNameWithSalt(unsigned int times, const std::string& salt, const std::string& qname) 
     
    426218DNSKEYRecordContent DNSSECPrivateKey::getDNSKEY() const 
    427219{ 
    428   return makeDNSKEYFromRSAKey(getKey(), d_algorithm, d_flags); 
     220  return makeDNSKEYFromDNSPrivateKey(getKey(), d_algorithm, d_flags); 
    429221} 
    430222 
     
    503295    if(de.getOffset() - startseq != seqlen) 
    504296      throw runtime_error("DER Sequence ended before end of data"); 
    505   } 
    506    
    507 } 
     297  }   
     298} 
  • trunk/pdns/pdns/dnssecinfra.hh

    r1905 r1909  
    22#define PDNS_DNSSECINFRA_HH 
    33#include "dnsrecords.hh" 
    4 #include <polarssl/rsa.h> 
    54#include <boost/shared_ptr.hpp> 
    65#include <string> 
    76#include <vector> 
     7#include <map> 
    88#include "misc.hh" 
    9  
    10  
    11 #define PDNSSEC_MI(x) mpi_init(&d_context.x, 0) 
    12 #define PDNSSEC_MC(x) PDNSSEC_MI(x); mpi_copy(&d_context.x, const_cast<mpi*>(&orig.d_context.x)) 
    13 #define PDNSSEC_MF(x) mpi_free(&d_context.x, 0) 
    14  
    15 inline bool operator<(const mpi& a, const mpi& b) 
    16 { 
    17   return mpi_cmp_mpi(&a, &b) < 0; 
    18 } 
    199 
    2010class DNSPrivateKey 
     
    2818    virtual int getBits() const =0; 
    2919     
    30   static DNSPrivateKey* fromISCFile(DNSKEYRecordContent& drc, const char* fname); 
    31   static DNSPrivateKey* fromISCString(DNSKEYRecordContent& drc, const std::string& content); 
    32   static DNSPrivateKey* fromPEMString(DNSKEYRecordContent& drc, const std::string& raw); 
     20    virtual void fromISCString(DNSKEYRecordContent& drc, const std::string& content)=0; 
     21    virtual void fromPEMString(DNSKEYRecordContent& drc, const std::string& raw)=0; 
     22     
     23    static DNSPrivateKey* makeFromISCFile(DNSKEYRecordContent& drc, const char* fname); 
     24    static DNSPrivateKey* makeFromISCString(DNSKEYRecordContent& drc, const std::string& content); 
     25    static DNSPrivateKey* makeFromPEMString(DNSKEYRecordContent& drc, const std::string& raw); 
     26    static DNSPrivateKey* make(unsigned int algorithm); 
     27     
     28    typedef DNSPrivateKey* maker_t(unsigned int algorithm); 
     29     
     30    static void report(unsigned int algorithm, maker_t* maker); 
     31  private: 
     32     
     33    typedef std::map<unsigned int, maker_t*> makers_t; 
     34     
     35    static makers_t& getMakers() 
     36    { 
     37      static makers_t s_makers; 
     38      return s_makers; 
     39    } 
     40    // need some magic here to pick the right DNSPrivateKey supplier 
    3341}; 
    34  
    35 class RSADNSPrivateKey : public DNSPrivateKey 
    36 { 
    37 public: 
    38   RSADNSPrivateKey() 
    39   { 
    40     memset(&d_context, 0, sizeof(d_context)); 
    41     PDNSSEC_MI(N);  
    42     PDNSSEC_MI(E); PDNSSEC_MI(D); PDNSSEC_MI(P); PDNSSEC_MI(Q); PDNSSEC_MI(DP); PDNSSEC_MI(DQ); PDNSSEC_MI(QP); PDNSSEC_MI(RN); PDNSSEC_MI(RP); PDNSSEC_MI(RQ); 
    43   } 
    44  
    45   ~RSADNSPrivateKey() 
    46   { 
    47     PDNSSEC_MF(N);  
    48     PDNSSEC_MF(E); PDNSSEC_MF(D); PDNSSEC_MF(P); PDNSSEC_MF(Q); PDNSSEC_MF(DP); PDNSSEC_MF(DQ); PDNSSEC_MF(QP); PDNSSEC_MF(RN); PDNSSEC_MF(RP); PDNSSEC_MF(RQ); 
    49   } 
    50  
    51   bool operator<(const RSADNSPrivateKey& rhs) const 
    52   { 
    53     return tie(d_context.N, d_context.E, d_context.D, d_context.P, d_context.Q, d_context.DP, d_context.DQ, d_context.QP) 
    54     < tie(rhs.d_context.N, rhs.d_context.E, rhs.d_context.D, rhs.d_context.P, rhs.d_context.Q, rhs.d_context.DP, rhs.d_context.DQ, rhs.d_context.QP); 
    55   } 
    56  
    57   RSADNSPrivateKey(const RSADNSPrivateKey& orig)  
    58   { 
    59     d_context.ver = orig.d_context.ver; 
    60     d_context.len = orig.d_context.len; 
    61  
    62     d_context.padding = orig.d_context.padding; 
    63     d_context.hash_id = orig.d_context.hash_id; 
    64     d_context.f_rng = orig.d_context.f_rng; 
    65     d_context.p_rng = orig.d_context.p_rng; 
    66      
    67     PDNSSEC_MC(N);  
    68     PDNSSEC_MC(E); PDNSSEC_MC(D); PDNSSEC_MC(P); PDNSSEC_MC(Q); PDNSSEC_MC(DP); PDNSSEC_MC(DQ); PDNSSEC_MC(QP); PDNSSEC_MC(RN); PDNSSEC_MC(RP); PDNSSEC_MC(RQ); 
    69   } 
    70  
    71   RSADNSPrivateKey& operator=(const RSADNSPrivateKey& orig)  
    72   { 
    73     d_context.ver = orig.d_context.ver; 
    74     d_context.len = orig.d_context.len; 
    75  
    76     d_context.padding = orig.d_context.padding; 
    77     d_context.hash_id = orig.d_context.hash_id; 
    78     d_context.f_rng = orig.d_context.f_rng; 
    79     d_context.p_rng = orig.d_context.p_rng; 
    80      
    81     PDNSSEC_MF(N);  
    82     PDNSSEC_MF(E); PDNSSEC_MF(D); PDNSSEC_MF(P); PDNSSEC_MF(Q); PDNSSEC_MF(DP); PDNSSEC_MF(DQ); PDNSSEC_MF(QP); PDNSSEC_MF(RN); PDNSSEC_MF(RP); PDNSSEC_MF(RQ); 
    83      
    84     PDNSSEC_MC(N);  
    85     PDNSSEC_MC(E); PDNSSEC_MC(D); PDNSSEC_MC(P); PDNSSEC_MC(Q); PDNSSEC_MC(DP); PDNSSEC_MC(DQ); PDNSSEC_MC(QP); PDNSSEC_MC(RN); PDNSSEC_MC(RP); PDNSSEC_MC(RQ); 
    86     return *this; 
    87   } 
    88  
    89   const rsa_context& getConstContext() const 
    90   { 
    91     return d_context; 
    92   } 
    93  
    94   rsa_context& getContext()  
    95   { 
    96     return d_context; 
    97   } 
    98  
    99   void create(unsigned int bits); 
    100   std::string convertToISC(unsigned int algorithm) const; 
    101   std::string getPubKeyHash() const; 
    102   std::string sign(const std::string& hash) const;  
    103   std::string getPublicKeyString() const; 
    104   int getBits() const 
    105   { 
    106     return mpi_size(&d_context.N)*8; 
    107   } 
    108   static DNSPrivateKey* fromISCString(DNSKEYRecordContent& drc, const std::string& content); 
    109   static DNSPrivateKey* fromPEMString(DNSKEYRecordContent& drc, const std::string& raw); 
    110  
    111 private: 
    112   rsa_context d_context; 
    113 }; 
    114  
    115 // see above 
    116 #undef PDNSSEC_MC 
    117 #undef PDNSSEC_MI 
    118 #undef PDNSSEC_MF 
    11942 
    12043struct DNSSECPrivateKey 
     
    15679}; 
    15780 
    158  
    159 DNSKEYRecordContent getRSAKeyFromISC(rsa_context* rsa, const char* fname); 
    160 DNSKEYRecordContent getRSAKeyFromISCString(rsa_context* rsa, const std::string& content); 
    161 DNSKEYRecordContent getRSAKeyFromPEMString(rsa_context* rsa, const std::string& content); 
    162 void makeRSAPublicKeyFromDNS(rsa_context* rc, const DNSKEYRecordContent& dkrc); 
    16381bool sharedDNSSECCompare(const boost::shared_ptr<DNSRecordContent>& a, const shared_ptr<DNSRecordContent>& b); 
    16482string getHashForRRSET(const std::string& qname, const RRSIGRecordContent& rrc, std::vector<boost::shared_ptr<DNSRecordContent> >& signRecords); 
    165 DNSKEYRecordContent makeDNSKEYFromRSAKey(const rsa_context* rc, uint8_t algorithm, uint16_t flags); 
     83 
    16684DSRecordContent makeDSFromDNSKey(const std::string& qname, const DNSKEYRecordContent& drc, int digest=1); 
    16785 
  • trunk/pdns/pdns/pdnssec.cc

    r1908 r1909  
    312312      else if(pdns_iequals(cmds[n], "rsasha256")) 
    313313        algorithm=8; 
     314      else if(pdns_iequals(cmds[n], "gost")) 
     315        algorithm=10; 
     316      else if(pdns_iequals(cmds[n], "ecdsa256")) 
     317        algorithm=13; 
     318      else if(pdns_iequals(cmds[n], "ecdsa384")) 
     319        algorithm=14; 
    314320      else if(atoi(cmds[n].c_str())) 
    315321        bits = atoi(cmds[n].c_str()); 
     
    437443    DNSSECPrivateKey dpk; 
    438444    DNSKEYRecordContent drc; 
    439     shared_ptr<DNSPrivateKey> key(DNSPrivateKey::fromPEMString(drc, raw)); 
     445    shared_ptr<DNSPrivateKey> key(DNSPrivateKey::makeFromPEMString(drc, raw)); 
    440446    dpk.setKey(key); 
    441447     
     
    472478    DNSSECPrivateKey dpk; 
    473479    DNSKEYRecordContent drc; 
    474     shared_ptr<DNSPrivateKey> key(DNSPrivateKey::fromISCFile(drc, fname.c_str())); 
     480    shared_ptr<DNSPrivateKey> key(DNSPrivateKey::makeFromISCFile(drc, fname.c_str())); 
    475481    dpk.setKey(key); 
    476482    dpk.d_algorithm = drc.d_algorithm;