]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Do not test ECDSA deterministic mode if cryptography could not build
authorBob Halley <halley@dnspython.org>
Sat, 20 Sep 2025 17:17:27 +0000 (10:17 -0700)
committerBob Halley <halley@dnspython.org>
Sat, 20 Sep 2025 17:17:27 +0000 (10:17 -0700)
a wheel with support for it.  This can happen with pypy on ubuntu-latest.

tests/test_dnssec.py
tests/test_dnssecalgs.py

index 117244b11f979195a74e6df7e37be8f6510046e1..77bd4fefd78bd7fd69d76bcfa2e0ebd9cd8455cd 100644 (file)
@@ -44,8 +44,17 @@ try:
 except ImportError:
     pass  # Cryptography ImportError already handled in dns.dnssec
 
+    def default_backend():
+        raise NotImplementedError
+
+
 # pylint: disable=line-too-long
 
+if dns.dnssec._have_pyca:
+    have_deterministic = default_backend().ecdsa_deterministic_supported()
+else:
+    have_deterministic = False
+
 abs_dnspython_org = dns.name.from_text("dnspython.org")
 
 abs_keys = {
@@ -1092,19 +1101,18 @@ class DNSSECMiscTestCase(unittest.TestCase):
 
     def test_sign_zone_initially_empty(self):
         zone = dns.zone.Zone("example.")
-        soa = dns.rdataset.from_text("IN", "SOA", 3600,
-                                     "ns.example. hostmaster.example. 1 2 3 4 5")
+        soa = dns.rdataset.from_text(
+            "IN", "SOA", 3600, "ns.example. hostmaster.example. 1 2 3 4 5"
+        )
         privkey = ed25519.Ed25519PrivateKey.generate()
-        dnskey = dns.dnssec.make_dnskey(privkey.public_key(),
-                                        dns.dnssec.ED25519)
+        dnskey = dns.dnssec.make_dnskey(privkey.public_key(), dns.dnssec.ED25519)
         with zone.writer() as txn:
             txn.add(dns.name.empty, soa)
-            dns.dnssec.sign_zone(zone, txn=txn, keys=[(privkey, dnskey)],
-                                 lifetime=3600)
+            dns.dnssec.sign_zone(zone, txn=txn, keys=[(privkey, dnskey)], lifetime=3600)
 
         self.assertIsNotNone(zone.find_rdataset(dns.name.empty, "SOA"))
-        self.assertIsNotNone(zone.find_rdataset(dns.name.empty, "RRSIG",
-                                                covers="SOA"))
+        self.assertIsNotNone(zone.find_rdataset(dns.name.empty, "RRSIG", covers="SOA"))
+
 
 @unittest.skipUnless(dns.dnssec._have_pyca, "Python Cryptography cannot be imported")
 class DNSSECMakeDSTestCase(unittest.TestCase):
@@ -1412,10 +1420,12 @@ class DNSSECSignatureTestCase(unittest.TestCase):
         )
         self._test_signature(key, dns.dnssec.Algorithm.RSASHA256, abs_soa)
 
+    @unittest.skipUnless(have_deterministic, "deterministic ECDSA not available")
     def testSignatureECDSAP256SHA256(self):  # type: () -> None
         key = ec.generate_private_key(curve=ec.SECP256R1(), backend=default_backend())
         self._test_signature(key, dns.dnssec.Algorithm.ECDSAP256SHA256, abs_soa)
 
+    @unittest.skipUnless(have_deterministic, "deterministic ECDSA not available")
     def testDeterministicSignatureECDSAP256SHA256(self):  # type: () -> None
         key = ec.generate_private_key(curve=ec.SECP256R1(), backend=default_backend())
         inception = time.time()
@@ -1454,6 +1464,7 @@ class DNSSECSignatureTestCase(unittest.TestCase):
         )
         assert rrsigset1 != rrsigset2
 
+    @unittest.skipUnless(have_deterministic, "deterministic ECDSA not available")
     def testSignatureECDSAP384SHA384(self):  # type: () -> None
         key = ec.generate_private_key(curve=ec.SECP384R1(), backend=default_backend())
         self._test_signature(key, dns.dnssec.Algorithm.ECDSAP384SHA384, abs_soa)
index 8f6f9bd7e518eb615742b1b82f6ef43e9247334f..9982f0d143a909ca261cc713bdd9588c1c82e83b 100644 (file)
@@ -42,6 +42,20 @@ try:
 except ImportError:
     pass  # Cryptography ImportError already handled in dns.dnssec
 
+try:
+    from cryptography.hazmat.backends import default_backend
+except ImportError:
+    pass  # Cryptography ImportError already handled in dns.dnssec
+
+    def default_backend():
+        raise NotImplementedError
+
+
+if dns.dnssec._have_pyca:
+    have_deterministic = default_backend().ecdsa_deterministic_supported()
+else:
+    have_deterministic = False
+
 
 @unittest.skipUnless(dns.dnssec._have_pyca, "Python Cryptography cannot be imported")
 class DNSSECAlgorithm(unittest.TestCase):
@@ -92,6 +106,7 @@ class DNSSECAlgorithm(unittest.TestCase):
             k = PrivateDSA.generate(2048)
             k.sign(b"hello")
 
+    @unittest.skipUnless(have_deterministic, "deterministic ECDSA not available")
     def test_ecdsa(self):
         self._test_dnssec_alg(PrivateECDSAP256SHA256)
         self._test_dnssec_alg(PrivateECDSAP384SHA384)