turn shake into poseidon

This commit is contained in:
Mara Mihali
2022-07-15 08:27:30 +01:00
parent b085c670be
commit 632b95b4c8

View File

@@ -1,28 +1,26 @@
use ark_ec::{ use crate::errors::ProofVerifyError;
msm::VariableBaseMSM, use ark_ec::msm::VariableBaseMSM;
}; use ark_ff::PrimeField;
use ark_ff::{PrimeField};
use digest::DynDigest; use digest::DynDigest;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use num_bigint::BigInt; use num_bigint::BigInt;
use crate::errors::ProofVerifyError;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use num_bigint::BigInt; use num_bigint::BigInt;
use super::scalar::Scalar; use super::scalar::Scalar;
use ark_ec::{AffineCurve, ProjectiveCurve}; use ark_ec::{AffineCurve, ProjectiveCurve};
use ark_ec::{AffineCurve, ProjectiveCurve};
use ark_serialize::*;
use ark_serialize::*; use ark_serialize::*;
use core::borrow::Borrow; use core::borrow::Borrow;
use core::ops::{Mul, MulAssign}; use core::ops::{Mul, MulAssign};
use ark_ec::{ProjectiveCurve, AffineCurve};
use ark_serialize::*;
pub type GroupElement = ark_bls12_377::G1Projective; pub type GroupElement = ark_bls12_377::G1Projective;
pub type GroupElementAffine = ark_bls12_377::G1Affine; pub type GroupElementAffine = ark_bls12_377::G1Affine;
pub type CurveField = ark_bls12_377::Fq; pub type CurveField = ark_bls12_377::Fq;
#[derive(Clone, Eq, PartialEq, Hash, Debug, CanonicalSerialize, CanonicalDeserialize)] #[derive(Clone, Eq, PartialEq, Hash, Debug, CanonicalSerialize, CanonicalDeserialize)]
pub struct CompressedGroup(pub Vec<u8>); pub struct CompressedGroup(pub Vec<u8>);
lazy_static! { lazy_static! {
@@ -51,23 +49,21 @@ impl CompressGroupElement for GroupElement {
} }
impl DecompressGroupElement for GroupElement { impl DecompressGroupElement for GroupElement {
fn decompress(encoded: &CompressedGroup) -> Option<Self> fn decompress(encoded: &CompressedGroup) -> Option<Self> {
{ let res = GroupElement::deserialize(&*encoded.0);
if res.is_err() {
let res = GroupElement::deserialize(&*encoded.0); println!("{:?}", res);
if res.is_err() { None
println!("{:?}", res); } else {
None Some(res.unwrap())
} else { }
Some(res.unwrap())
}
} }
} }
impl UnpackGroupElement for CompressedGroup { impl UnpackGroupElement for CompressedGroup {
fn unpack(&self) -> Result<GroupElement, ProofVerifyError> { fn unpack(&self) -> Result<GroupElement, ProofVerifyError> {
let encoded = self.0.clone(); let encoded = self.0.clone();
GroupElement::decompress(self).ok_or_else(|| ProofVerifyError::DecompressionError(encoded)) GroupElement::decompress(self).ok_or_else(|| ProofVerifyError::DecompressionError(encoded))
} }
} }
@@ -76,13 +72,15 @@ pub trait VartimeMultiscalarMul {
} }
impl VartimeMultiscalarMul for GroupElement { impl VartimeMultiscalarMul for GroupElement {
fn vartime_multiscalar_mul( fn vartime_multiscalar_mul(scalars: &[Scalar], points: &[GroupElement]) -> GroupElement {
scalars: &[Scalar], let repr_scalars = scalars
points: &[GroupElement], .into_iter()
) -> GroupElement{ .map(|S| S.borrow().into_repr())
let repr_scalars= scalars.into_iter().map(|S| S.borrow().into_repr()).collect::<Vec<<Scalar as PrimeField>::BigInt>>(); .collect::<Vec<<Scalar as PrimeField>::BigInt>>();
let aff_points = points.into_iter().map(|P| P.borrow().into_affine()).collect::<Vec<GroupElementAffine>>(); let aff_points = points
VariableBaseMSM::multi_scalar_mul(aff_points.as_slice(), repr_scalars.as_slice()) .into_iter()
.map(|P| P.borrow().into_affine())
.collect::<Vec<GroupElementAffine>>();
VariableBaseMSM::multi_scalar_mul(aff_points.as_slice(), repr_scalars.as_slice())
}
} }
}