pedersen_hash_function/
lib.rs

1use mathematics::extended_euclidean_algorithm;
2
3
4/// Computes the pedersen hash of given inputs and a cyclic group.
5///
6/// # Examples
7///
8/// ```
9/// use pedersen_hash_function::pedersen_hash_function;
10/// let x = 1;
11/// let y = 2;
12/// let cyclic_group = 5;
13/// let pedersen_hash = pedersen_hash_function(x ,y, 0, cyclic_group);
14///
15/// assert_eq!(pedersen_hash,3);
16/// 
17///  
18/// ```
19/// ```
20/// use pedersen_hash_function::pedersen_hash_function;
21/// let x = 3;
22/// let y = 7;
23/// let z = 11;
24/// let cyclic_group = 13;
25/// let pedersen_hash = pedersen_hash_function(x ,y, z, cyclic_group);
26///
27/// assert_eq!(pedersen_hash,8);
28/// 
29///  
30/// ```
31pub fn pedersen_hash_function(x:u64, y:u64, z: u64, mod_num:u64) -> u64{
32  let generators = natural_numbers_generators(mod_num);
33  let mut h = 1;
34  let mut input: Vec<u64> = Vec::new();
35  input.push(x);
36  input.push(y);
37  if z != 0{
38  input.push(z);
39  }
40  loop{
41  for (index, item) in input.clone().into_iter().enumerate(){ 
42    let generator = generators.get(index).unwrap_or(&0);
43        let hash = generator.pow(item as u32) ;
44        h *= hash ;            
45  }
46  if generators.len() >= input.len()  {
47  break;
48  }
49  }
50  let pedersen_hash =  h % mod_num ;
51  pedersen_hash
52}
53/// Computes the generators of a cyclic group
54///
55/// # Examples
56///
57/// ```
58/// use pedersen_hash_function::natural_numbers_generators;
59/// 
60/// let cyclic_group = 5;
61/// let generators = natural_numbers_generators(cyclic_group);
62///
63///  assert_eq!(generators,[2,3]);
64/// 
65///  
66/// ```
67pub fn natural_numbers_generators( mod_num:u64 ) -> Vec<u64> {
68let mod_num_vec = create_vec_to_n(mod_num-1);
69let mut generators:Vec<u64> = Vec::new();
70let mut elements :Vec<u64>= vec![];
71let mut new_vectors: Vec<Vec<u64>> =  Vec::new(); 
72let mut generator: u64 = 1;
73
74while mod_num > generator{
75generator+=1;
76for item in &mod_num_vec{
77if extended_euclidean_algorithm(generator.try_into().unwrap(),mod_num.try_into().unwrap() ).0 ==1{
78 let result =   generator.pow((*item).try_into().unwrap())% mod_num;
79  elements.push(result);
80};
81}
82  new_vectors.push(elements.clone());
83  let mut elements_sorted= elements.clone();
84  let mut mod_num_vec_sorted = mod_num_vec.clone();
85    elements_sorted.sort();
86    mod_num_vec_sorted.sort();
87  if mod_num_vec_sorted == elements_sorted{
88  generators.push(generator );
89
90  }
91elements = [].to_vec();
92}
93generator = 1;
94generators
95 
96}
97
98fn create_vec_to_n(n: u64) -> Vec<u64> {
99    (1..=n).collect()
100}
101
102#[cfg(test)]
103mod tests {
104    use super::*;
105
106    #[test]
107    fn test1() {
108        let peserden_hash=pedersen_hash_function(1 ,2, 0, 5);
109        assert_eq!(peserden_hash,3);
110  
111    }
112    #[test]
113    fn test2() {
114        let peserden_hash=pedersen_hash_function(3 ,7, 11, 13);
115        assert_eq!(peserden_hash,8);
116  
117    }
118    #[test]
119    fn test3() {
120        let generator=natural_numbers_generators(5);
121        assert_eq!(generator, [2,3]);
122  
123    }
124}