mirror of
https://github.com/arnaucube/ark-ec-blind-signatures.git
synced 2026-01-12 08:31:27 +01:00
Update native lib over BasePrimeField
This commit is contained in:
35
src/lib.rs
35
src/lib.rs
@@ -30,6 +30,7 @@ use ark_ed_on_bn254::{
|
|||||||
EdwardsAffine, EdwardsParameters, EdwardsProjective, FqParameters, Fr, FrParameters,
|
EdwardsAffine, EdwardsParameters, EdwardsProjective, FqParameters, Fr, FrParameters,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type ConstraintF<C> = <<C as ProjectiveCurve>::BaseField as Field>::BasePrimeField;
|
||||||
pub type SecretKey<C> = <C as ProjectiveCurve>::ScalarField;
|
pub type SecretKey<C> = <C as ProjectiveCurve>::ScalarField;
|
||||||
pub type PublicKey<C> = <C as ProjectiveCurve>::Affine;
|
pub type PublicKey<C> = <C as ProjectiveCurve>::Affine;
|
||||||
pub type BlindedSignature<C> = <C as ProjectiveCurve>::ScalarField;
|
pub type BlindedSignature<C> = <C as ProjectiveCurve>::ScalarField;
|
||||||
@@ -135,14 +136,11 @@ where
|
|||||||
pub fn blind<R: Rng>(
|
pub fn blind<R: Rng>(
|
||||||
parameters: &Parameters<C>,
|
parameters: &Parameters<C>,
|
||||||
rng: &mut R,
|
rng: &mut R,
|
||||||
poseidon_hash: &poseidon::Poseidon<C::ScalarField>,
|
poseidon_hash: &poseidon::Poseidon<ConstraintF<C>>,
|
||||||
m: C::ScalarField,
|
m: ConstraintF<C>,
|
||||||
signer_r: C::Affine,
|
signer_r: C::Affine,
|
||||||
) -> Result<(C::ScalarField, UserSecretData<C>), ark_crypto_primitives::Error>
|
) -> Result<(C::ScalarField, UserSecretData<C>), ark_crypto_primitives::Error>
|
||||||
where
|
where
|
||||||
<C as ProjectiveCurve>::ScalarField: Mul<Fp256<FrParameters>>,
|
|
||||||
<C as ProjectiveCurve>::ScalarField:
|
|
||||||
From<<<C as ProjectiveCurve>::ScalarField as Mul<Fp256<FrParameters>>>::Output>,
|
|
||||||
<C as ProjectiveCurve>::ScalarField: From<BigInteger256>,
|
<C as ProjectiveCurve>::ScalarField: From<BigInteger256>,
|
||||||
{
|
{
|
||||||
let u = Self::new_blind_params(parameters, rng, signer_r);
|
let u = Self::new_blind_params(parameters, rng, signer_r);
|
||||||
@@ -152,8 +150,11 @@ where
|
|||||||
let x_fr = C::ScalarField::from(r.x.into_repr());
|
let x_fr = C::ScalarField::from(r.x.into_repr());
|
||||||
|
|
||||||
// m' = a^-1 rx h(m)
|
// m' = a^-1 rx h(m)
|
||||||
let h_m = poseidon_hash.hash(&[m])?;
|
// TODO hash(m) must be \in Fr
|
||||||
let m_blinded = C::ScalarField::from(u.a.inverse().unwrap() * x_fr) * h_m;
|
let hm = poseidon_hash.hash(&[m])?;
|
||||||
|
// let hm_fr = C::ScalarField::from_repr(hm.into_repr()).unwrap();
|
||||||
|
let hm_fr = C::ScalarField::from_le_bytes_mod_order(&to_bytes!(hm)?); // WIP TMP
|
||||||
|
let m_blinded = C::ScalarField::from(u.a.inverse().unwrap() * x_fr) * hm_fr;
|
||||||
|
|
||||||
Ok((m_blinded, u))
|
Ok((m_blinded, u))
|
||||||
}
|
}
|
||||||
@@ -166,8 +167,8 @@ where
|
|||||||
|
|
||||||
pub fn verify(
|
pub fn verify(
|
||||||
parameters: &Parameters<C>,
|
parameters: &Parameters<C>,
|
||||||
poseidon_hash: &poseidon::Poseidon<C::ScalarField>,
|
poseidon_hash: &poseidon::Poseidon<ConstraintF<C>>,
|
||||||
m: C::ScalarField,
|
m: ConstraintF<C>,
|
||||||
s: Signature<C>,
|
s: Signature<C>,
|
||||||
q: PublicKey<C>,
|
q: PublicKey<C>,
|
||||||
) -> bool
|
) -> bool
|
||||||
@@ -176,7 +177,10 @@ where
|
|||||||
{
|
{
|
||||||
let sG = parameters.generator.mul(s.s.into_repr());
|
let sG = parameters.generator.mul(s.s.into_repr());
|
||||||
|
|
||||||
let h_m = poseidon_hash.hash(&[m]).unwrap();
|
// TODO hash(m) must be \in Fr
|
||||||
|
let hm = poseidon_hash.hash(&[m]).unwrap();
|
||||||
|
// let hm_fr = C::ScalarField::from_repr(hm.into_repr()).unwrap();
|
||||||
|
let hm_fr = C::ScalarField::from_le_bytes_mod_order(&to_bytes!(hm).unwrap()); // WIP TMP
|
||||||
|
|
||||||
// check that s.R.x is in Fr
|
// check that s.R.x is in Fr
|
||||||
let r = EdwardsAffine::from(s.r); // WIP
|
let r = EdwardsAffine::from(s.r); // WIP
|
||||||
@@ -189,7 +193,7 @@ where
|
|||||||
}
|
}
|
||||||
// get s.R.x
|
// get s.R.x
|
||||||
let x_fr = C::ScalarField::from(r.x.into_repr());
|
let x_fr = C::ScalarField::from(r.x.into_repr());
|
||||||
let right = s.r + q.mul((x_fr * h_m).into_repr()).into_affine();
|
let right = s.r + q.mul((x_fr * hm_fr).into_repr()).into_affine();
|
||||||
|
|
||||||
sG.into_affine() == right
|
sG.into_affine() == right
|
||||||
}
|
}
|
||||||
@@ -219,13 +223,14 @@ pub fn poseidon_setup_params<F: PrimeField>(
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
pub type ConstraintF = ark_ed_on_bn254::Fr; // scalar field
|
pub type Fq = ark_ed_on_bn254::Fq; // base field
|
||||||
|
// pub type Fr = ark_ed_on_bn254::Fr; // scalar field
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_blind() {
|
fn test_blind_signature_flow_native() {
|
||||||
type S = BlindSigScheme<EdwardsProjective>;
|
type S = BlindSigScheme<EdwardsProjective>;
|
||||||
|
|
||||||
let poseidon_params = poseidon_setup_params::<ConstraintF>(Curve::Bn254, 5, 3);
|
let poseidon_params = poseidon_setup_params::<Fq>(Curve::Bn254, 5, 3);
|
||||||
let poseidon_hash = poseidon::Poseidon::new(poseidon_params);
|
let poseidon_hash = poseidon::Poseidon::new(poseidon_params);
|
||||||
|
|
||||||
let mut rng = ark_std::test_rng();
|
let mut rng = ark_std::test_rng();
|
||||||
@@ -234,7 +239,7 @@ mod tests {
|
|||||||
let (pk, sk) = S::keygen(¶ms, &mut rng);
|
let (pk, sk) = S::keygen(¶ms, &mut rng);
|
||||||
|
|
||||||
let (k, signer_r) = S::new_request_params(¶ms, &mut rng);
|
let (k, signer_r) = S::new_request_params(¶ms, &mut rng);
|
||||||
let m = ConstraintF::from(1234);
|
let m = Fq::from(1234);
|
||||||
|
|
||||||
let (m_blinded, u) = S::blind(¶ms, &mut rng, &poseidon_hash, m, signer_r).unwrap();
|
let (m_blinded, u) = S::blind(¶ms, &mut rng, &poseidon_hash, m, signer_r).unwrap();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user