group: Extract compressed encodings from CurveAffine trait

This commit is contained in:
Jack Grigg 2020-05-29 20:22:53 +12:00
parent 3759fc8aab
commit 71586914d4
6 changed files with 28 additions and 13 deletions

View File

@ -2,7 +2,7 @@
//!
//! [Groth16]: https://eprint.iacr.org/2016/260
use group::{CurveAffine, UncompressedEncoding};
use group::{CurveAffine, GroupEncoding, UncompressedEncoding};
use pairing::{Engine, MultiMillerLoop};
use crate::SynthesisError;
@ -47,7 +47,7 @@ impl<E: Engine> Proof<E> {
pub fn read<R: Read>(mut reader: R) -> io::Result<Self> {
let read_g1 = |reader: &mut R| -> io::Result<E::G1Affine> {
let mut g1_repr = <E::G1Affine as CurveAffine>::Compressed::default();
let mut g1_repr = <E::G1Affine as GroupEncoding>::Compressed::default();
reader.read_exact(g1_repr.as_mut())?;
let affine = E::G1Affine::from_compressed(&g1_repr);
@ -70,7 +70,7 @@ impl<E: Engine> Proof<E> {
};
let read_g2 = |reader: &mut R| -> io::Result<E::G2Affine> {
let mut g2_repr = <E::G2Affine as CurveAffine>::Compressed::default();
let mut g2_repr = <E::G2Affine as GroupEncoding>::Compressed::default();
reader.read_exact(g2_repr.as_mut())?;
let affine = E::G2Affine::from_compressed(&g2_repr);

View File

@ -1,5 +1,5 @@
use ff::{Field, PrimeField};
use group::{CurveAffine, CurveProjective, Group, PrimeGroup, UncompressedEncoding};
use group::{CurveAffine, CurveProjective, Group, GroupEncoding, PrimeGroup, UncompressedEncoding};
use pairing::{Engine, MillerLoopResult, MultiMillerLoop, PairingCurveAffine};
use rand_core::RngCore;
@ -425,7 +425,6 @@ impl AsRef<[u8]> for FakePoint {
}
impl CurveAffine for Fr {
type Compressed = FakePoint;
type Projective = Fr;
type Scalar = Fr;
@ -444,6 +443,10 @@ impl CurveAffine for Fr {
fn to_projective(&self) -> Self::Projective {
*self
}
}
impl GroupEncoding for Fr {
type Compressed = FakePoint;
fn from_compressed(_bytes: &Self::Compressed) -> CtOption<Self> {
unimplemented!()

View File

@ -132,13 +132,13 @@ pub trait CurveAffine:
+ PartialEq
+ Eq
+ 'static
+ GroupEncoding
+ Neg<Output = Self>
+ Mul<<Self as CurveAffine>::Scalar, Output = <Self as CurveAffine>::Projective>
+ for<'r> Mul<<Self as CurveAffine>::Scalar, Output = <Self as CurveAffine>::Projective>
{
type Scalar: PrimeField;
type Projective: CurveProjective<Affine = Self, Scalar = Self::Scalar>;
type Compressed: Default + AsRef<[u8]> + AsMut<[u8]>;
/// Returns the additive identity.
fn identity() -> Self;
@ -152,6 +152,11 @@ pub trait CurveAffine:
/// Converts this element into its affine representation.
fn to_projective(&self) -> Self::Projective;
}
pub trait GroupEncoding: Sized {
/// The encoding of group elements.
type Compressed: Default + AsRef<[u8]> + AsMut<[u8]>;
/// Attempts to deserialize an element from its compressed encoding.
fn from_compressed(bytes: &Self::Compressed) -> CtOption<Self>;

View File

@ -3,7 +3,7 @@ use rand::SeedableRng;
use rand_xorshift::XorShiftRng;
use std::ops::{Mul, Neg};
use crate::{CurveAffine, CurveProjective, UncompressedEncoding};
use crate::{CurveAffine, CurveProjective, GroupEncoding, UncompressedEncoding};
pub fn curve_tests<G: CurveProjective>() {
let mut rng = XorShiftRng::from_seed([

View File

@ -200,7 +200,6 @@ macro_rules! curve_impl {
impl CurveAffine for $affine {
type Scalar = $scalarfield;
type Projective = $projective;
type Compressed = $compressed;
fn identity() -> Self {
$affine {
@ -221,6 +220,10 @@ macro_rules! curve_impl {
fn to_projective(&self) -> $projective {
(*self).into()
}
}
impl GroupEncoding for $affine {
type Compressed = $compressed;
fn from_compressed(bytes: &Self::Compressed) -> CtOption<Self> {
Self::from_compressed_unchecked(bytes).and_then(|affine| {
@ -904,7 +907,9 @@ pub mod g1 {
use super::{g2::G2Affine, GroupDecodingError};
use crate::{Engine, PairingCurveAffine};
use ff::{BitIterator, Field, PrimeField};
use group::{CurveAffine, CurveProjective, Group, PrimeGroup, UncompressedEncoding};
use group::{
CurveAffine, CurveProjective, Group, GroupEncoding, PrimeGroup, UncompressedEncoding,
};
use rand_core::RngCore;
use std::fmt;
use std::ops::{AddAssign, MulAssign, Neg, SubAssign};
@ -1481,7 +1486,9 @@ pub mod g2 {
use super::{g1::G1Affine, GroupDecodingError};
use crate::{Engine, PairingCurveAffine};
use ff::{BitIterator, Field, PrimeField};
use group::{CurveAffine, CurveProjective, Group, PrimeGroup, UncompressedEncoding};
use group::{
CurveAffine, CurveProjective, Group, GroupEncoding, PrimeGroup, UncompressedEncoding,
};
use rand_core::RngCore;
use std::fmt;
use std::ops::{AddAssign, MulAssign, Neg, SubAssign};

View File

@ -1,5 +1,5 @@
use ff::PrimeField;
use group::{CurveAffine, CurveProjective, UncompressedEncoding};
use group::{CurveAffine, CurveProjective, GroupEncoding, UncompressedEncoding};
use super::*;
use crate::*;
@ -87,7 +87,7 @@ where
fn compressed_test_vectors<G: CurveProjective>(expected: &[u8]) {
let mut e = G::identity();
let encoded_len = <G::Affine as CurveAffine>::Compressed::default()
let encoded_len = <G::Affine as GroupEncoding>::Compressed::default()
.as_ref()
.len();
@ -99,7 +99,7 @@ fn compressed_test_vectors<G: CurveProjective>(expected: &[u8]) {
let encoded = e_affine.to_compressed();
v.extend_from_slice(encoded.as_ref());
let mut decoded = <G::Affine as CurveAffine>::Compressed::default();
let mut decoded = <G::Affine as GroupEncoding>::Compressed::default();
decoded.as_mut().copy_from_slice(&expected[0..encoded_len]);
expected = &expected[encoded_len..];
let decoded = G::Affine::from_compressed(&decoded).unwrap();