ed448_goldilocks/curve/
twedwards.rs1pub(crate) mod affine;
6pub(crate) mod extended;
7pub(crate) mod extensible;
8pub(crate) mod projective;
9
10use crate::field::FieldElement;
11
12pub(crate) struct IsogenyMap {
13 pub(crate) X: FieldElement,
14 pub(crate) Y: FieldElement,
15 pub(crate) Z: FieldElement,
16 pub(crate) T: FieldElement,
17}
18
19pub(crate) struct IsogenyMapResult {
20 pub(crate) X: FieldElement,
21 pub(crate) Y: FieldElement,
22 pub(crate) Z: FieldElement,
23 pub(crate) T1: FieldElement,
24 pub(crate) T2: FieldElement,
25}
26
27impl IsogenyMap {
28 pub(crate) fn map(&self, scale: impl FnOnce(FieldElement) -> FieldElement) -> IsogenyMapResult {
30 let xx = self.X.square();
50 let yy = self.Y.square();
51 let axx = scale(xx);
52 let yy_plus_axx = yy + axx;
53
54 let x_numerator = (self.T * self.Z).double();
56 let x_denom = yy - axx;
57
58 let y_numerator = yy_plus_axx;
60 let y_denom = self.Z.square().double() - yy_plus_axx;
61
62 let X = x_numerator * y_denom;
63 let Y = y_numerator * x_denom;
64 let Z = x_denom * y_denom;
65 let T1 = x_numerator;
66 let T2 = y_numerator;
67
68 IsogenyMapResult { X, Y, Z, T1, T2 }
69 }
70}