Import identity.rs from semaphore-rs

This commit is contained in:
Oskar Thoren 2022-03-15 17:30:44 +08:00
parent 751fd22951
commit b2a301a967
No known key found for this signature in database
GPG Key ID: B2ECCFD3BC2EF77E
1 changed files with 64 additions and 0 deletions

64
rln/src/identity.rs Normal file
View File

@ -0,0 +1,64 @@
use num_bigint::{BigInt, Sign};
use once_cell::sync::Lazy;
use poseidon_rs::Poseidon;
use sha2::{Digest, Sha256};
use crate::util::{bigint_to_fr, fr_to_bigint};
// Adapted from
// https://github.com/worldcoin/semaphore-rs/blob/main/src/identity.rs
static POSEIDON: Lazy<Poseidon> = Lazy::new(Poseidon::new);
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Identity {
pub trapdoor: BigInt,
pub nullifier: BigInt,
}
// todo: improve
fn sha(msg: &[u8]) -> [u8; 32] {
let mut hasher = Sha256::new();
hasher.update(msg);
let result = hasher.finalize();
let res: [u8; 32] = result.into();
res
}
impl Identity {
pub fn new(seed: &[u8]) -> Self {
let seed_hash = &sha(seed);
// https://github.com/appliedzkp/zk-kit/blob/1ea410456fc2b95877efa7c671bc390ffbfb5d36/packages/identity/src/identity.ts#L58
let trapdoor = BigInt::from_bytes_be(
Sign::Plus,
&sha(format!("{}identity_trapdoor", hex::encode(seed_hash)).as_bytes()),
);
let nullifier = BigInt::from_bytes_be(
Sign::Plus,
&sha(format!("{}identity_nullifier", hex::encode(seed_hash)).as_bytes()),
);
Self {
trapdoor,
nullifier,
}
}
pub fn secret_hash(&self) -> BigInt {
let res = POSEIDON
.hash(vec![
bigint_to_fr(&self.nullifier),
bigint_to_fr(&self.trapdoor),
])
.unwrap();
fr_to_bigint(res)
}
pub fn commitment(&self) -> BigInt {
let res = POSEIDON
.hash(vec![bigint_to_fr(&self.secret_hash())])
.unwrap();
fr_to_bigint(res)
}
}