From 710ac6fba9d7f56130ad48e915a1ab02f14a77a2 Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Tue, 3 Dec 2019 19:54:31 -0800 Subject: [PATCH] Add an hash-to-scalar implementation. --- src/hash.rs | 30 ++++++++++++++++++++++++++++++ src/lib.rs | 4 ++++ 2 files changed, 34 insertions(+) create mode 100644 src/hash.rs diff --git a/src/hash.rs b/src/hash.rs new file mode 100644 index 0000000..2492322 --- /dev/null +++ b/src/hash.rs @@ -0,0 +1,30 @@ +use blake2b_simd::{Params, State}; + +use crate::Scalar; + +/// Provides H^star, the hash-to-scalar function used by RedJubjub. +pub struct HStar { + state: State, +} + +impl Default for HStar { + fn default() -> Self { + let state = Params::new() + .hash_length(64) + .personal(b"Zcash_RedJubjubH") + .to_state(); + Self { state } + } +} + +impl HStar { + /// Add `data` to the hash. + pub fn update(&mut self, data: &[u8]) { + self.state.update(data); + } + + /// Consume `self` to compute the hash output. + pub fn finalize(mut self) -> Scalar { + Scalar::from_bytes_wide(self.state.finalize().as_array()) + } +} diff --git a/src/lib.rs b/src/lib.rs index a2d2e0b..ec359c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,6 +6,7 @@ mod constants; mod error; +mod hash; mod public_key; mod secret_key; mod signature; @@ -14,8 +15,11 @@ mod signature; pub type Randomizer = jubjub::Fr; /// A better name than Fr. +// XXX-jubjub: upstream this name type Scalar = jubjub::Fr; +use hash::HStar; + pub use error::Error; pub use public_key::{PublicKey, PublicKeyBytes}; pub use secret_key::SecretKey;