sp_crypto_ec_utils/
ed_on_bls12_381_bandersnatch.rs1use crate::utils;
22use alloc::vec::Vec;
23use ark_ec::CurveConfig;
24use ark_ed_on_bls12_381_bandersnatch_ext::CurveHooks;
25use sp_runtime_interface::{
26 pass_by::{AllocateAndReturnByCodec, PassFatPointerAndRead},
27 runtime_interface,
28};
29
30#[derive(Copy, Clone)]
32pub struct HostHooks;
33
34pub type BandersnatchConfig = ark_ed_on_bls12_381_bandersnatch_ext::BandersnatchConfig<HostHooks>;
36pub type EdwardsConfig = ark_ed_on_bls12_381_bandersnatch_ext::EdwardsConfig<HostHooks>;
38pub type EdwardsAffine = ark_ed_on_bls12_381_bandersnatch_ext::EdwardsAffine<HostHooks>;
40pub type EdwardsProjective = ark_ed_on_bls12_381_bandersnatch_ext::EdwardsProjective<HostHooks>;
42pub type SWConfig = ark_ed_on_bls12_381_bandersnatch_ext::SWConfig<HostHooks>;
44pub type SWAffine = ark_ed_on_bls12_381_bandersnatch_ext::SWAffine<HostHooks>;
46pub type SWProjective = ark_ed_on_bls12_381_bandersnatch_ext::SWProjective<HostHooks>;
48
49impl CurveHooks for HostHooks {
50 fn msm_te(
51 bases: &[EdwardsAffine],
52 scalars: &[<EdwardsConfig as CurveConfig>::ScalarField],
53 ) -> EdwardsProjective {
54 host_calls::ed_on_bls12_381_bandersnatch_te_msm(
55 utils::encode(bases),
56 utils::encode(scalars),
57 )
58 .and_then(|res| utils::decode_proj_te(res))
59 .unwrap_or_default()
60 }
61
62 fn mul_projective_te(base: &EdwardsProjective, scalar: &[u64]) -> EdwardsProjective {
63 host_calls::ed_on_bls12_381_bandersnatch_te_mul_projective(
64 utils::encode_proj_te(base),
65 utils::encode(scalar),
66 )
67 .and_then(|res| utils::decode_proj_te(res))
68 .unwrap_or_default()
69 }
70
71 fn msm_sw(
72 bases: &[SWAffine],
73 scalars: &[<SWConfig as CurveConfig>::ScalarField],
74 ) -> SWProjective {
75 host_calls::ed_on_bls12_381_bandersnatch_sw_msm(
76 utils::encode(bases),
77 utils::encode(scalars),
78 )
79 .and_then(|res| utils::decode_proj_sw(res))
80 .unwrap_or_default()
81 }
82
83 fn mul_projective_sw(base: &SWProjective, scalar: &[u64]) -> SWProjective {
84 host_calls::ed_on_bls12_381_bandersnatch_sw_mul_projective(
85 utils::encode_proj_sw(base),
86 utils::encode(scalar),
87 )
88 .and_then(|res| utils::decode_proj_sw(res))
89 .unwrap_or_default()
90 }
91}
92
93#[runtime_interface]
102pub trait HostCalls {
103 fn ed_on_bls12_381_bandersnatch_te_msm(
110 bases: PassFatPointerAndRead<Vec<u8>>,
111 scalars: PassFatPointerAndRead<Vec<u8>>,
112 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
113 utils::msm_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(bases, scalars)
114 }
115
116 fn ed_on_bls12_381_bandersnatch_te_mul_projective(
123 base: PassFatPointerAndRead<Vec<u8>>,
124 scalar: PassFatPointerAndRead<Vec<u8>>,
125 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
126 utils::mul_projective_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(base, scalar)
127 }
128
129 fn ed_on_bls12_381_bandersnatch_sw_msm(
136 bases: PassFatPointerAndRead<Vec<u8>>,
137 scalars: PassFatPointerAndRead<Vec<u8>>,
138 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
139 utils::msm_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(bases, scalars)
140 }
141
142 fn ed_on_bls12_381_bandersnatch_sw_mul_projective(
149 base: PassFatPointerAndRead<Vec<u8>>,
150 scalar: PassFatPointerAndRead<Vec<u8>>,
151 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
152 utils::mul_projective_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(base, scalar)
153 }
154}