X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=pdns%2Fdnssecinfra.cc;h=233b228b12cff44b102d995a26850f41b51f37d1;hb=7a86189e73f9af20eb704534b290945956505ddf;hp=d37a0465cb397bed06543b1acb9b153a674f1d46;hpb=1c3d532ec551a2377ec83dfcd796e9463d5c3fa3;p=thirdparty%2Fpdns.git diff --git a/pdns/dnssecinfra.cc b/pdns/dnssecinfra.cc index d37a0465cb..233b228b12 100644 --- a/pdns/dnssecinfra.cc +++ b/pdns/dnssecinfra.cc @@ -52,18 +52,25 @@ using namespace boost::assign; shared_ptr DNSCryptoKeyEngine::makeFromISCFile(DNSKEYRecordContent& drc, const char* fname) { string sline, isc; - FILE *fp=fopen(fname, "r"); + auto fp = std::unique_ptr(fopen(fname, "r"), fclose); if(!fp) { throw runtime_error("Unable to read file '"+string(fname)+"' for generating DNS Private Key"); } - while(stringfgets(fp, sline)) { + while(stringfgets(fp.get(), sline)) { isc += sline; } - fclose(fp); + fp.reset(); + shared_ptr dke = makeFromISCString(drc, isc); - if(!dke->checkKey()) { - throw runtime_error("Invalid DNS Private Key in file '"+string(fname)); + vector checkKeyErrors; + + if(!dke->checkKey(&checkKeyErrors)) { + string reason; + if(checkKeyErrors.size()) { + reason = " ("+boost::algorithm::join(checkKeyErrors, ", ")+")"; + } + throw runtime_error("Invalid DNS Private Key in file '"+string(fname)+"'"+reason); } return dke; } @@ -96,6 +103,9 @@ shared_ptr DNSCryptoKeyEngine::makeFromISCString(DNSKEYRecor } else if (pdns_iequals(key,"label")) { stormap["label"]=value; continue; + } else if (pdns_iequals(key,"publabel")) { + stormap["publabel"]=value; + continue; } else if(pdns_iequals(key, "Private-key-format")) continue; @@ -124,14 +134,13 @@ shared_ptr DNSCryptoKeyEngine::makeFromISCString(DNSKEYRecor std::string DNSCryptoKeyEngine::convertToISC() const { - typedef map stormap_t; storvector_t stormap = this->convertToISCVector(); ostringstream ret; ret<<"Private-key-format: v1.2\n"; for(const stormap_t::value_type& value : stormap) { if(value.first != "Algorithm" && value.first != "PIN" && value.first != "Slot" && value.first != "Engine" && - value.first != "Label") + value.first != "Label" && value.first != "PubLabel") ret<hash(toHash); } catch(const std::exception& e) { - throw std::runtime_error("Asked to a DS of unknown digest type " + std::to_string(digest)+"\n"); + throw std::runtime_error("Asked to create (C)DS record of unknown digest type " + std::to_string(digest)); } dsrc.d_algorithm = drc.d_algorithm; @@ -457,7 +466,7 @@ DSRecordContent makeDSFromDNSKey(const DNSName& qname, const DNSKEYRecordContent } -static DNSKEYRecordContent makeDNSKEYFromDNSCryptoKeyEngine(const std::shared_ptr pk, uint8_t algorithm, uint16_t flags) +static DNSKEYRecordContent makeDNSKEYFromDNSCryptoKeyEngine(const std::shared_ptr& pk, uint8_t algorithm, uint16_t flags) { DNSKEYRecordContent drc;