-
Notifications
You must be signed in to change notification settings - Fork 122
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support to export ML-DSA key-pairs in seed format #2194
base: main
Are you sure you want to change the base?
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #2194 +/- ##
==========================================
- Coverage 79.06% 79.06% -0.01%
==========================================
Files 612 612
Lines 106476 106500 +24
Branches 15050 15052 +2
==========================================
+ Hits 84190 84208 +18
- Misses 21632 21641 +9
+ Partials 654 651 -3 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Have we just considered exposing access to the opaque PQDSA_KEY
type stored in the EVP and then having more proper access functions like get_private_key_seed etc using that type? I'm not a big fan of the "raw" key meaning on EVP because it differs based on the key types, and now can very on the size dimension which seems really goofy.
Agreed, thank you for the feedback. I've updated the implementation (c307952) so that |
@jakemas -- what happens if we parse a private key in "expanded" form, then try to extract the seed? It seems to me this should fail. |
Okay, after offline conversation we decided to align with the draft spec RFC and encode private ML-DSA keys as 32 byte seeds. As such, we leave I have removed the utility function |
e550280
crypto/evp_extra/p_pqdsa_asn1.c
Outdated
return PQDSA_KEY_set_raw_keypair_from_seed(out->pkey.pqdsa_key, &seed); | ||
} else if (CBS_peek_asn1_tag(key, CBS_ASN1_OCTETSTRING)) { | ||
// Case 2: expandedKey OCTET STRING | ||
if (CBS_len(key) == out->pkey.pqdsa_key->pqdsa->keygen_seed_len) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should still need to peek to see that it is a CBS_ASN1_OCTETSTRING
type and then specifically get that asn1 type.
Issues:
Resolves #CryptoAlg-2918
#ACCP-130
Description of changes:
Support the ability to export ML-DSA key seeds. We modify the core algorithm implementation to store the
seed
used during key generation. This will allow the key pair to be reconstructed at a later stage from just the seed.This is performed within
ml_dsa_keypair
, which has been modified to accept an addition argumentseed
that is a pointer to output array ofML_DSA_SEEDBYTES
bytes.These changes bubble up to the
ml_dsa.c
definitions of keygen, that are now modified to support the provided buffer to store the seed:We store the seed in the
PQDSA_KEY
struct duringpkey_pqdsa_keygen
:API Changes
This PR modifies the ASN.1 encoding function for
PQDSA
keys. The functionpqdsa_priv_encode
now encodes the associatedpqdsa->key->seed
. As such the EVP APIEVP_marshal_private_key
will export the private seed. This has been noted in documentation.Performance Impact
Converting to seed-based storage for both public and private keys yields the following improvements:
Converting to seed-based storage for private keys yields the following improvements:
The proposed seed-based approach achieves an average storage reduction of 99.4% across all ML-DSA variants.
Call-outs:
FIPS Compliance: I'm glad you're asking, yes this is compliant with FIPS, NIST have published PQC FAQs specifically to address this exact implementation: https://csrc.nist.gov/Projects/post-quantum-cryptography/faqs#Rdc7.
3692f72 implemented
PQDSA_KEY_get_priv_raw_seed
if it is needed in future.Testing:
Added a failure mode test to
ParsePrivateKey
for the case that a key does not have an associatedseed
.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.