diff --git a/src/sign/ml_dsa_65.rs b/src/sign/ml_dsa_65.rs index 09af1a3..c424dd8 100644 --- a/src/sign/ml_dsa_65.rs +++ b/src/sign/ml_dsa_65.rs @@ -10,15 +10,17 @@ const L: usize = params::ml_dsa_65::L; /// * 'sk' - preallocated buffer for private key /// * 'seed' - optional seed; if None [random_bytes()] is used for randomness generation pub fn keypair(pk: &mut [u8], sk: &mut [u8], seed: Option<&[u8]>) { - let mut init_seed = [0u8; params::SEEDBYTES]; + let mut init_seed = [0u8; params::SEEDBYTES+2]; match seed { - Some(x) => init_seed.copy_from_slice(x), - None => crate::random_bytes(&mut init_seed, params::SEEDBYTES) + Some(x) => init_seed[..params::SEEDBYTES].copy_from_slice(x), + None => crate::random_bytes(&mut init_seed, params::SEEDBYTES), }; - + init_seed[params::SEEDBYTES] = K as u8; + init_seed[params::SEEDBYTES+1] = L as u8; + const SEEDBUF_LEN: usize = 2 * params::SEEDBYTES + params::CRHBYTES; let mut seedbuf = [0u8; SEEDBUF_LEN]; - fips202::shake256(&mut seedbuf, SEEDBUF_LEN, &init_seed, params::SEEDBYTES); + fips202::shake256(&mut seedbuf, SEEDBUF_LEN, &init_seed, params::SEEDBYTES+2); let mut rho = [0u8; params::SEEDBYTES]; rho.copy_from_slice(&seedbuf[..params::SEEDBYTES]); diff --git a/src/sign/ml_dsa_87.rs b/src/sign/ml_dsa_87.rs index eea5088..0518470 100644 --- a/src/sign/ml_dsa_87.rs +++ b/src/sign/ml_dsa_87.rs @@ -10,15 +10,17 @@ const L: usize = params::ml_dsa_87::L; /// * 'sk' - preallocated buffer for private key /// * 'seed' - optional seed; if None [random_bytes()] is used for randomness generation pub fn keypair(pk: &mut [u8], sk: &mut [u8], seed: Option<&[u8]>) { - let mut init_seed = [0u8; params::SEEDBYTES]; + let mut init_seed = [0u8; params::SEEDBYTES+2]; match seed { - Some(x) => init_seed.copy_from_slice(x), - None => crate::random_bytes(&mut init_seed, params::SEEDBYTES) + Some(x) => init_seed[..params::SEEDBYTES].copy_from_slice(x), + None => crate::random_bytes(&mut init_seed, params::SEEDBYTES), }; + init_seed[params::SEEDBYTES] = K as u8; + init_seed[params::SEEDBYTES+1] = L as u8; const SEEDBUF_LEN: usize = 2 * params::SEEDBYTES + params::CRHBYTES; let mut seedbuf = [0u8; SEEDBUF_LEN]; - fips202::shake256(&mut seedbuf, SEEDBUF_LEN, &init_seed, params::SEEDBYTES); + fips202::shake256(&mut seedbuf, SEEDBUF_LEN, &init_seed, params::SEEDBYTES+2); let mut rho = [0u8; params::SEEDBYTES]; rho.copy_from_slice(&seedbuf[..params::SEEDBYTES]);