|
| 1 | +Require Import Coq.ZArith.ZArith. Local Open Scope Z_scope. |
| 2 | +Require Import Crypto.Spec.ModularArithmetic. Local Open Scope F_scope. |
| 3 | +Require Import Crypto.Curves.EdwardsMontgomery. Import M. |
| 4 | +Require Import Crypto.Curves.Edwards.TwistIsomorphism. |
| 5 | +Require Import Crypto.Spec.Curve25519. |
| 6 | + |
| 7 | +Local Definition sqrtm1 : F p := F.pow (F.of_Z _ 2) ((N.pos p-1)/4). |
| 8 | +Local Definition sqrt := PrimeFieldTheorems.F.sqrt_5mod8 sqrtm1. |
| 9 | + |
| 10 | +Import MontgomeryCurve CompleteEdwardsCurve. |
| 11 | + |
| 12 | +Local Definition a' := (M.a + (1 + 1)) / M.b. |
| 13 | +Local Definition d' := (M.a - (1 + 1)) / M.b. |
| 14 | +Definition r := sqrt (F.inv ((a' / M.b) / E.a)). |
| 15 | + |
| 16 | +Local Lemma is_twist : E.a * d' = a' * E.d. Proof. Decidable.vm_decide. Qed. |
| 17 | +Local Lemma nonzero_a' : a' <> 0. Proof. Decidable.vm_decide. Qed. |
| 18 | +Local Lemma r_correct : E.a = r * r * a'. Proof. Decidable.vm_decide. Qed. |
| 19 | + |
| 20 | +Definition Montgomery_of_Edwards (P : Curve25519.E.point) : Curve25519.M.point := |
| 21 | + @of_Edwards _ _ _ _ _ _ _ _ _ _ field _ char_ge_3 M.a M.b M.b_nonzero a' d' eq_refl eq_refl nonzero_a' |
| 22 | + (@E.point2_of_point1 _ _ _ _ _ _ _ _ _ _ field _ E.a E.d a' d' is_twist E.nonzero_a nonzero_a' r r_correct P). |
| 23 | + |
| 24 | +Definition Edwards_of_Montgomery (P : Curve25519.M.point) : Curve25519.E.point := |
| 25 | + @E.point1_of_point2 _ _ _ _ _ _ _ _ _ _ field _ E.a E.d a' d' is_twist E.nonzero_a nonzero_a' r r_correct |
| 26 | + (@to_Edwards _ _ _ _ _ _ _ _ _ _ field _ M.a M.b M.b_nonzero a' d' eq_refl eq_refl nonzero_a' P). |
| 27 | + |
| 28 | +Local Notation Eopp := ((@AffineProofs.E.opp _ _ _ _ _ _ _ _ _ _ field _ E.a E.d E.nonzero_a)). |
| 29 | + |
| 30 | +Local Arguments Hierarchy.commutative_group _ {_} _ {_ _}. |
| 31 | +Local Arguments CompleteEdwardsCurve.E.add {_ _ _ _ _ _ _ _ _ _ _ _ _} _ _ {_ _ _}. |
| 32 | +Local Arguments Monoid.is_homomorphism {_ _ _ _ _ _}. |
| 33 | +Local Arguments to_Edwards {_ _ _ _ _ _ _ _ _ _ _ _ _ _ _} _ _ { _ _ _ }. |
| 34 | +Local Arguments of_Edwards {_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _} _ _ { _ _ _ }. |
| 35 | + |
| 36 | +Lemma EdwardsMontgomery25519 : @Group.isomorphic_commutative_groups |
| 37 | + Curve25519.E.point E.eq Curve25519.E.add Curve25519.E.zero Eopp Curve25519.M.point |
| 38 | + M.eq Curve25519.M.add M.zero Curve25519.M.opp |
| 39 | + Montgomery_of_Edwards Edwards_of_Montgomery. |
| 40 | +Proof. |
| 41 | + cbv [Montgomery_of_Edwards Edwards_of_Montgomery]. |
| 42 | + epose proof E.twist_isomorphism(a1:=E.a)(a2:=a')(d1:=E.d)(d2:=d')(r:=r) as AB. |
| 43 | + epose proof EdwardsMontgomeryIsomorphism(a:=Curve25519.M.a)(b:=Curve25519.M.b)as BC. |
| 44 | + destruct AB as [A B ab ba], BC as [_ C bc cb]. |
| 45 | + pose proof Group.compose_homomorphism(homom:=ab)(homom2:=bc) as ac. |
| 46 | + pose proof Group.compose_homomorphism(homom:=cb)(homom2:=ba)(groupH2:=ltac:(eapply A)) as ca. |
| 47 | + split; try exact ac; try exact ca; try exact A; try exact C. |
| 48 | + Unshelve. |
| 49 | + all : try (pose (@PrimeFieldTheorems.F.Decidable_square p prime_p eq_refl); Decidable.vm_decide). |
| 50 | + all : try (eapply Hierarchy.char_ge_weaken; try apply ModularArithmeticTheorems.F.char_gt; Decidable.vm_decide). |
| 51 | +Qed. |
0 commit comments