ark_vrf/utils/
te_sw_map.rs1use ark_ec::{
7 CurveConfig,
8 short_weierstrass::{Affine as SWAffine, SWCurveConfig},
9 twisted_edwards::{Affine as TEAffine, MontCurveConfig, TECurveConfig},
10};
11use ark_ff::{Field, One};
12use ark_std::borrow::Cow;
13use ark_std::vec::Vec;
14
15pub trait MapConfig: TECurveConfig + SWCurveConfig + MontCurveConfig {
21 const MONT_A_OVER_THREE: <Self as CurveConfig>::BaseField;
23
24 const MONT_B_INV: <Self as CurveConfig>::BaseField;
26}
27
28pub fn sw_to_te<C: MapConfig>(point: &SWAffine<C>) -> Option<TEAffine<C>> {
33 let mx = <C as MontCurveConfig>::COEFF_B * point.x - C::MONT_A_OVER_THREE;
36 let my = <C as MontCurveConfig>::COEFF_B * point.y;
37
38 let v_denom = my.inverse()?;
41 let x_p_1 = mx + <<C as CurveConfig>::BaseField as One>::one();
42 let w_denom = x_p_1.inverse()?;
43 let v = mx * v_denom;
44 let w = (mx - <<C as CurveConfig>::BaseField as One>::one()) * w_denom;
45
46 Some(TEAffine::new_unchecked(v, w))
47}
48
49pub fn te_to_sw<C: MapConfig>(point: &TEAffine<C>) -> Option<SWAffine<C>> {
54 let v_denom = <<C as CurveConfig>::BaseField as One>::one() - point.y;
56 let w_denom = point.x - point.x * point.y;
57 let v_denom_inv = v_denom.inverse()?;
58 let w_denom_inv = w_denom.inverse()?;
59 let v_w_num = <<C as CurveConfig>::BaseField as One>::one() + point.y;
60 let v = v_w_num * v_denom_inv;
61 let w = v_w_num * w_denom_inv;
62
63 let x = C::MONT_B_INV * (v + C::MONT_A_OVER_THREE);
65 let y = C::MONT_B_INV * w;
66
67 Some(SWAffine::new_unchecked(x, y))
68}
69
70pub trait SWMapping<C: SWCurveConfig>: Sized {
75 fn from_sw(sw: SWAffine<C>) -> Option<Self>;
79
80 fn into_sw(self) -> Option<SWAffine<C>>;
84
85 fn to_sw_slice(slice: &[Self]) -> Option<Cow<'_, [SWAffine<C>]>>;
91}
92
93impl<C: SWCurveConfig> SWMapping<C> for SWAffine<C> {
94 #[inline(always)]
95 fn from_sw(sw: SWAffine<C>) -> Option<Self> {
96 Some(sw)
97 }
98
99 #[inline(always)]
100 fn into_sw(self) -> Option<SWAffine<C>> {
101 Some(self)
102 }
103
104 #[inline(always)]
105 fn to_sw_slice(slice: &[Self]) -> Option<Cow<'_, [SWAffine<C>]>> {
106 Some(Cow::Borrowed(slice))
107 }
108}
109
110impl<C: MapConfig> SWMapping<C> for TEAffine<C> {
111 #[inline(always)]
112 fn from_sw(sw: SWAffine<C>) -> Option<Self> {
113 sw_to_te(&sw)
114 }
115
116 #[inline(always)]
117 fn into_sw(self) -> Option<SWAffine<C>> {
118 te_to_sw(&self)
119 }
120
121 #[inline(always)]
122 fn to_sw_slice(slice: &[Self]) -> Option<Cow<'_, [SWAffine<C>]>> {
123 let pks;
124 #[cfg(feature = "parallel")]
125 {
126 use rayon::prelude::*;
127 pks = slice
128 .par_iter()
129 .map(|p| te_to_sw(p))
130 .collect::<Option<Vec<_>>>()?;
131 }
132 #[cfg(not(feature = "parallel"))]
133 {
134 pks = slice
135 .iter()
136 .map(|p| te_to_sw(p))
137 .collect::<Option<Vec<_>>>()?;
138 }
139 Some(Cow::Owned(pks))
140 }
141}
142
143pub trait TEMapping<C: TECurveConfig>: Sized {
148 fn from_te(te: TEAffine<C>) -> Option<Self>;
152
153 fn into_te(self) -> Option<TEAffine<C>>;
157
158 fn to_te_slice(slice: &[Self]) -> Option<Cow<'_, [TEAffine<C>]>>;
164}
165
166impl<C: TECurveConfig> TEMapping<C> for TEAffine<C> {
167 #[inline(always)]
168 fn from_te(te: TEAffine<C>) -> Option<Self> {
169 Some(te)
170 }
171
172 #[inline(always)]
173 fn into_te(self) -> Option<TEAffine<C>> {
174 Some(self)
175 }
176
177 #[inline(always)]
178 fn to_te_slice(slice: &[Self]) -> Option<Cow<'_, [TEAffine<C>]>> {
179 Some(Cow::Borrowed(slice))
180 }
181}
182
183impl<C: MapConfig> TEMapping<C> for SWAffine<C> {
184 #[inline(always)]
185 fn from_te(te: TEAffine<C>) -> Option<Self> {
186 te_to_sw(&te)
187 }
188
189 #[inline(always)]
190 fn into_te(self) -> Option<TEAffine<C>> {
191 sw_to_te(&self)
192 }
193
194 #[inline(always)]
195 fn to_te_slice(slice: &[Self]) -> Option<Cow<'_, [TEAffine<C>]>> {
196 let pks;
197 #[cfg(feature = "parallel")]
198 {
199 use rayon::prelude::*;
200 pks = slice
201 .par_iter()
202 .map(|p| sw_to_te(p))
203 .collect::<Option<Vec<_>>>()?;
204 }
205 #[cfg(not(feature = "parallel"))]
206 {
207 pks = slice
208 .iter()
209 .map(|p| sw_to_te(p))
210 .collect::<Option<Vec<_>>>()?;
211 }
212 Some(Cow::Owned(pks))
213 }
214}