Skip to content

Commit cdbdae2

Browse files
Ed25519 and Ed448 are supported under FIPS (#14616)
* Ed25519 and Ed448 are supported under FIPS Ed25519 and Ed448 signature schemes (both EdDSA) are FIPS approved. See section 7 of [FIPS 186-5][1]. [1]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf * Remove Ed25519 support test conditions * Appease flake * Remove support check from ed25519.py * Remove other ed25519_supported checks from tests * Add coverage for ed25519_supported() * Remove comments
1 parent 7bcd4e6 commit cdbdae2

File tree

12 files changed

+7
-177
lines changed

12 files changed

+7
-177
lines changed

src/cryptography/hazmat/backends/openssl/backend.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,9 @@ def mldsa_supported(self) -> bool:
276276
return rust_openssl.CRYPTOGRAPHY_IS_AWSLC
277277

278278
def ed25519_supported(self) -> bool:
279-
return not self._fips_enabled
279+
return True
280280

281281
def ed448_supported(self) -> bool:
282-
if self._fips_enabled:
283-
return False
284282
return (
285283
not rust_openssl.CRYPTOGRAPHY_IS_LIBRESSL
286284
and not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL

src/cryptography/hazmat/primitives/asymmetric/ed25519.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import abc
88

9-
from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
109
from cryptography.hazmat.bindings._rust import openssl as rust_openssl
1110
from cryptography.hazmat.primitives import _serialization
1211
from cryptography.utils import Buffer
@@ -15,14 +14,6 @@
1514
class Ed25519PublicKey(metaclass=abc.ABCMeta):
1615
@classmethod
1716
def from_public_bytes(cls, data: bytes) -> Ed25519PublicKey:
18-
from cryptography.hazmat.backends.openssl.backend import backend
19-
20-
if not backend.ed25519_supported():
21-
raise UnsupportedAlgorithm(
22-
"ed25519 is not supported by this version of OpenSSL.",
23-
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
24-
)
25-
2617
return rust_openssl.ed25519.from_public_bytes(data)
2718

2819
@abc.abstractmethod
@@ -73,26 +64,10 @@ def __deepcopy__(self, memo: dict) -> Ed25519PublicKey:
7364
class Ed25519PrivateKey(metaclass=abc.ABCMeta):
7465
@classmethod
7566
def generate(cls) -> Ed25519PrivateKey:
76-
from cryptography.hazmat.backends.openssl.backend import backend
77-
78-
if not backend.ed25519_supported():
79-
raise UnsupportedAlgorithm(
80-
"ed25519 is not supported by this version of OpenSSL.",
81-
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
82-
)
83-
8467
return rust_openssl.ed25519.generate_key()
8568

8669
@classmethod
8770
def from_private_bytes(cls, data: Buffer) -> Ed25519PrivateKey:
88-
from cryptography.hazmat.backends.openssl.backend import backend
89-
90-
if not backend.ed25519_supported():
91-
raise UnsupportedAlgorithm(
92-
"ed25519 is not supported by this version of OpenSSL.",
93-
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM,
94-
)
95-
9671
return rust_openssl.ed25519.from_private_bytes(data)
9772

9873
@abc.abstractmethod

tests/hazmat/primitives/test_ed25519.py

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010

1111
import pytest
1212

13-
from cryptography.exceptions import InvalidSignature, _Reasons
13+
from cryptography.exceptions import InvalidSignature
1414
from cryptography.hazmat.primitives import serialization
1515
from cryptography.hazmat.primitives.asymmetric.ed25519 import (
1616
Ed25519PrivateKey,
1717
Ed25519PublicKey,
1818
)
1919

2020
from ...doubles import DummyKeySerializationEncryption
21-
from ...utils import load_vectors_from_file, raises_unsupported_algorithm
21+
from ...utils import load_vectors_from_file
2222

2323

2424
def load_ed25519_vectors(vector_data):
@@ -45,31 +45,10 @@ def load_ed25519_vectors(vector_data):
4545
return data
4646

4747

48-
@pytest.mark.supported(
49-
only_if=lambda backend: not backend.ed25519_supported(),
50-
skip_message="Requires OpenSSL without Ed25519 support",
51-
)
52-
def test_ed25519_unsupported(backend):
53-
with raises_unsupported_algorithm(
54-
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM
55-
):
56-
Ed25519PublicKey.from_public_bytes(b"0" * 32)
57-
58-
with raises_unsupported_algorithm(
59-
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM
60-
):
61-
Ed25519PrivateKey.from_private_bytes(b"0" * 32)
62-
63-
with raises_unsupported_algorithm(
64-
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM
65-
):
66-
Ed25519PrivateKey.generate()
48+
def test_ed25519_always_supported(backend):
49+
assert backend.ed25519_supported()
6750

6851

69-
@pytest.mark.supported(
70-
only_if=lambda backend: backend.ed25519_supported(),
71-
skip_message="Requires OpenSSL with Ed25519 support",
72-
)
7352
class TestEd25519Signing:
7453
def test_sign_verify_input(self, backend, subtests):
7554
vectors = load_vectors_from_file(
@@ -292,10 +271,6 @@ def test_buffer_protocol(self, backend):
292271
)
293272

294273

295-
@pytest.mark.supported(
296-
only_if=lambda backend: backend.ed25519_supported(),
297-
skip_message="Requires OpenSSL with Ed25519 support",
298-
)
299274
def test_public_key_equality(backend):
300275
key_bytes = load_vectors_from_file(
301276
os.path.join("asymmetric", "Ed25519", "ed25519-pkcs8.der"),
@@ -313,10 +288,6 @@ def test_public_key_equality(backend):
313288
key1 < key2 # type: ignore[operator]
314289

315290

316-
@pytest.mark.supported(
317-
only_if=lambda backend: backend.ed25519_supported(),
318-
skip_message="Requires OpenSSL with Ed25519 support",
319-
)
320291
def test_public_key_copy(backend):
321292
key_bytes = load_vectors_from_file(
322293
os.path.join("asymmetric", "Ed25519", "ed25519-pkcs8.der"),
@@ -329,10 +300,6 @@ def test_public_key_copy(backend):
329300
assert key1 == key2
330301

331302

332-
@pytest.mark.supported(
333-
only_if=lambda backend: backend.ed25519_supported(),
334-
skip_message="Requires OpenSSL with Ed25519 support",
335-
)
336303
def test_public_key_deepcopy(backend):
337304
key_bytes = load_vectors_from_file(
338305
os.path.join("asymmetric", "Ed25519", "ed25519-pkcs8.der"),
@@ -345,10 +312,6 @@ def test_public_key_deepcopy(backend):
345312
assert key1 == key2
346313

347314

348-
@pytest.mark.supported(
349-
only_if=lambda backend: backend.ed25519_supported(),
350-
skip_message="Requires OpenSSL with Ed25519 support",
351-
)
352315
def test_private_key_copy(backend):
353316
key_bytes = load_vectors_from_file(
354317
os.path.join("asymmetric", "Ed25519", "ed25519-pkcs8.der"),
@@ -361,10 +324,6 @@ def test_private_key_copy(backend):
361324
assert key1 == key2
362325

363326

364-
@pytest.mark.supported(
365-
only_if=lambda backend: backend.ed25519_supported(),
366-
skip_message="Requires OpenSSL with Ed25519 support",
367-
)
368327
def test_private_key_deepcopy(backend):
369328
key_bytes = load_vectors_from_file(
370329
os.path.join("asymmetric", "Ed25519", "ed25519-pkcs8.der"),

tests/hazmat/primitives/test_pkcs12.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,10 +323,6 @@ class TestPKCS12Creation:
323323
ed25519.Ed25519PrivateKey.generate,
324324
ed25519.Ed25519PrivateKey,
325325
[],
326-
marks=pytest.mark.supported(
327-
only_if=lambda backend: backend.ed25519_supported(),
328-
skip_message="Requires OpenSSL with Ed25519 support",
329-
),
330326
),
331327
(rsa.generate_private_key, rsa.RSAPrivateKey, [65537, 1024]),
332328
(dsa.generate_private_key, dsa.DSAPrivateKey, [1024]),

tests/hazmat/primitives/test_pkcs7.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,6 @@ def test_not_a_cert(self, backend):
213213
hashes.SHA256(),
214214
)
215215

216-
@pytest.mark.supported(
217-
only_if=lambda backend: backend.ed25519_supported(),
218-
skip_message="Does not support ed25519.",
219-
)
220216
def test_unsupported_key_type(self, backend):
221217
cert, _ = _load_cert_key()
222218
key = ed25519.Ed25519PrivateKey.generate()

tests/hazmat/primitives/test_serialization.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,10 +1399,6 @@ def test_encryption_with_zero_length_password(self):
13991399
BestAvailableEncryption(b"")
14001400

14011401

1402-
@pytest.mark.supported(
1403-
only_if=lambda backend: backend.ed25519_supported(),
1404-
skip_message="Requires OpenSSL with Ed25519 support",
1405-
)
14061402
class TestEd25519Serialization:
14071403
def test_load_der_private_key(self, backend):
14081404
data = load_vectors_from_file(

tests/hazmat/primitives/test_ssh.py

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,6 @@ class TestOpenSSHSerialization:
6868
],
6969
)
7070
def test_load_ssh_public_key(self, key_file, cert_file, backend):
71-
if "ed25519" in key_file and not backend.ed25519_supported():
72-
pytest.skip("Requires OpenSSL with Ed25519 support")
73-
7471
# normal public key
7572
pub_data = load_vectors_from_file(
7673
os.path.join("asymmetric", "OpenSSH", key_file),
@@ -174,8 +171,6 @@ def run_partial_pubkey(self, pubdata, backend):
174171
],
175172
)
176173
def test_load_ssh_private_key(self, key_file, backend):
177-
if "ed25519" in key_file and not backend.ed25519_supported():
178-
pytest.skip("Requires OpenSSL with Ed25519 support")
179174
if "-psw" in key_file and not ssh._bcrypt_supported:
180175
pytest.skip("Requires bcrypt module")
181176

@@ -261,10 +256,6 @@ def test_load_ssh_private_key(self, key_file, backend):
261256
maxline = max(map(len, priv_data2.split(b"\n")))
262257
assert maxline < 80
263258

264-
@pytest.mark.supported(
265-
only_if=lambda backend: backend.ed25519_supported(),
266-
skip_message="Requires Ed25519 support",
267-
)
268259
@pytest.mark.parametrize(
269260
"key_file",
270261
[
@@ -281,10 +272,6 @@ def test_load_unsupported_ssh_private_key(self, key_file):
281272
with pytest.raises(UnsupportedAlgorithm):
282273
load_ssh_private_key(data, None)
283274

284-
@pytest.mark.supported(
285-
only_if=lambda backend: backend.ed25519_supported(),
286-
skip_message="Requires Ed25519 support",
287-
)
288275
@pytest.mark.supported(
289276
only_if=lambda backend: ssh._bcrypt_supported,
290277
skip_message="Requires that bcrypt exists",
@@ -304,10 +291,6 @@ def test_load_ssh_private_key_invalid_tag(self, backend):
304291
with pytest.raises(InvalidTag):
305292
load_ssh_private_key(priv_data, b"password")
306293

307-
@pytest.mark.supported(
308-
only_if=lambda backend: backend.ed25519_supported(),
309-
skip_message="Requires Ed25519 support",
310-
)
311294
@pytest.mark.supported(
312295
only_if=lambda backend: ssh._bcrypt_supported,
313296
skip_message="Requires that bcrypt exists",
@@ -1140,10 +1123,6 @@ def test_load_ssh_public_key_ecdsa_nist_p256_bad_curve_name(self, backend):
11401123
load_ssh_public_key(ssh_key, backend)
11411124

11421125

1143-
@pytest.mark.supported(
1144-
only_if=lambda backend: backend.ed25519_supported(),
1145-
skip_message="Requires OpenSSL with Ed25519 support",
1146-
)
11471126
class TestEd25519SSHSerialization:
11481127
def test_load_ssh_public_key(self, backend):
11491128
ssh_key = (
@@ -1186,10 +1165,6 @@ def test_load_ssh_public_key_trailing_data(self, backend):
11861165

11871166

11881167
class TestSSHCertificate:
1189-
@pytest.mark.supported(
1190-
only_if=lambda backend: backend.ed25519_supported(),
1191-
skip_message="Requires OpenSSL with Ed25519 support",
1192-
)
11931168
def test_loads_ssh_cert(self, backend):
11941169
# secp256r1 public key, ed25519 signing key
11951170
cert = load_ssh_public_identity(
@@ -1718,10 +1693,6 @@ def test_crit_opts_exts_lexically_sorted(self):
17181693
(b"zebra@cryptography.io", b""),
17191694
]
17201695

1721-
@pytest.mark.supported(
1722-
only_if=lambda backend: backend.ed25519_supported(),
1723-
skip_message="Requires OpenSSL with Ed25519 support",
1724-
)
17251696
def test_sign_ed25519(self, backend):
17261697
private_key = ed25519.Ed25519PrivateKey.generate()
17271698
builder = (
@@ -1818,10 +1789,6 @@ def test_sign_and_byte_compare_rsa(self, monkeypatch):
18181789
b"zbwL217Q93R08bJn1hDWuiTiaHGauSy2gPUI+cnkvlEocHM"
18191790
)
18201791

1821-
@pytest.mark.supported(
1822-
only_if=lambda backend: backend.ed25519_supported(),
1823-
skip_message="Requires OpenSSL with Ed25519 support",
1824-
)
18251792
def test_sign_and_byte_compare_ed25519(self, monkeypatch, backend):
18261793
# Monkey patch urandom to return a known value so we
18271794
# get a deterministic signature with Ed25519.
@@ -1911,10 +1878,7 @@ def test_ssh_key_fingerprint_rsa_sha256(self):
19111878
)
19121879

19131880
@pytest.mark.supported(
1914-
only_if=lambda backend: (
1915-
backend.hash_supported(hashes.MD5())
1916-
and backend.ed25519_supported()
1917-
),
1881+
only_if=lambda backend: backend.hash_supported(hashes.MD5()),
19181882
skip_message="Does not support MD5 or Ed25519",
19191883
)
19201884
def test_ssh_key_fingerprint_ed25519_md5(self):
@@ -1927,10 +1891,6 @@ def test_ssh_key_fingerprint_ed25519_md5(self):
19271891
fingerprint = ssh_key_fingerprint(public_key, hashes.MD5())
19281892
assert fingerprint == b"\xe5R=\x01\x9e\xa0\xc1\xe9\x8c?L|\xc5\x94W\x85"
19291893

1930-
@pytest.mark.supported(
1931-
only_if=lambda backend: backend.ed25519_supported(),
1932-
skip_message="Ed25519 not supported",
1933-
)
19341894
def test_ssh_key_fingerprint_ed25519_sha256(self):
19351895
ssh_key = load_vectors_from_file(
19361896
os.path.join("asymmetric", "OpenSSH", "ed25519-nopsw.key.pub"),

tests/wycheproof/test_eddsa.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
from .utils import wycheproof_tests
1414

1515

16-
@pytest.mark.supported(
17-
only_if=lambda backend: backend.ed25519_supported(),
18-
skip_message="Requires OpenSSL with Ed25519 support",
19-
)
2016
@wycheproof_tests("ed25519_test.json")
2117
def test_ed25519_signature(backend, wycheproof):
2218
# We want to fail if/when wycheproof adds more edwards curve tests

tests/x509/test_ocsp.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,10 +1638,6 @@ def test_unknown_response_status(self):
16381638

16391639

16401640
class TestOCSPEdDSA:
1641-
@pytest.mark.supported(
1642-
only_if=lambda backend: backend.ed25519_supported(),
1643-
skip_message="Requires OpenSSL with Ed25519 support / OCSP",
1644-
)
16451641
def test_invalid_algorithm(self, backend):
16461642
builder = ocsp.OCSPResponseBuilder()
16471643
cert, issuer = _cert_and_issuer()
@@ -1670,10 +1666,6 @@ def test_invalid_algorithm(self, backend):
16701666
with pytest.raises(ValueError):
16711667
builder.sign(private_key, hashes.SHA256())
16721668

1673-
@pytest.mark.supported(
1674-
only_if=lambda backend: backend.ed25519_supported(),
1675-
skip_message="Requires OpenSSL with Ed25519 support / OCSP",
1676-
)
16771669
def test_sign_ed25519(self, backend):
16781670
builder = ocsp.OCSPResponseBuilder()
16791671
cert, issuer = _cert_and_issuer()

0 commit comments

Comments
 (0)