@@ -37,14 +37,14 @@ use zeroize::{Zeroize, ZeroizeOnDrop};
3737#[ derive( Clone ) ]
3838pub struct SigningKey < P : MlDsaParams > {
3939 /// The expanded form of the signing key.
40- expanded_key : ExpandedSigningKey < P > ,
40+ expanded_key : MaybeBox < ExpandedSigningKey < P > > ,
4141
4242 /// The seed this signing key was derived from
43- seed : Seed ,
43+ seed : MaybeBox < Seed > ,
4444}
4545
4646impl < P : MlDsaParams > SigningKey < P > {
47- /// Deterministically generate a signing key pair from the specified seed
47+ /// Deterministically generate a signing key pair from the specified [`Seed`].
4848 ///
4949 /// This method reflects the `ML-DSA.KeyGen_internal` algorithm from FIPS 204 (Algorithm 6).
5050 #[ must_use]
@@ -76,8 +76,8 @@ impl<P: MlDsaParams> SigningKey<P> {
7676 let signing_key = ExpandedSigningKey :: new ( rho, K , tr, s1, s2, t0, A_hat ) ;
7777
7878 SigningKey {
79- expanded_key : signing_key,
80- seed : xi. clone ( ) ,
79+ expanded_key : MaybeBox :: new ( signing_key) ,
80+ seed : MaybeBox :: new ( xi. clone ( ) ) ,
8181 }
8282 }
8383
@@ -90,12 +90,14 @@ impl<P: MlDsaParams> SigningKey<P> {
9090 /// This value is key material. Please treat it with care.
9191 /// </div>
9292 #[ inline]
93+ #[ must_use]
9394 pub fn to_seed ( & self ) -> Seed {
94- self . seed
95+ * self . seed
9596 }
9697
9798 /// The expanded form of the signing key.
9899 #[ doc( hidden) ]
100+ #[ must_use]
99101 pub fn expanded_key ( & self ) -> & ExpandedSigningKey < P > {
100102 & self . expanded_key
101103 }
@@ -180,6 +182,17 @@ impl<P: MlDsaParams> CtEq for SigningKey<P> {
180182 }
181183}
182184
185+ impl < P : MlDsaParams > Drop for SigningKey < P > {
186+ fn drop ( & mut self ) {
187+ // NOTE: `expanded_key` has its own zeroizing `Drop` impl so we just need to clear `seed`
188+ #[ cfg( feature = "zeroize" ) ]
189+ self . seed . zeroize ( ) ;
190+ }
191+ }
192+
193+ #[ cfg( feature = "zeroize" ) ]
194+ impl < P : MlDsaParams > ZeroizeOnDrop for SigningKey < P > { }
195+
183196/// An ML-DSA signing key
184197#[ derive( Clone ) ]
185198pub struct ExpandedSigningKey < P : MlDsaParams > {
@@ -239,14 +252,15 @@ impl<P: MlDsaParams> ExpandedSigningKey<P> {
239252 Self :: new ( rho, K , tr, s1, s2, t0, A_hat )
240253 }
241254
242- /// Deterministically generate a signing key from the specified seed.
255+ /// Deterministically generate an expanded signing key from the specified seed.
243256 ///
244257 /// This method reflects the ML-DSA.KeyGen_internal algorithm from FIPS 204, but only returns a
245258 /// signing key.
246259 #[ must_use]
260+ #[ inline]
247261 pub fn from_seed ( seed : & Seed ) -> Self {
248262 let kp = SigningKey :: from_seed ( seed) ;
249- kp. expanded_key
263+ ( * kp. expanded_key ) . clone ( )
250264 }
251265
252266 /// This method reflects the ML-DSA.Sign_internal algorithm from FIPS 204. It does not
@@ -590,18 +604,20 @@ impl<P: MlDsaParams> fmt::Debug for ExpandedSigningKey<P> {
590604 }
591605}
592606
593- #[ cfg( feature = "zeroize" ) ]
594607impl < P : MlDsaParams > Drop for ExpandedSigningKey < P > {
595608 fn drop ( & mut self ) {
596- self . rho . zeroize ( ) ;
597- self . K . zeroize ( ) ;
598- self . tr . zeroize ( ) ;
599- self . s1 . zeroize ( ) ;
600- self . s2 . zeroize ( ) ;
601- self . t0 . zeroize ( ) ;
602- self . s1_hat . zeroize ( ) ;
603- self . s2_hat . zeroize ( ) ;
604- self . t0_hat . zeroize ( ) ;
609+ #[ cfg( feature = "zeroize" ) ]
610+ {
611+ self . rho . zeroize ( ) ;
612+ self . K . zeroize ( ) ;
613+ self . tr . zeroize ( ) ;
614+ self . s1 . zeroize ( ) ;
615+ self . s2 . zeroize ( ) ;
616+ self . t0 . zeroize ( ) ;
617+ self . s1_hat . zeroize ( ) ;
618+ self . s2_hat . zeroize ( ) ;
619+ self . t0_hat . zeroize ( ) ;
620+ }
605621 }
606622}
607623
0 commit comments