-
Notifications
You must be signed in to change notification settings - Fork 123
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
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #2194 +/- ##
==========================================
- Coverage 79.06% 79.04% -0.03%
==========================================
Files 612 612
Lines 106483 106512 +29
Branches 15050 15052 +2
==========================================
- Hits 84192 84189 -3
- Misses 21639 21669 +30
- Partials 652 654 +2 ☔ 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. |
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.Modified ASN.1 method signatures to include
oid
parameter for better format handlingTesting:
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.