Skip to content

Commit c3ded0c

Browse files
authored
ml-dsa: use MaybeBox for SigningKey (#1345)
Opportunistically stores the parts of `SigningKey` on the heap when the `alloc` feature is enabled, similar to what #1344 did for `VerifyingKey`. This also addresses #1308 by adding a `Drop` (and `ZeroizeOnDrop`) impl to `SigningKey` which clears the `Seed`.
1 parent 7336ca4 commit c3ded0c

1 file changed

Lines changed: 34 additions & 18 deletions

File tree

ml-dsa/src/signing.rs

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ use zeroize::{Zeroize, ZeroizeOnDrop};
3737
#[derive(Clone)]
3838
pub 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

4646
impl<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)]
185198
pub 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")]
594607
impl<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

Comments
 (0)