arnaucube
arnaucube/circom-compatPublic Self-hosted repository
fix: negate negative witness elements
Georgios Konstantopoulos me@gakonst.com
Tue, 10 Aug 2021 23:40:57 +0300
commit

de9af5b9e66a989442ac756109193afb30a5dc95

parent

c32270a285fcbc42d0adaaa0920397cabbceefcb

1 files changed, 13 insertions(+), 2 deletions(-)

jump to
M src/circom/builder.rs → src/circom/builder.rs

@@ -75,11 +75,22 @@ .cfg

.wtns .calculate_witness(self.inputs, self.cfg.sanity_check)?; + use ark_ff::{PrimeField, FpParameters}; + let modulus = <<E::Fr as PrimeField>::Params as FpParameters>::MODULUS; + // convert it to field elements + use num_traits::Signed; let witness = witness .into_iter() - .map(|w| E::Fr::from(w.to_biguint().unwrap())) - .collect::<Vec<_>>(); + .map(|w| { + let w = if w.sign() == num_bigint::Sign::Minus { + // Need to negate the witness element if negative + modulus.into() - w.abs().to_biguint().unwrap() + } else { + w.to_biguint().unwrap() + }; + E::Fr::from(w) + }).collect::<Vec<_>>(); circom.witness = Some(witness); // sanity check