From 8f288877147314161efe137a8037a3bc5e34bd2b Mon Sep 17 00:00:00 2001 From: Michael Rosenberg Date: Sun, 21 Aug 2022 04:13:02 -0400 Subject: [PATCH] Added generation from seeds --- Cargo.toml | 1 + src/gen.rs | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 103 ++++++++++++++++---------- 3 files changed, 276 insertions(+), 36 deletions(-) create mode 100644 src/gen.rs diff --git a/Cargo.toml b/Cargo.toml index 28e2fed..735976e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +rand_chacha = "0.3" rand_core = "0.6" digest = "0.10" serde = "1" diff --git a/src/gen.rs b/src/gen.rs new file mode 100644 index 0000000..faefff3 --- /dev/null +++ b/src/gen.rs @@ -0,0 +1,208 @@ +use crate::{Label, NotaryLabelTree, UserLabelTree}; + +use alloc::vec::Vec; + +use digest::Digest; +use rand_chacha::ChaCha20Rng; +use rand_core::{CryptoRng, RngCore, SeedableRng}; +use serde::{Deserialize as SerdeDeserialize, Serialize as SerdeSerialize}; + +// The psuedorandom generator we use for all label and randomness generation +type Prg = ChaCha20Rng; +// The seed type of `Prg` +type Seed = ::Seed; + +/// A seed used by the Notary to generate random labels +#[derive(Copy, Clone, SerdeSerialize, SerdeDeserialize)] +pub struct LabelSeed(Seed); + +/// A seed used by the User to generate random label blinders +#[derive(Copy, Clone, SerdeSerialize, SerdeDeserialize)] +pub struct LabelRandomnessSeed(Seed); + +impl LabelSeed { + /// Generates a random seed for label generation + pub fn new(mut rng: R) -> LabelSeed { + let mut seed = Seed::default(); + rng.fill_bytes(&mut seed); + + LabelSeed(seed) + } + + /// Generates a pseudorandom label set for the given number of bits. The labels are ordered as + /// `[label1bit0, label1bit1, label2bit0, label2bit1, ...]`. That is, the output length is `2 * + /// num_bits`. + pub fn gen_notary_labels(&self, num_bits: usize) -> Vec