}
virtual storvector_t convertToISCVector() const =0;
std::string convertToISC() const ;
+ virtual void convertToPEM(std::FILE& fp) const
+ {
+ throw std::runtime_error(getName() + ": Conversion to PEM not supported");
+ };
virtual std::string sign(const std::string& msg) const =0;
virtual std::string hash(const std::string& msg) const
{
*/
void createFromPEMFile(DNSKEYRecordContent& drc, const std::string& filename, std::FILE& fp) override;
+ /**
+ * \brief Writes this key's contents to a file.
+ *
+ * Receives an open file handle and writes this key's contents to the
+ * file.
+ *
+ * \param[in] fp An open file handle for writing.
+ *
+ * \exception std::runtime_error In case of OpenSSL errors.
+ */
+ void convertToPEM(std::FILE& fp) const override;
+
storvector_t convertToISCVector() const override;
std::string hash(const std::string& hash) const override;
std::string sign(const std::string& hash) const override;
EC_KEY_set_asn1_flag(d_eckey.get(), OPENSSL_EC_NAMED_CURVE);
}
+void OpenSSLECDSADNSCryptoKeyEngine::convertToPEM(std::FILE& fp) const
+{
+ auto ret = PEM_write_ECPrivateKey(&fp, d_eckey.get(), nullptr, nullptr, 0, nullptr, nullptr);
+ if (ret == 0) {
+ throw runtime_error(getName() + ": Could not convert private key to PEM");
+ }
+}
+
DNSCryptoKeyEngine::storvector_t OpenSSLECDSADNSCryptoKeyEngine::convertToISCVector() const
{
storvector_t storvect;
DNSSECPrivateKey dpk = dk.getKeyById(DNSName(zone), id);
cout << dpk.getKey()->convertToISC() << endl;
}
+ else if (cmds.at(0) == "export-zone-key-pem") {
+ if (cmds.size() < 3) {
+ cerr << "Syntax: pdnsutil export-zone-key-pem ZONE KEY-ID" << endl;
+ return 1;
+ }
+
+ string zone = cmds.at(1);
+ auto id = pdns::checked_stoi<unsigned int>(cmds.at(2));
+ DNSSECPrivateKey dpk = dk.getKeyById(DNSName(zone), id);
+ dpk.getKey()->convertToPEM(*stdout);
+ }
else if (cmds.at(0) == "increase-serial") {
if (cmds.size() < 2) {
cerr << "Syntax: pdnsutil increase-serial ZONE" << endl;
BOOST_CHECK_EQUAL(pemKey->convertToISC(), dcke->convertToISC());
test_generic_signer(pemKey, pemDRC, signer);
+
+ const size_t buflen = 4096;
+
+ std::string dckePEMOutput{};
+ dckePEMOutput.resize(buflen);
+ unique_ptr<std::FILE, decltype(&std::fclose)> dckePEMOutputFp{fmemopen(static_cast<void*>(dckePEMOutput.data()), dckePEMOutput.length() - 1, "w"), &std::fclose};
+ dcke->convertToPEM(*dckePEMOutputFp);
+ std::fflush(dckePEMOutputFp.get());
+ dckePEMOutput.resize(std::ftell(dckePEMOutputFp.get()));
+
+ BOOST_CHECK_EQUAL(dckePEMOutput, *signer.pem);
+
+ std::string pemKeyOutput{};
+ pemKeyOutput.resize(buflen);
+ unique_ptr<std::FILE, decltype(&std::fclose)> pemKeyOutputFp{fmemopen(static_cast<void*>(pemKeyOutput.data()), pemKeyOutput.length() - 1, "w"), &std::fclose};
+ pemKey->convertToPEM(*pemKeyOutputFp);
+ std::fflush(pemKeyOutputFp.get());
+ pemKeyOutput.resize(std::ftell(pemKeyOutputFp.get()));
+
+ BOOST_CHECK_EQUAL(pemKeyOutput, *signer.pem);
}
}
}