sp_crypto_ec_utils/
ed_on_bls12_377.rs1use crate::utils::{self, HostcallResult, FAIL_MSG};
21use alloc::vec::Vec;
22use ark_ec::{AffineRepr, CurveConfig, CurveGroup};
23use ark_ed_on_bls12_377_ext::CurveHooks;
24use sp_runtime_interface::{
25 pass_by::{PassFatPointerAndRead, PassFatPointerAndWrite},
26 runtime_interface,
27};
28
29pub type EdwardsConfig = ark_ed_on_bls12_377_ext::EdwardsConfig<HostHooks>;
31pub type EdwardsAffine = ark_ed_on_bls12_377_ext::EdwardsAffine<HostHooks>;
33pub type EdwardsProjective = ark_ed_on_bls12_377_ext::EdwardsProjective<HostHooks>;
35
36pub type ScalarField = <EdwardsConfig as CurveConfig>::ScalarField;
38
39#[derive(Copy, Clone)]
41pub struct HostHooks;
42
43impl CurveHooks for HostHooks {
44 fn msm(bases: &[EdwardsAffine], scalars: &[ScalarField]) -> EdwardsProjective {
45 let mut out = utils::buffer_for::<EdwardsAffine>();
46 host_calls::ed_on_bls12_377_msm(&utils::encode(bases), &utils::encode(scalars), &mut out)
47 .and_then(|_| utils::decode::<EdwardsAffine>(&out))
48 .expect(FAIL_MSG)
49 .into_group()
50 }
51
52 fn mul_projective(base: &EdwardsProjective, scalar: &[u64]) -> EdwardsProjective {
53 let mut out = utils::buffer_for::<EdwardsAffine>();
54 host_calls::ed_on_bls12_377_mul(
55 &utils::encode(base.into_affine()),
56 &utils::encode(scalar),
57 &mut out,
58 )
59 .and_then(|_| utils::decode::<EdwardsAffine>(&out))
60 .expect(FAIL_MSG)
61 .into_group()
62 }
63}
64
65#[runtime_interface]
73pub trait HostCalls {
74 fn ed_on_bls12_377_msm(
81 bases: PassFatPointerAndRead<&[u8]>,
82 scalars: PassFatPointerAndRead<&[u8]>,
83 out: PassFatPointerAndWrite<&mut [u8]>,
84 ) -> HostcallResult {
85 utils::msm_te::<ark_ed_on_bls12_377::EdwardsConfig>(bases, scalars, out)
86 }
87
88 fn ed_on_bls12_377_mul(
95 base: PassFatPointerAndRead<&[u8]>,
96 scalar: PassFatPointerAndRead<&[u8]>,
97 out: PassFatPointerAndWrite<&mut [u8]>,
98 ) -> HostcallResult {
99 utils::mul_te::<ark_ed_on_bls12_377::EdwardsConfig>(base, scalar, out)
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use super::*;
106 use crate::utils::testing::*;
107
108 #[test]
109 fn mul_works() {
110 mul_te_test::<EdwardsAffine, ark_ed_on_bls12_377::EdwardsAffine>();
111 }
112
113 #[test]
114 fn msm_works() {
115 msm_te_test::<EdwardsAffine, ark_ed_on_bls12_377::EdwardsAffine>();
116 }
117}