Skip to content

Commit ed151ad

Browse files
committed
Refactor
1 parent d2e37c5 commit ed151ad

8 files changed

Lines changed: 386 additions & 315 deletions

File tree

fastcrypto/src/groups/bn254.rs

Lines changed: 0 additions & 310 deletions
This file was deleted.

fastcrypto/src/groups/bn254/g1.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright (c) 2022, Mysten Labs, Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
use std::ops::{Div, Mul};
5+
6+
use crate::error::{FastCryptoError, FastCryptoResult};
7+
use crate::groups::bn254::Scalar;
8+
use crate::groups::bn254::{G1Element, G1_ELEMENT_BYTE_LENGTH};
9+
use crate::groups::{FromTrustedByteArray, GroupElement, Scalar as ScalarType};
10+
use crate::serde_helpers::ToFromByteArray;
11+
use crate::serialize_deserialize_with_to_from_byte_array;
12+
use ark_bn254::{G1Affine, G1Projective};
13+
use ark_ec::{AffineRepr, Group};
14+
use ark_ff::Zero;
15+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
16+
use serde::{de, Deserialize};
17+
18+
impl GroupElement for G1Element {
19+
type ScalarType = Scalar;
20+
21+
fn zero() -> Self {
22+
G1Element(G1Projective::zero())
23+
}
24+
25+
fn generator() -> Self {
26+
G1Element(G1Projective::generator())
27+
}
28+
}
29+
30+
impl Div<Scalar> for G1Element {
31+
type Output = FastCryptoResult<Self>;
32+
33+
fn div(self, rhs: Scalar) -> Self::Output {
34+
let inverse = rhs.inverse()?;
35+
Ok(self.mul(inverse))
36+
}
37+
}
38+
39+
impl Mul<Scalar> for G1Element {
40+
type Output = Self;
41+
42+
fn mul(self, rhs: Scalar) -> Self::Output {
43+
Self(self.0.mul(rhs.0))
44+
}
45+
}
46+
47+
impl ToFromByteArray<G1_ELEMENT_BYTE_LENGTH> for G1Element {
48+
fn from_byte_array(bytes: &[u8; G1_ELEMENT_BYTE_LENGTH]) -> Result<Self, FastCryptoError> {
49+
let point = G1Affine::deserialize_compressed(bytes.as_slice())
50+
.map_err(|_| FastCryptoError::InvalidInput)?;
51+
52+
// Arkworks only checks the infinity flag, but we require all-zeros to have unique serialization
53+
if point.is_zero()
54+
&& bytes[0..G1_ELEMENT_BYTE_LENGTH - 1]
55+
.iter()
56+
.any(|x| !x.is_zero())
57+
{
58+
return Err(FastCryptoError::InvalidInput);
59+
}
60+
61+
Ok(Self(G1Projective::from(point)))
62+
}
63+
64+
fn to_byte_array(&self) -> [u8; G1_ELEMENT_BYTE_LENGTH] {
65+
let mut bytes = [0u8; G1_ELEMENT_BYTE_LENGTH];
66+
self.0
67+
.serialize_compressed(bytes.as_mut_slice())
68+
.expect("Never fails");
69+
bytes
70+
}
71+
}
72+
73+
impl FromTrustedByteArray<G1_ELEMENT_BYTE_LENGTH> for G1Element {
74+
fn from_trusted_byte_array(bytes: &[u8; G1_ELEMENT_BYTE_LENGTH]) -> FastCryptoResult<Self> {
75+
G1Projective::deserialize_compressed_unchecked(bytes.as_slice())
76+
.map_err(|_| FastCryptoError::InvalidInput)
77+
.map(G1Element)
78+
}
79+
}
80+
81+
serialize_deserialize_with_to_from_byte_array!(G1Element);

0 commit comments

Comments
 (0)