use crate::utils;
use alloc::vec::Vec;
use ark_ec::CurveConfig;
use ark_ed_on_bls12_377_ext::CurveHooks;
use pezsp_runtime_interface::{
pass_by::{AllocateAndReturnByCodec, PassFatPointerAndRead},
runtime_interface,
};
#[derive(Copy, Clone)]
pub struct HostHooks;
pub type EdwardsConfig = ark_ed_on_bls12_377_ext::EdwardsConfig<HostHooks>;
pub type EdwardsAffine = ark_ed_on_bls12_377_ext::EdwardsAffine<HostHooks>;
pub type EdwardsProjective = ark_ed_on_bls12_377_ext::EdwardsProjective<HostHooks>;
impl CurveHooks for HostHooks {
fn msm(
bases: &[EdwardsAffine],
scalars: &[<EdwardsConfig as CurveConfig>::ScalarField],
) -> EdwardsProjective {
host_calls::ed_on_bls12_377_te_msm(utils::encode(bases), utils::encode(scalars))
.and_then(|res| utils::decode_proj_te(res))
.unwrap_or_default()
}
fn mul_projective(base: &EdwardsProjective, scalar: &[u64]) -> EdwardsProjective {
host_calls::ed_on_bls12_377_te_mul_projective(
utils::encode_proj_te(base),
utils::encode(scalar),
)
.and_then(|res| utils::decode_proj_te(res))
.unwrap_or_default()
}
}
#[runtime_interface]
pub trait HostCalls {
fn ed_on_bls12_377_te_msm(
bases: PassFatPointerAndRead<Vec<u8>>,
scalars: PassFatPointerAndRead<Vec<u8>>,
) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
utils::msm_te::<ark_ed_on_bls12_377::EdwardsConfig>(bases, scalars)
}
fn ed_on_bls12_377_te_mul_projective(
base: PassFatPointerAndRead<Vec<u8>>,
scalar: PassFatPointerAndRead<Vec<u8>>,
) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
utils::mul_projective_te::<ark_ed_on_bls12_377::EdwardsConfig>(base, scalar)
}
}