|
@ -42,7 +42,9 @@ pub fn load_constants() -> Constants { |
|
|
c,
|
|
|
c,
|
|
|
m,
|
|
|
m,
|
|
|
n_rounds_f: 8,
|
|
|
n_rounds_f: 8,
|
|
|
n_rounds_p: vec![56, 57, 56, 60, 60, 63, 64, 63],
|
|
|
|
|
|
|
|
|
n_rounds_p: vec![
|
|
|
|
|
|
56, 57, 56, 60, 60, 63, 64, 63, 60, 66, 60, 65, 70, 60, 64, 68,
|
|
|
|
|
|
],
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
@ -92,7 +94,7 @@ impl Poseidon { |
|
|
|
|
|
|
|
|
pub fn hash(&self, inp: Vec<Fr>) -> Result<Fr, String> {
|
|
|
pub fn hash(&self, inp: Vec<Fr>) -> Result<Fr, String> {
|
|
|
let t = inp.len() + 1;
|
|
|
let t = inp.len() + 1;
|
|
|
if inp.is_empty() || inp.len() >= self.constants.n_rounds_p.len() - 1 {
|
|
|
|
|
|
|
|
|
if inp.is_empty() || inp.len() > self.constants.n_rounds_p.len() {
|
|
|
return Err("Wrong inputs length".to_string());
|
|
|
return Err("Wrong inputs length".to_string());
|
|
|
}
|
|
|
}
|
|
|
let n_rounds_f = self.constants.n_rounds_f.clone();
|
|
|
let n_rounds_f = self.constants.n_rounds_f.clone();
|
|
@ -124,7 +126,7 @@ mod tests { |
|
|
);
|
|
|
);
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
cons.c[cons.c.len() - 1][0].to_string(),
|
|
|
cons.c[cons.c.len() - 1][0].to_string(),
|
|
|
"14715728137766105031387583973733149375806784983272780095398485311648630967927"
|
|
|
|
|
|
|
|
|
"21579410516734741630578831791708254656585702717204712919233299001262271512412"
|
|
|
);
|
|
|
);
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
cons.m[0][0][0].to_string(),
|
|
|
cons.m[0][0][0].to_string(),
|
|
@ -132,7 +134,7 @@ mod tests { |
|
|
);
|
|
|
);
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
cons.m[cons.m.len() - 1][0][0].to_string(),
|
|
|
cons.m[cons.m.len() - 1][0][0].to_string(),
|
|
|
"708458300293891745856425423607721463509413916954480913172999113933455141974"
|
|
|
|
|
|
|
|
|
"11497693837059016825308731789443585196852778517742143582474723527597064448312"
|
|
|
);
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
@ -145,90 +147,111 @@ mod tests { |
|
|
let b4: Fr = Fr::from_str("4").unwrap();
|
|
|
let b4: Fr = Fr::from_str("4").unwrap();
|
|
|
let b5: Fr = Fr::from_str("5").unwrap();
|
|
|
let b5: Fr = Fr::from_str("5").unwrap();
|
|
|
let b6: Fr = Fr::from_str("6").unwrap();
|
|
|
let b6: Fr = Fr::from_str("6").unwrap();
|
|
|
|
|
|
let b7: Fr = Fr::from_str("7").unwrap();
|
|
|
|
|
|
let b8: Fr = Fr::from_str("8").unwrap();
|
|
|
|
|
|
let b9: Fr = Fr::from_str("9").unwrap();
|
|
|
|
|
|
let b10: Fr = Fr::from_str("10").unwrap();
|
|
|
|
|
|
let b11: Fr = Fr::from_str("11").unwrap();
|
|
|
|
|
|
let b12: Fr = Fr::from_str("12").unwrap();
|
|
|
|
|
|
let b13: Fr = Fr::from_str("13").unwrap();
|
|
|
|
|
|
let b14: Fr = Fr::from_str("14").unwrap();
|
|
|
|
|
|
let b15: Fr = Fr::from_str("15").unwrap();
|
|
|
|
|
|
let b16: Fr = Fr::from_str("16").unwrap();
|
|
|
|
|
|
|
|
|
let mut big_arr: Vec<Fr> = Vec::new();
|
|
|
|
|
|
big_arr.push(b1.clone());
|
|
|
|
|
|
let poseidon = Poseidon::new();
|
|
|
let poseidon = Poseidon::new();
|
|
|
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b1];
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
h.to_string(),
|
|
|
h.to_string(),
|
|
|
"18586133768512220936620570745912940619677854269274689475585506675881198879027"
|
|
|
"18586133768512220936620570745912940619677854269274689475585506675881198879027"
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let mut big_arr: Vec<Fr> = Vec::new();
|
|
|
|
|
|
big_arr.push(b1.clone());
|
|
|
|
|
|
big_arr.push(b2.clone());
|
|
|
|
|
|
let poseidon = Poseidon::new();
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b1, b2];
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
h.to_string(),
|
|
|
h.to_string(),
|
|
|
"7853200120776062878684798364095072458815029376092732009249414926327459813530"
|
|
|
"7853200120776062878684798364095072458815029376092732009249414926327459813530"
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let mut big_arr: Vec<Fr> = Vec::new();
|
|
|
|
|
|
big_arr.push(b1.clone());
|
|
|
|
|
|
big_arr.push(b2.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
let poseidon = Poseidon::new();
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b1, b2, b0, b0, b0];
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
h.to_string(),
|
|
|
h.to_string(),
|
|
|
"1018317224307729531995786483840663576608797660851238720571059489595066344487"
|
|
|
"1018317224307729531995786483840663576608797660851238720571059489595066344487"
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let mut big_arr: Vec<Fr> = Vec::new();
|
|
|
|
|
|
big_arr.push(b1.clone());
|
|
|
|
|
|
big_arr.push(b2.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
let poseidon = Poseidon::new();
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b1, b2, b0, b0, b0, b0];
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
h.to_string(),
|
|
|
h.to_string(),
|
|
|
"15336558801450556532856248569924170992202208561737609669134139141992924267169"
|
|
|
"15336558801450556532856248569924170992202208561737609669134139141992924267169"
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let mut big_arr: Vec<Fr> = Vec::new();
|
|
|
|
|
|
big_arr.push(b3.clone());
|
|
|
|
|
|
big_arr.push(b4.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
let poseidon = Poseidon::new();
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b3, b4, b0, b0, b0];
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
h.to_string(),
|
|
|
h.to_string(),
|
|
|
"5811595552068139067952687508729883632420015185677766880877743348592482390548"
|
|
|
"5811595552068139067952687508729883632420015185677766880877743348592482390548"
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let mut big_arr: Vec<Fr> = Vec::new();
|
|
|
|
|
|
big_arr.push(b3.clone());
|
|
|
|
|
|
big_arr.push(b4.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
big_arr.push(b0.clone());
|
|
|
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b3, b4, b0, b0, b0, b0];
|
|
|
|
|
|
let h = poseidon.hash(big_arr).unwrap();
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
h.to_string(),
|
|
|
h.to_string(),
|
|
|
"12263118664590987767234828103155242843640892839966517009184493198782366909018"
|
|
|
"12263118664590987767234828103155242843640892839966517009184493198782366909018"
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
let mut big_arr: Vec<Fr> = Vec::new();
|
|
|
|
|
|
big_arr.push(b1.clone());
|
|
|
|
|
|
big_arr.push(b2.clone());
|
|
|
|
|
|
big_arr.push(b3.clone());
|
|
|
|
|
|
big_arr.push(b4.clone());
|
|
|
|
|
|
big_arr.push(b5.clone());
|
|
|
|
|
|
big_arr.push(b6.clone());
|
|
|
|
|
|
let h = poseidon.hash(big_arr.clone()).unwrap();
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b1, b2, b3, b4, b5, b6];
|
|
|
|
|
|
let h = poseidon.hash(big_arr).unwrap();
|
|
|
assert_eq!(
|
|
|
assert_eq!(
|
|
|
h.to_string(),
|
|
|
h.to_string(),
|
|
|
"20400040500897583745843009878988256314335038853985262692600694741116813247201"
|
|
|
"20400040500897583745843009878988256314335038853985262692600694741116813247201"
|
|
|
);
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14];
|
|
|
|
|
|
let h = poseidon.hash(big_arr).unwrap();
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
|
h.to_string(),
|
|
|
|
|
|
"8354478399926161176778659061636406690034081872658507739535256090879947077494"
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, b0, b0, b0, b0];
|
|
|
|
|
|
let h = poseidon.hash(big_arr).unwrap();
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
|
h.to_string(),
|
|
|
|
|
|
"5540388656744764564518487011617040650780060800286365721923524861648744699539"
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![
|
|
|
|
|
|
b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, b0, b0, b0, b0, b0, b0,
|
|
|
|
|
|
];
|
|
|
|
|
|
let h = poseidon.hash(big_arr).unwrap();
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
|
h.to_string(),
|
|
|
|
|
|
"11882816200654282475720830292386643970958445617880627439994635298904836126497"
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![
|
|
|
|
|
|
b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16,
|
|
|
|
|
|
];
|
|
|
|
|
|
let h = poseidon.hash(big_arr).unwrap();
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
|
h.to_string(),
|
|
|
|
|
|
"9989051620750914585850546081941653841776809718687451684622678807385399211877"
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
#[test]
|
|
|
|
|
|
fn test_wrong_inputs() {
|
|
|
|
|
|
let b0: Fr = Fr::from_str("0").unwrap();
|
|
|
|
|
|
let b1: Fr = Fr::from_str("1").unwrap();
|
|
|
|
|
|
let b2: Fr = Fr::from_str("2").unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
let poseidon = Poseidon::new();
|
|
|
|
|
|
|
|
|
|
|
|
let big_arr: Vec<Fr> = vec![
|
|
|
|
|
|
b1, b2, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0,
|
|
|
|
|
|
];
|
|
|
|
|
|
poseidon.hash(big_arr).expect_err("Wrong inputs length");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|