New features
- New module
Crypto.PublicKey.MLDSA, for ML-DSA keys (FIPS 204).
It is based on the portable C code ofmldsa-native <https://github.com/pq-code-package/mldsa-native>_ (v2.0.0), with the Keccak code of PyCryptodome. On CPUs with AVX2 and BMI2, a version compiled for them and with 4-way SHA-3 is used: compared to the portable version, key generation and verification are 30-45% faster, signing 15-30%. - New module
Crypto.Signature.mldsa, for ML-DSA and HashML-DSA signatures (FIPS 204), hedged (default) or deterministic, with an optional context. The newMLDSAMuHashcomputes the message representative mu (external mu), to sign or verify a large message in pieces. - New function
digest()in the modules of the SHA-2 and SHA-3 hashes, to hash a whole message with a single call, likeCrypto.Hash.KangarooTwelve.digest(). For messages up to 1 KiB, it is 1.5x to 3.4x faster thannew()followed bydigest(). Crypto.IO.PKCS8.wrap()has a new parameterpublic_key, to create aOneAsymmetricKeyversion 2 (RFC 5958) with the fieldpublicKey.Crypto.IO.PKCS8.unwrap()returns anUnwrappedKey: still a tuple(oid, private_key, params),
with the same items as attributes, pluspublic_key(the fieldpublicKey, if present).- The scalar Keccak permutation (used by SHA-3, SHAKE, cSHAKE, KMAC, TupleHash, TurboSHAKE and KangarooTwelve) processes the state one plane at a time, two rounds per iteration, which needs fewer registers: SHA-3 and SHAKE are 5-10% faster.
Resolved issues
Crypto.PublicKey.ECC.import_key()checks that the fieldpublicKeyof a PKCS#8OneAsymmetricKeyversion 2 (RFC 5958), if present, matches the private key. Before, it was ignored.