diff --git a/Cargo.toml b/Cargo.toml index e45f6d6..2952118 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,8 @@ edition = "2021" [dependencies] tiny-keccak = { version = "2.0", features = ["shake"] } +aes = { version = "0.8.2" } +rand = { version = "0.8.5" } nalgebra = { version = "0.32.2", optional = true } [features] diff --git a/src/naive/mod.rs b/src/naive/mod.rs index 0dfcbb7..fb571c8 100644 --- a/src/naive/mod.rs +++ b/src/naive/mod.rs @@ -1,4 +1,7 @@ use crate::sig::KeyGen; +use aes::Aes128; +use rand::RngCore; +use tiny_keccak::{Shake, Xof}; pub struct SigParams { m: u16, @@ -10,12 +13,40 @@ pub struct SigParams { pk_seed_bytes: u8, } +// sk_seed_bytes = salt_bytes +// R_bytes = salt_bytes +// O_bytes = ceil((n - o)(o)/2) +// v_bytes = ceil((n - o)/2) +// P1_bytes = m*binom((n - o + 1), 2) / 2 +// P2_bytes = m * (n - o) * o / 2 +// P3_bytes = m * binom((o + 1), 2) / 2 +// L_bytes = m * (n - o) * o / 2 +// csk_bytes = salt_bytes +// esk_bytes = salt_bytes + O_bytes + P1_bytes + L_bytes +// cpk_bytes = pk_seed_bytes + P3_bytes +// epk_bytes = P1_bytes + P2_bytes + P3_bytes +// sig_bytes = ceil(nk / 2) + salt_bytes + pub struct SigningKey { v: VerifyKey, } pub struct VerifyKey {} -impl KeyGen for SigningKey { - fn gen(params: SigParams) -> Self {} +impl<'a> KeyGen<'a, SigParams> for SigningKey { + fn gen(params: SigParams, rand: &'a mut dyn RngCore) -> Self { + let sk_seed_bytes = params.salt_bytes as usize; + + // Pick seed_sk at random + let mut seed_sk: Vec = vec![0; sk_seed_bytes]; + rand.fill_bytes(&mut seed_sk); + + // Derive seed_pk and O from seed_sk + let mut shake = Shake::v256(); + let O_bytes = ((((params.n - params.o) as usize) * (params.o as usize)) + 1) / 2; + let mut S = vec![0; params.pk_seed_bytes as usize + O_bytes]; + shake.squeeze(&mut S); + + SigningKey { v: VerifyKey {} } + } } diff --git a/src/sig.rs b/src/sig.rs index 4627b7e..06165cd 100644 --- a/src/sig.rs +++ b/src/sig.rs @@ -1,5 +1,7 @@ -pub trait KeyGen

{ - fn gen(params: P) -> Self; +use rand::RngCore; + +pub trait KeyGen<'a, P> { + fn gen(params: P, rand: &'a mut dyn RngCore) -> Self; } pub trait Signer {