Adding NISTDSA API to support ML-DSA-44 and ML-DSA-87 #1948
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Issues:
Resolves #CryptoAlg-2725
Description of changes:
This is a sizable PR, I've worked extremely hard to keep the size down in a single PR, but with ML-DSA touching X.509, PKEY, ASN1, there are a lot of changes that need to happen simultaneously to preserve library functionality, so I will document this PR well. Although it appears we touch many files, a lot of them are from renaming/restructuring the code, as well as removing most traces of Dilithium from documentation and replacing it with ML-DSA or more generic alternatives.
1. PKEY structure changes
This PR adds ML-DSA-44 and ML-DSA-87 to AWS-LC. Before this PR AWS-LC only supported ML-DSA-65, as such, we were utilizing the
void *ptr
ofevp_pkey_st
, rather than a distinct structure for ML-DSA.This PR introduces the new structure
NISTDSA_KEY * nistdsa_key;
insideevp_pkey_st
to support ML-DSA and any additional FIPS digital signature algorithms provided by NIST, should AWS-LC wish to include them in the library.While the structure
DSA
already exists it does not provide support for FIPS-like signature APIs (see more at NIST api conventions.As, such,
NISTDSA_KEY
utilizes a new structure to hold public/secret keys, as well as aNISTDSA
struct which defines signature algorithm specific information:This allows us to use a single PKEY structure for all NIST FIPS signature algorithms, much like the existing PKEY struct
KEM_KEY *kem_key
for KEMS. As a consequence, we are now able to define signature methods such as:much like the existing kem.c file.
These structures will be incredibly useful for subsequent PRs, in which we will be adding de-randomized APIs to support FIPS validation and KATs from seeds. In effect, we will be extending the method to include:
The directory
nistdsa/p_nistdsa.c
is used to house genericPKEY
operations, as well as NISTDSA specific EVP functions such asEVP_PKEY_nistdsa_set_params
,EVP_PKEY_nistdsa_set_params
, which work in a similar way to p_kem.c functionsEVP_PKEY_CTX_kem_set_params
andEVP_PKEY_kem_set_params
.The directory
evp_extra/p_nistdsa_asn1.c
is used to house genericasn.1
operations for NIST FIPS DSA algorithms.2. OID changes
We now have real OIDs available from https://csrc.nist.gov/projects/computer-security-objects-register/algorithm-registration. These have been added to the
obj
files and automatically populated bygo run objects.go
. We include the following NIDs for ML-DSA:and a "top-level" NID
EVP_PKEY_NISTDSA
(similar to EVP_PKEY_KEM to subset all NIST FIPS DSA algorithms. Much like for the KEM API, we include functionsSIG_find_dsa_by_nid(int nid)
to return actual algorithm specific methods.3. Testing structure changes
Prior to this PR all testing for ML-DSA-65 was done as a series of g-tests. As we now have the ability to get algorithm/security level specific parameters from the
NISTDSA
struct, I have overhauled the testing suite to be parameterized over the currently supported signature algorithms:For each of the above parameter sets we run:
4. X.509 changes
Changes to X.509 code have been minimized to only the required changes to support this PR. This is already a big PR and I want to avoid expansion wherever possible. For X.509 the changes predominantly are regarding the change of NIDs from the old Dilithium NIDs to the new NIST DSA NIDs/OIDs.
As the OIDs changed, so too much the test certificates
kDilithium3Cert
,kDilithium3CertNull
, andkDilithium3CertParam
. These have been regenerated using the following:5. File structure changes
To support the new API, and to maintain code consistency between ML-KEM and ML-DSA and the KEM/DSA API we have moved all ML_DSA specific code to the directory
crypto/ml_dsa
and all generic NISTDSA code tocrypto/nistdsa
.Callouts:
dilithium/p_dilithium3.c
->nistdsa/p_nistdsa.c
all dilithium3 pkey specific functionality is now genericdilithium/p_dilithium3_asn1.c
->evp_extra/p_nistdsa_asn1.c
all dilithium3 asn1 specific functionality is now genericdilithium/p_dilithium_test.cc
->ml_dsa/mldsa_test.cc
all dilithium3 testing specific functionality is now genericdilithium/sig_dilithium.h
->ml_dsa/ml_dsa.h
to match consistency withml_kem.h
dilithium/sig_diltihium3.c
->ml_dsa/ml_dsa.c
to match consistency withml_kem.c
nistdsa/internal.h
is a new file, added to maintain consistency withfipsmodule/kem/internal.h
Testing:
See above for description of changes to testing framework.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license and the ISC license.