From c9efd1a9ca6286167f048ed2625b4fd3116dfaaf Mon Sep 17 00:00:00 2001 From: narodnik Date: Mon, 3 May 2021 18:11:37 +0200 Subject: [PATCH] added basic code for schnorr signatures --- src/crypto/mod.rs | 2 ++ src/crypto/schnorr.rs | 25 +++++++++++++++++++++++++ src/crypto/util.rs | 10 ++++++++++ 3 files changed, 37 insertions(+) create mode 100644 src/crypto/schnorr.rs create mode 100644 src/crypto/util.rs diff --git a/src/crypto/mod.rs b/src/crypto/mod.rs index eea56e436..781595336 100644 --- a/src/crypto/mod.rs +++ b/src/crypto/mod.rs @@ -1,6 +1,8 @@ pub mod diffie_hellman; pub mod mint_proof; +pub mod schnorr; pub mod spend_proof; +pub mod util; use bellman::groth16; use bls12_381::Bls12; diff --git a/src/crypto/schnorr.rs b/src/crypto/schnorr.rs new file mode 100644 index 000000000..ff81e505e --- /dev/null +++ b/src/crypto/schnorr.rs @@ -0,0 +1,25 @@ +use ff::Field; +use group::{Group, GroupEncoding}; +use rand::rngs::OsRng; + +use super::util::hash_to_scalar; + +#[test] +fn test_schnorr() { + let secret = jubjub::Fr::random(&mut OsRng); + let public = zcash_primitives::constants::SPENDING_KEY_GENERATOR * secret; + + let mask = jubjub::Fr::random(&mut OsRng); + let commit = zcash_primitives::constants::SPENDING_KEY_GENERATOR * mask; + + let msg = b"Foo bar"; + let challenge = hash_to_scalar(b"DarkFi_Schnorr", &commit.to_bytes(), &msg[..]); + + let response = mask + challenge * secret; + + // Verify signature + + assert_eq!( + zcash_primitives::constants::SPENDING_KEY_GENERATOR * response - public * challenge, commit); +} + diff --git a/src/crypto/util.rs b/src/crypto/util.rs new file mode 100644 index 000000000..683a8a535 --- /dev/null +++ b/src/crypto/util.rs @@ -0,0 +1,10 @@ +use blake2b_simd::Params; + +pub fn hash_to_scalar(persona: &[u8], a: &[u8], b: &[u8]) -> jubjub::Fr { + let mut hasher = Params::new().hash_length(64).personal(persona).to_state(); + hasher.update(a); + hasher.update(b); + let ret = hasher.finalize(); + jubjub::Fr::from_bytes_wide(ret.as_array()) +} +