use super::utils::{self, HostcallResult, FAIL_MSG};
use crate::runtime_interface::{
pass_by::{PassFatPointerAndRead, PassFatPointerAndWrite},
runtime_interface,
};
use alloc::vec::Vec;
use ark_ec::{AffineRepr, CurveConfig, CurveGroup};
use ark_ed_on_bls12_377_ext::CurveHooks;
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>;
pub type ScalarField = <EdwardsConfig as CurveConfig>::ScalarField;
#[derive(Copy, Clone)]
pub struct HostHooks;
impl CurveHooks for HostHooks {
fn msm(bases: &[EdwardsAffine], scalars: &[ScalarField]) -> EdwardsProjective {
let mut out = utils::buffer_for::<EdwardsAffine>();
host_calls::ed_on_bls12_377_msm(&utils::encode(bases), &utils::encode(scalars), &mut out)
.and_then(|_| utils::decode::<EdwardsAffine>(&out))
.expect(FAIL_MSG)
.into_group()
}
fn mul_projective(base: &EdwardsProjective, scalar: &[u64]) -> EdwardsProjective {
let mut out = utils::buffer_for::<EdwardsAffine>();
host_calls::ed_on_bls12_377_mul(
&utils::encode(base.into_affine()),
&utils::encode(scalar),
&mut out,
)
.and_then(|_| utils::decode::<EdwardsAffine>(&out))
.expect(FAIL_MSG)
.into_group()
}
}
#[runtime_interface]
pub trait HostCalls {
fn ed_on_bls12_377_msm(
bases: PassFatPointerAndRead<&[u8]>,
scalars: PassFatPointerAndRead<&[u8]>,
out: PassFatPointerAndWrite<&mut [u8]>,
) -> HostcallResult {
utils::msm_te::<ark_ed_on_bls12_377::EdwardsConfig>(bases, scalars, out)
}
fn ed_on_bls12_377_mul(
base: PassFatPointerAndRead<&[u8]>,
scalar: PassFatPointerAndRead<&[u8]>,
out: PassFatPointerAndWrite<&mut [u8]>,
) -> HostcallResult {
utils::mul_te::<ark_ed_on_bls12_377::EdwardsConfig>(base, scalar, out)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::crypto_ec_utils::utils::testing::*;
#[test]
fn mul_works() {
mul_te_test::<EdwardsAffine, ark_ed_on_bls12_377::EdwardsAffine>();
}
#[test]
fn msm_works() {
msm_te_test::<EdwardsAffine, ark_ed_on_bls12_377::EdwardsAffine>();
}
}