|
@ -1,28 +1,26 @@ |
|
|
use ark_ec::{
|
|
|
|
|
|
msm::VariableBaseMSM,
|
|
|
|
|
|
};
|
|
|
|
|
|
use ark_ff::{PrimeField};
|
|
|
|
|
|
|
|
|
use crate::errors::ProofVerifyError;
|
|
|
|
|
|
use ark_ec::msm::VariableBaseMSM;
|
|
|
|
|
|
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>
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
let res = GroupElement::deserialize(&*encoded.0);
|
|
|
|
|
|
if res.is_err() {
|
|
|
|
|
|
println!("{:?}", res);
|
|
|
|
|
|
None
|
|
|
|
|
|
} else {
|
|
|
|
|
|
Some(res.unwrap())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
fn decompress(encoded: &CompressedGroup) -> Option<Self> {
|
|
|
|
|
|
let res = GroupElement::deserialize(&*encoded.0);
|
|
|
|
|
|
if res.is_err() {
|
|
|
|
|
|
println!("{:?}", res);
|
|
|
|
|
|
None
|
|
|
|
|
|
} 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(
|
|
|
|
|
|
scalars: &[Scalar],
|
|
|
|
|
|
points: &[GroupElement],
|
|
|
|
|
|
) -> GroupElement{
|
|
|
|
|
|
let repr_scalars= scalars.into_iter().map(|S| S.borrow().into_repr()).collect::<Vec<<Scalar as PrimeField>::BigInt>>();
|
|
|
|
|
|
let aff_points = points.into_iter().map(|P| P.borrow().into_affine()).collect::<Vec<GroupElementAffine>>();
|
|
|
|
|
|
VariableBaseMSM::multi_scalar_mul(aff_points.as_slice(), repr_scalars.as_slice())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
fn vartime_multiscalar_mul(scalars: &[Scalar], points: &[GroupElement]) -> GroupElement {
|
|
|
|
|
|
let repr_scalars = scalars
|
|
|
|
|
|
.into_iter()
|
|
|
|
|
|
.map(|S| S.borrow().into_repr())
|
|
|
|
|
|
.collect::<Vec<<Scalar as PrimeField>::BigInt>>();
|
|
|
|
|
|
let aff_points = points
|
|
|
|
|
|
.into_iter()
|
|
|
|
|
|
.map(|P| P.borrow().into_affine())
|
|
|
|
|
|
.collect::<Vec<GroupElementAffine>>();
|
|
|
|
|
|
VariableBaseMSM::multi_scalar_mul(aff_points.as_slice(), repr_scalars.as_slice())
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|