From c75bb836b516ebb7c378f89873e5925d43420c33 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Mon, 26 Apr 2021 15:43:39 +0800 Subject: [PATCH] Compare test results against Sinsemilla primitives --- src/circuit/gadget/sinsemilla.rs | 9 +++++++-- src/circuit/gadget/sinsemilla/chip.rs | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/circuit/gadget/sinsemilla.rs b/src/circuit/gadget/sinsemilla.rs index 3e37b99f1..0964dba4b 100644 --- a/src/circuit/gadget/sinsemilla.rs +++ b/src/circuit/gadget/sinsemilla.rs @@ -272,7 +272,9 @@ mod tests { merkle_crh.hash_to_point( chip1, layouter.namespace(|| "hash_to_point"), - vec![true, true, false, false], + vec![ + true, true, false, true, true, false, false, false, true, true, false, false, + ], )?; let mut chip2 = SinsemillaChip::::construct( @@ -294,7 +296,10 @@ mod tests { commit_ivk.commit( chip2, layouter.namespace(|| "commit"), - vec![true, true, false, false], + vec![ + true, true, false, false, true, false, true, true, false, true, false, true, + true, false, + ], r, )?; diff --git a/src/circuit/gadget/sinsemilla/chip.rs b/src/circuit/gadget/sinsemilla/chip.rs index 80022722c..63423dad4 100644 --- a/src/circuit/gadget/sinsemilla/chip.rs +++ b/src/circuit/gadget/sinsemilla/chip.rs @@ -450,6 +450,30 @@ impl SinsemillaInstructions for SinsemillaChip { || y_a.ok_or(Error::SynthesisError), )?; + #[cfg(test)] + x_a.zip(y_a).map(|(x_a, y_a)| { + let computed_point: C = C::from_xy(x_a, y_a).unwrap(); + let expected_point: C = { + let Q = C::from_xy(Q.x.value.unwrap(), Q.y.value.unwrap()).unwrap(); + let message: Vec = + message.0.iter().map(|word| word.value.unwrap()).collect(); + + use crate::primitives::sinsemilla::S_PERSONALIZATION; + use pasta_curves::arithmetic::CurveExt; + + let hasher_S = C::CurveExt::hash_to_curve(S_PERSONALIZATION); + let S = |chunk: u32| -> C { hasher_S(&chunk.to_le_bytes()).to_affine() }; + + message + .iter() + .fold(C::CurveExt::from(Q), |acc, chunk: &u32| { + (acc + S(*chunk)) + acc + }) + .to_affine() + }; + assert_eq!(computed_point, expected_point); + }); + let y_a = CellValue::new(y_a_cell, y_a); let x_a = CellValue::new(x_a_cell, x_a);