]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Even better interface for setKey() 11600/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 29 Nov 2022 11:02:23 +0000 (12:02 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 12 Jan 2023 13:39:12 +0000 (14:39 +0100)
pdns/dbdnsseckeeper.cc
pdns/dnssecinfra.hh
pdns/pdnsutil.cc
pdns/recursordist/test-syncres_cc4.cc
pdns/ws-auth.cc

index 6d8cb138231cbf980d9e6e94df7724d468c557f3..98b86173d74eb45de9a4931725899852ca338c99 100644 (file)
@@ -110,8 +110,7 @@ bool DNSSECKeeper::addKey(const DNSName& name, bool setSEPBit, int algorithm, in
     throw runtime_error("The algorithm does not support the given bit size.");
   }
   DNSSECPrivateKey dspk;
-  dspk.setKey(dpk, setSEPBit ? 257 : 256);
-  dspk.setAlgorithm(algorithm);
+  dspk.setKey(dpk, setSEPBit ? 257 : 256, algorithm);
   return addKey(name, dspk, id, active, published) && clearKeyCache(name);
 }
 
@@ -170,8 +169,7 @@ DNSSECPrivateKey DNSSECKeeper::getKeyById(const DNSName& zname, unsigned int id)
     DNSKEYRecordContent dkrc;
     auto key = shared_ptr<DNSCryptoKeyEngine>(DNSCryptoKeyEngine::makeFromISCString(dkrc, kd.content));
     DNSSECPrivateKey dpk;
-    dpk.setKey(key, kd.flags);
-    dpk.setAlgorithm(dkrc.d_algorithm);
+    dpk.setKey(key, kd.flags, dkrc.d_algorithm);
     
     return dpk;    
   }
@@ -583,8 +581,7 @@ DNSSECKeeper::keyset_t DNSSECKeeper::getKeys(const DNSName& zone, bool useCache)
     DNSKEYRecordContent dkrc;
     auto key = shared_ptr<DNSCryptoKeyEngine>(DNSCryptoKeyEngine::makeFromISCString(dkrc, kd.content));
     DNSSECPrivateKey dpk;
-    dpk.setKey(key, kd.flags);
-    dpk.setAlgorithm(dkrc.d_algorithm);
+    dpk.setKey(key, kd.flags, dkrc.d_algorithm);
 
     KeyMetaData kmd;
 
index 9f2888da6fa91c760ed7e09fdb319a9ffc53d7ef..e8f98a871509dbb9626f0a28346f56171a08b4e3 100644 (file)
@@ -149,20 +149,20 @@ struct DNSSECPrivateKey
   }
 
   // be aware that calling setKey() will also set the algorithm
-  void setKey(std::shared_ptr<DNSCryptoKeyEngine>& key, uint16_t flags)
+  void setKey(std::shared_ptr<DNSCryptoKeyEngine>& key, uint16_t flags, std::optional<uint8_t> algorithm = std::nullopt)
   {
     d_key = key;
     d_flags = flags;
-    d_algorithm = d_key->getAlgorithm();
+    d_algorithm = algorithm ? *algorithm : d_key->getAlgorithm();
     computeDNSKEY();
   }
 
   // be aware that calling setKey() will also set the algorithm
-  void setKey(std::unique_ptr<DNSCryptoKeyEngine>&& key, uint16_t flags)
+  void setKey(std::unique_ptr<DNSCryptoKeyEngine>&& key, uint16_t flags, std::optional<uint8_t> algorithm = std::nullopt)
   {
     d_key = std::move(key);
     d_flags = flags;
-    d_algorithm = d_key->getAlgorithm();
+    d_algorithm = algorithm ? *algorithm : d_key->getAlgorithm();
     computeDNSKEY();
   }
 
@@ -178,11 +178,6 @@ struct DNSSECPrivateKey
     return d_algorithm;
   }
 
-  void setAlgorithm(uint8_t algo)
-  {
-    d_algorithm = algo;
-  }
-
 private:
   void computeDNSKEY();
 
index 811526ea07ad8ea3287bc3e4692449bf8a1a914e..14dc785a7274beba2162e3a9e53cf5f1c6c649fb 100644 (file)
@@ -3513,8 +3513,7 @@ try
     else {
       flags = 257; // ksk
     }
-    dpk.setKey(key, flags);
-    dpk.setAlgorithm(algo);
+    dpk.setKey(key, flags, algo);
 
     int64_t id;
     if (!dk.addKey(DNSName(zone), dpk, id)) {
@@ -3566,11 +3565,11 @@ try
     }
 
     DNSSECPrivateKey dpk;
-    dpk.setKey(key, flags);
-
-    if (dpk.getAlgorithm() == DNSSECKeeper::RSASHA1NSEC3SHA1) {
-      dpk.setAlgorithm(DNSSECKeeper::RSASHA1);
+    uint8_t algo = key->getAlgorithm();
+    if (algo == DNSSECKeeper::RSASHA1NSEC3SHA1) {
+      algo = DNSSECKeeper::RSASHA1;
     }
+    dpk.setKey(key, flags, algo);
 
     int64_t id;
     if (!dk.addKey(DNSName(zone), dpk, id, active, published)) {
@@ -3650,8 +3649,7 @@ try
     }
     dpk->create(bits);
     DNSSECPrivateKey dspk;
-    dspk.setKey(dpk, keyOrZone ? 257 : 256);
-    dspk.setAlgorithm(algorithm);
+    dspk.setKey(dpk, keyOrZone ? 257 : 256, algorithm);
 
     // print key to stdout
     cout << "Flags: " << dspk.getFlags() << endl <<
index 24f6bd8e0f2061fb715f5cfa3c4287da3a8c1168..3764a0dd246b0a5d271782854916dd3a9b08da73 100644 (file)
@@ -1194,9 +1194,8 @@ BOOST_AUTO_TEST_CASE(test_dnssec_insecure_unknown_ds_algorithm)
   auto dcke = DNSCryptoKeyEngine::make(DNSSECKeeper::ECDSA256);
   dcke->create(dcke->getBits());
   DNSSECPrivateKey dpk;
-  dpk.setKey(std::move(dcke), 256);
   /* Fake algorithm number (private) */
-  dpk.setAlgorithm(253);
+  dpk.setKey(std::move(dcke), 256, 253);
 
   DSRecordContent drc = makeDSFromDNSKey(target, dpk.getDNSKEY(), DNSSECKeeper::DIGEST_SHA256);
   keys[target] = std::pair<DNSSECPrivateKey, DSRecordContent>(dpk, drc);
index 50d4b9995132fe2a72c197c6c72ad2a8216c10a8..4be003cf500897d09c8b4f55448f25b055e6c0d9 100644 (file)
@@ -1307,11 +1307,11 @@ static void apiZoneCryptokeysPOST(const DNSName& zonename, HttpRequest *req, Htt
       }
 
       uint8_t algorithm = dkrc.d_algorithm;
-      dpk.setKey(dke, flags);
       // TODO remove in 4.2.0
       if (algorithm == DNSSECKeeper::RSASHA1NSEC3SHA1) {
-        dpk.setAlgorithm(DNSSECKeeper::RSASHA1);
+        algorithm = DNSSECKeeper::RSASHA1;
       }
+      dpk.setKey(dke, flags, algorithm);
     }
     catch (std::runtime_error& error) {
       throw ApiException("Key could not be parsed. Make sure your key format is correct.");