pub mod authenticated_scalar;
pub mod authenticated_stark_point;
pub mod macros;
pub mod mpc_scalar;
pub mod mpc_stark_point;
pub mod scalar;
pub mod stark_curve;
#[cfg(test)]
pub(crate) mod test_helper {
use std::iter;
use super::{scalar::Scalar, stark_curve::StarkPoint};
use ark_ec::CurveGroup;
use ark_ff::PrimeField;
use num_bigint::BigUint;
use rand::thread_rng;
use starknet::core::types::FieldElement as StarknetFelt;
use starknet_curve::{AffinePoint, ProjectivePoint};
pub fn random_point() -> StarkPoint {
let mut rng = thread_rng();
let scalar = Scalar::random(&mut rng);
let point = StarkPoint::generator() * scalar;
point * scalar
}
pub fn starknet_felt_to_biguint(felt: &StarknetFelt) -> BigUint {
BigUint::from_bytes_be(&felt.to_bytes_be())
}
pub fn biguint_to_starknet_felt(biguint: &BigUint) -> StarknetFelt {
let bytes = biguint.to_bytes_be();
let padded_bytes = iter::repeat(0u8)
.take(32 - bytes.len())
.chain(bytes.iter().cloned())
.collect::<Vec<_>>();
StarknetFelt::from_bytes_be(&padded_bytes.try_into().unwrap()).unwrap()
}
pub fn prime_field_to_biguint<F: PrimeField>(val: &F) -> BigUint {
(*val).into()
}
pub fn prime_field_to_starknet_felt<F: PrimeField>(scalar: &F) -> StarknetFelt {
biguint_to_starknet_felt(&prime_field_to_biguint(scalar))
}
pub fn arkworks_point_to_starknet(point: &StarkPoint) -> ProjectivePoint {
let affine = point.0.into_affine();
let x = prime_field_to_starknet_felt(&affine.x);
let y = prime_field_to_starknet_felt(&affine.y);
ProjectivePoint::from_affine_point(&AffinePoint {
x,
y,
infinity: false,
})
}
pub fn starknet_rs_scalar_mul(
scalar: &StarknetFelt,
point: &ProjectivePoint,
) -> ProjectivePoint {
let bits = scalar.to_bits_le();
point * &bits
}
pub fn compare_scalars<F: PrimeField>(s1: &F, s2: &StarknetFelt) -> bool {
let s1_biguint = prime_field_to_biguint(s1);
let s2_biguint = starknet_felt_to_biguint(s2);
s1_biguint == s2_biguint
}
pub fn compare_points(p1: &StarkPoint, p2: &ProjectivePoint) -> bool {
let p1_affine = p1.0.into_affine();
let x_1 = p1_affine.x;
let y_1 = p1_affine.y;
let z_inv = p2.z.invert().unwrap();
let x_2 = p2.x * z_inv;
let y_2 = p2.y * z_inv;
compare_scalars(&x_1, &x_2) && compare_scalars(&y_1, &y_2)
}
}