@@ -24,12 +24,24 @@ pub struct PrivateKeyInfo<'a> {
2424
2525// RFC 9881 Section 6.5
2626#[ cfg( CRYPTOGRAPHY_IS_AWSLC ) ]
27- // NO-COVERAGE-START
2827#[ derive( asn1:: Asn1Read , asn1:: Asn1Write ) ]
29- // NO-COVERAGE-END
30- pub enum MlDsaPrivateKey < ' a > {
28+ pub enum MlDsaPrivateKey {
3129 #[ implicit( 0 ) ]
32- Seed ( & ' a [ u8 ] ) ,
30+ Seed ( [ u8 ; 32 ] ) ,
31+ }
32+
33+ /// Extract the 32-byte ML-DSA-65 seed from a private key.
34+ ///
35+ /// AWS-LC's `raw_private_key()` returns the expanded key, not the seed.
36+ /// This function round-trips through the native PKCS#8 encoding to extract it.
37+ /// https://github.com/aws/aws-lc/issues/3072
38+ #[ cfg( CRYPTOGRAPHY_IS_AWSLC ) ]
39+ pub fn mldsa_seed_from_pkey (
40+ pkey : & openssl:: pkey:: PKeyRef < openssl:: pkey:: Private > ,
41+ ) -> Result < MlDsaPrivateKey , openssl:: error:: ErrorStack > {
42+ let pkcs8_der = pkey. private_key_to_pkcs8 ( ) ?;
43+ let pki = asn1:: parse_single :: < PrivateKeyInfo < ' _ > > ( & pkcs8_der) . unwrap ( ) ;
44+ Ok ( asn1:: parse_single :: < MlDsaPrivateKey > ( pki. private_key ) . unwrap ( ) )
3345}
3446
3547pub fn parse_private_key (
@@ -120,9 +132,8 @@ pub fn parse_private_key(
120132
121133 #[ cfg( CRYPTOGRAPHY_IS_AWSLC ) ]
122134 AlgorithmParameters :: MlDsa65 => {
123- let MlDsaPrivateKey :: Seed ( seed) =
124- asn1:: parse_single :: < MlDsaPrivateKey < ' _ > > ( k. private_key ) ?;
125- Ok ( cryptography_openssl:: mldsa:: new_raw_private_key ( seed) ?)
135+ let MlDsaPrivateKey :: Seed ( seed) = asn1:: parse_single :: < MlDsaPrivateKey > ( k. private_key ) ?;
136+ Ok ( cryptography_openssl:: mldsa:: new_raw_private_key ( & seed) ?)
126137 }
127138
128139 _ => Err ( KeyParsingError :: UnsupportedKeyType (
@@ -462,8 +473,7 @@ pub fn serialize_private_key(
462473 }
463474 #[ cfg( CRYPTOGRAPHY_IS_AWSLC ) ]
464475 cryptography_openssl:: mldsa:: PKEY_ID => {
465- let seed = pkey. raw_private_key ( ) ?;
466- let private_key_der = asn1:: write_single ( & MlDsaPrivateKey :: Seed ( seed. as_slice ( ) ) ) ?;
476+ let private_key_der = asn1:: write_single ( & mldsa_seed_from_pkey ( pkey) ?) ?;
467477 ( AlgorithmParameters :: MlDsa65 , private_key_der)
468478 }
469479 _ => {
0 commit comments