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 ed_on_bls12_381_bandersnatch_te_msm(
51 bases: &[EdwardsAffine],
52 scalars: &[<EdwardsConfig as CurveConfig>::ScalarField],
53 ) -> Result<EdwardsProjective, ()> {
54 let bases = utils::encode(bases);
55 let scalars = utils::encode(scalars);
56 let res =
57 host_calls::ed_on_bls12_381_bandersnatch_te_msm(bases, scalars).unwrap_or_default();
58 utils::decode_proj_te(res)
59 }
60
61 fn ed_on_bls12_381_bandersnatch_te_mul_projective(
62 base: &EdwardsProjective,
63 scalar: &[u64],
64 ) -> Result<EdwardsProjective, ()> {
65 let base = utils::encode_proj_te(base);
66 let scalar = utils::encode(scalar);
67 let res = host_calls::ed_on_bls12_381_bandersnatch_te_mul_projective(base, scalar)
68 .unwrap_or_default();
69 utils::decode_proj_te(res)
70 }
71
72 fn ed_on_bls12_381_bandersnatch_sw_msm(
73 bases: &[SWAffine],
74 scalars: &[<SWConfig as CurveConfig>::ScalarField],
75 ) -> Result<SWProjective, ()> {
76 let bases = utils::encode(bases);
77 let scalars = utils::encode(scalars);
78 let res =
79 host_calls::ed_on_bls12_381_bandersnatch_sw_msm(bases, scalars).unwrap_or_default();
80 utils::decode_proj_sw(res)
81 }
82
83 fn ed_on_bls12_381_bandersnatch_sw_mul_projective(
84 base: &SWProjective,
85 scalar: &[u64],
86 ) -> Result<SWProjective, ()> {
87 let base = utils::encode_proj_sw(base);
88 let scalar = utils::encode(scalar);
89 let res = host_calls::ed_on_bls12_381_bandersnatch_sw_mul_projective(base, scalar)
90 .unwrap_or_default();
91 utils::decode_proj_sw(res)
92 }
93}
94
95#[runtime_interface]
104pub trait HostCalls {
105 fn ed_on_bls12_381_bandersnatch_te_msm(
112 bases: PassFatPointerAndRead<Vec<u8>>,
113 scalars: PassFatPointerAndRead<Vec<u8>>,
114 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
115 utils::msm_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(bases, scalars)
116 }
117
118 fn ed_on_bls12_381_bandersnatch_te_mul_projective(
125 base: PassFatPointerAndRead<Vec<u8>>,
126 scalar: PassFatPointerAndRead<Vec<u8>>,
127 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
128 utils::mul_projective_te::<ark_ed_on_bls12_381_bandersnatch::EdwardsConfig>(base, scalar)
129 }
130
131 fn ed_on_bls12_381_bandersnatch_sw_msm(
138 bases: PassFatPointerAndRead<Vec<u8>>,
139 scalars: PassFatPointerAndRead<Vec<u8>>,
140 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
141 utils::msm_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(bases, scalars)
142 }
143
144 fn ed_on_bls12_381_bandersnatch_sw_mul_projective(
151 base: PassFatPointerAndRead<Vec<u8>>,
152 scalar: PassFatPointerAndRead<Vec<u8>>,
153 ) -> AllocateAndReturnByCodec<Result<Vec<u8>, ()>> {
154 utils::mul_projective_sw::<ark_ed_on_bls12_381_bandersnatch::SWConfig>(base, scalar)
155 }
156}