Prechádzať zdrojové kódy

add schnorr signature classes

narodnik 5 rokov pred
rodič
commit
a8b498dfee
3 zmenil súbory, kde vykonal 42 pridanie a 14 odobranie
  1. 0 1
      src/crypto/diffie_hellman.rs
  2. 42 12
      src/crypto/schnorr.rs
  3. 0 1
      src/crypto/util.rs

+ 0 - 1
src/crypto/diffie_hellman.rs

@@ -29,4 +29,3 @@ fn kdf_sapling(dhsecret: jubjub::SubgroupPoint, epk: &jubjub::ExtendedPoint) ->
         .update(&epk.to_bytes())
         .update(&epk.to_bytes())
         .finalize()
         .finalize()
 }
 }
-

+ 42 - 12
src/crypto/schnorr.rs

@@ -4,22 +4,52 @@ use rand::rngs::OsRng;
 
 
 use super::util::hash_to_scalar;
 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;
+pub struct SecretKey(pub jubjub::Fr);
+
+impl SecretKey {
+    pub fn random() -> Self {
+        Self(jubjub::Fr::random(&mut OsRng))
+    }
+
+    pub fn sign(&self, message: &[u8]) -> Signature {
+        let mask = jubjub::Fr::random(&mut OsRng);
+        let commit = zcash_primitives::constants::SPENDING_KEY_GENERATOR * mask;
+
+        let challenge = hash_to_scalar(b"DarkFi_Schnorr", &commit.to_bytes(), message);
+
+        let response = mask + challenge * self.0;
 
 
-    let mask = jubjub::Fr::random(&mut OsRng);
-    let commit = zcash_primitives::constants::SPENDING_KEY_GENERATOR * mask;
+        Signature { commit, response }
+    }
 
 
-    let msg = b"Foo bar";
-    let challenge = hash_to_scalar(b"DarkFi_Schnorr", &commit.to_bytes(), &msg[..]);
+    pub fn public_key(&self) -> PublicKey {
+        let public = zcash_primitives::constants::SPENDING_KEY_GENERATOR * self.0;
+        PublicKey(public)
+    }
+}
+
+pub struct PublicKey(pub jubjub::SubgroupPoint);
 
 
-    let response = mask + challenge * secret;
+pub struct Signature {
+    commit: jubjub::SubgroupPoint,
+    response: jubjub::Fr,
+}
 
 
-    // Verify signature
+impl PublicKey {
+    pub fn verify(&self, message: &[u8], signature: &Signature) -> bool {
+        let challenge = hash_to_scalar(b"DarkFi_Schnorr", &signature.commit.to_bytes(), message);
+        zcash_primitives::constants::SPENDING_KEY_GENERATOR * signature.response
+            - self.0 * challenge
+            == signature.commit
+    }
+}
 
 
-    assert_eq!(
-        zcash_primitives::constants::SPENDING_KEY_GENERATOR * response - public * challenge, commit);
+#[test]
+fn test_schnorr() {
+    let secret = SecretKey::random();
+    let message = b"Foo bar";
+    let signature = secret.sign(&message[..]);
+    let public = secret.public_key();
+    assert!(public.verify(&message[..], &signature));
 }
 }
 
 

+ 0 - 1
src/crypto/util.rs

@@ -7,4 +7,3 @@ pub fn hash_to_scalar(persona: &[u8], a: &[u8], b: &[u8]) -> jubjub::Fr {
     let ret = hasher.finalize();
     let ret = hasher.finalize();
     jubjub::Fr::from_bytes_wide(ret.as_array())
     jubjub::Fr::from_bytes_wide(ret.as_array())
 }
 }
-