Skip to content

Commit

Permalink
Refactoring of extf_mul
Browse files Browse the repository at this point in the history
  • Loading branch information
raugfer committed Aug 21, 2024
1 parent e66c20a commit 97d3e98
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 71 deletions.
97 changes: 30 additions & 67 deletions tools/garaga_rs/src/ecip/curve.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::{
BLS12381PrimeField, BLS12381_PRIME_FIELD_ORDER,
};
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::{
BN254PrimeField, BN254_PRIME_FIELD_ORDER,
};
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField;
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::field_extension::BN254PrimeField;
use lambdaworks_math::field::element::FieldElement;
use lambdaworks_math::field::fields::montgomery_backed_prime_fields::{
IsModulus, MontgomeryBackendPrimeField,
};

use crate::ecip::polynomial::Polynomial;
use lambdaworks_math::field::traits::IsPrimeField;
use lambdaworks_math::unsigned_integer::element::{U256, U384};
use lambdaworks_math::unsigned_integer::element::U256;
use num_bigint::BigUint;
use std::cmp::PartialEq;
use std::collections::HashMap;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CurveID {
Expand Down Expand Up @@ -77,7 +74,21 @@ pub struct CurveParams<F: IsPrimeField> {
pub g_y: FieldElement<F>,
pub n: FieldElement<F>, // Order of the curve
pub h: u32, // Cofactor
pub irreducible_polys: fn(ext_degree: usize) -> Polynomial<F>, // irreducible polynomial for given extension field
pub irreducible_polys: HashMap<usize, &'static [i8]>,
}

pub fn get_irreducible_poly<F: IsPrimeField + CurveParamsProvider<F>>(
ext_degree: usize,
) -> Polynomial<F> {
let coeffs = (F::get_curve_params().irreducible_polys)[&ext_degree];
fn lift<F: IsPrimeField>(c: i8) -> FieldElement<F> {
if c >= 0 {
FieldElement::from(c as u64)
} else {
-FieldElement::from(-c as u64)
}
}
return Polynomial::new(coeffs.into_iter().map(|x| lift::<F>(*x)).collect());
}

/// A trait that provides curve parameters for a specific field type.
Expand All @@ -92,10 +103,6 @@ pub trait FromBigUint<F: IsPrimeField> {

impl CurveParamsProvider<SECP256K1PrimeField> for SECP256K1PrimeField {
fn get_curve_params() -> CurveParams<SECP256K1PrimeField> {
fn irreducible_polys(_ext_degree: usize) -> Polynomial<SECP256K1PrimeField> {
unimplemented!()
}

CurveParams {
a: FieldElement::zero(),
b: FieldElement::from_hex_unchecked("7"),
Expand All @@ -109,17 +116,13 @@ impl CurveParamsProvider<SECP256K1PrimeField> for SECP256K1PrimeField {
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
),
h: 1,
irreducible_polys,
irreducible_polys: HashMap::from([]), // Provide appropriate values here
}
}
}

impl CurveParamsProvider<SECP256R1PrimeField> for SECP256R1PrimeField {
fn get_curve_params() -> CurveParams<SECP256R1PrimeField> {
fn irreducible_polys(_ext_degree: usize) -> Polynomial<SECP256R1PrimeField> {
unimplemented!()
}

CurveParams {
a: FieldElement::from_hex_unchecked(
"ffffffff00000001000000000000000000000000fffffffffffffffffffffffc",
Expand All @@ -137,17 +140,13 @@ impl CurveParamsProvider<SECP256R1PrimeField> for SECP256R1PrimeField {
"FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
),
h: 1,
irreducible_polys,
irreducible_polys: HashMap::from([]), // Provide appropriate values here
}
}
}

impl CurveParamsProvider<X25519PrimeField> for X25519PrimeField {
fn get_curve_params() -> CurveParams<X25519PrimeField> {
fn irreducible_polys(_ext_degree: usize) -> Polynomial<X25519PrimeField> {
unimplemented!()
}

CurveParams {
a: FieldElement::from_hex_unchecked(
"0x5d4eacd3a5b9bee63197e10d617b3dd66bb8b65d0ca52af7ac71e18ef8bc172d",
Expand All @@ -163,34 +162,13 @@ impl CurveParamsProvider<X25519PrimeField> for X25519PrimeField {
"1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED",
),
h: 8,
irreducible_polys,
irreducible_polys: HashMap::from([]), // Provide appropriate values here
}
}
}

impl CurveParamsProvider<BN254PrimeField> for BN254PrimeField {
fn get_curve_params() -> CurveParams<BN254PrimeField> {
fn irreducible_polys(ext_degree: usize) -> Polynomial<BN254PrimeField> {
let coeffs: &[i8] = match ext_degree {
6 => &[82, 0, 0, -18, 0, 0, 1],
12 => &[82, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 1],
_ => panic!("Extension degree {} not supported", ext_degree),
};
fn lift(c: i8) -> U256 {
if c >= 0 {
U256::from_u64(c as u64)
} else {
BN254_PRIME_FIELD_ORDER - U256::from_u64(-c as u64)
}
}
return Polynomial::new(
coeffs
.into_iter()
.map(|x| FieldElement::from(&lift(*x)))
.collect(),
);
}

// You need to provide appropriate curve parameters here
// Replace the values with the actual curve parameters for BN254
CurveParams {
Expand All @@ -200,34 +178,16 @@ impl CurveParamsProvider<BN254PrimeField> for BN254PrimeField {
g_y: FieldElement::from_hex_unchecked("2"), // Replace with actual 'g_y'
n: FieldElement::from_hex_unchecked("1"), // Replace with actual 'n'
h: 1, // Replace with actual 'h'
irreducible_polys,
irreducible_polys: HashMap::from([
(6, [82, 0, 0, -18, 0, 0, 1].as_slice()),
(12, [82, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 1].as_slice()),
]),
}
}
}

impl CurveParamsProvider<BLS12381PrimeField> for BLS12381PrimeField {
fn get_curve_params() -> CurveParams<BLS12381PrimeField> {
fn irreducible_polys(ext_degree: usize) -> Polynomial<BLS12381PrimeField> {
let coeffs: &[i8] = match ext_degree {
6 => &[2, 0, 0, -2, 0, 0, 1],
12 => &[2, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1],
_ => panic!("extension degree {} not supported", ext_degree),
};
fn lift(c: i8) -> U384 {
if c >= 0 {
U384::from_u64(c as u64)
} else {
BLS12381_PRIME_FIELD_ORDER - U384::from_u64(-c as u64)
}
}
return Polynomial::new(
coeffs
.into_iter()
.map(|x| FieldElement::from(&lift(*x)))
.collect(),
);
}

// You need to provide appropriate curve parameters here
// Replace the values with the actual curve parameters for BN254
CurveParams {
Expand All @@ -237,7 +197,10 @@ impl CurveParamsProvider<BLS12381PrimeField> for BLS12381PrimeField {
g_y: FieldElement::from_hex_unchecked("2"), // Replace with actual 'g_y'
n: FieldElement::from_hex_unchecked("1"), // Replace with actual 'n'
h: 1, // Replace with actual 'h'
irreducible_polys,
irreducible_polys: HashMap::from([
(6, [2, 0, 0, -2, 0, 0, 1].as_slice()),
(12, [2, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1].as_slice()),
]),
}
}
}
8 changes: 4 additions & 4 deletions tools/garaga_rs/src/extf_mul.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::ecip::{
curve::CurveParamsProvider,
curve::{get_irreducible_poly, CurveParamsProvider},
polynomial::{pad_with_zero_coefficients_to_length, Polynomial},
};
use lambdaworks_math::{
Expand All @@ -25,7 +25,7 @@ pub fn nondeterministic_extension_field_mul_divmod(
let coeffs = (&list_coeffs[i])
.into_iter()
.map(|x| {
FieldElement::<BN254PrimeField>::from_bytes_be(&x)
FieldElement::from_bytes_be(&x)
.map_err(|e| format!("Byte conversion error: {:?}", e))
})
.collect::<Result<Vec<FieldElement<BN254PrimeField>>, _>>()?;
Expand Down Expand Up @@ -54,7 +54,7 @@ pub fn nondeterministic_extension_field_mul_divmod(
let coeffs = (&list_coeffs[i])
.into_iter()
.map(|x| {
FieldElement::<BLS12381PrimeField>::from_bytes_be(&x)
FieldElement::from_bytes_be(&x)
.map_err(|e| format!("Byte conversion error: {:?}", e))
})
.collect::<Result<Vec<FieldElement<BLS12381PrimeField>>, _>>()?;
Expand Down Expand Up @@ -89,7 +89,7 @@ pub fn extf_mul<F: IsPrimeField + CurveParamsProvider<F>>(
z_poly = z_poly.mul_with_ref(&ps[i]);
}

let p_irr = (F::get_curve_params().irreducible_polys)(ext_degree);
let p_irr = get_irreducible_poly(ext_degree);

let (mut z_polyq, mut z_polyr) = z_poly.divmod(&p_irr);
assert!(z_polyr.coefficients.len() <= ext_degree);
Expand Down

0 comments on commit 97d3e98

Please sign in to comment.