Skip to content

Commit eb5ba09

Browse files
instantiate Edwards-Montgomery isomorphism for Curve25519 (#1847)
1 parent 1452648 commit eb5ba09

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

src/Algebra/Group.v

+10
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ Section Homomorphism.
8787
apply inv_unique.
8888
rewrite <- Monoid.homomorphism, left_inverse, homomorphism_id; reflexivity.
8989
Qed.
90+
91+
Lemma compose_homomorphism
92+
{H2 eq2 op2 id2 inv2} {groupH2:@group H2 eq2 op2 id2 inv2}
93+
{phi2:H->H2}`{homom2:@Monoid.is_homomorphism H eq op H2 eq2 op2 phi2}
94+
: @Monoid.is_homomorphism G EQ OP H2 eq2 op2 (fun x => phi2 (phi x)).
95+
Proof.
96+
split; repeat intro.
97+
{ do 2 rewrite homomorphism. f_equiv. }
98+
{ f_equiv. f_equiv. trivial. }
99+
Qed.
90100
End Homomorphism.
91101

92102
Section GroupByIsomorphism.

src/Curves/EdwardsMontgomery25519.v

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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.

src/Spec/Curve25519.v

+10
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,17 @@ Require Import Spec.CompleteEdwardsCurve.
8282
Module E.
8383
Definition a : F := F.opp 1.
8484
Definition d : F := F.div (F.opp (F.of_Z _ 121665)) (F.of_Z _ 121666).
85+
86+
Lemma nonzero_a : a <> F.zero. Proof. Decidable.vm_decide. Qed.
87+
Lemma square_a : exists sqrt_a, F.mul sqrt_a sqrt_a = a.
88+
Proof. epose (@PrimeFieldTheorems.F.Decidable_square p prime_p eq_refl); Decidable.vm_decide. Qed.
89+
Lemma nonsquare_d : forall x, F.mul x x <> d.
90+
Proof. epose (@PrimeFieldTheorems.F.Decidable_square p prime_p eq_refl); Decidable.vm_decide. Qed.
91+
8592
Definition point := @E.point F eq F.one F.add F.mul a d.
93+
Definition add := E.add(field:=field)(char_ge_3:=char_ge_3)(a:=a)(d:=d)
94+
(nonzero_a:=nonzero_a)(square_a:=square_a)(nonsquare_d:=nonsquare_d).
95+
Definition zero := E.zero(field:=field)(a:=a)(d:=d)(nonzero_a:=nonzero_a).
8696
Definition B : E.point.
8797
refine (
8898
exist _ (F.of_Z _ 15112221349535400772501151409588531511454012693041857206046113283949847762202, F.div (F.of_Z _ 4) (F.of_Z _ 5)) _).

0 commit comments

Comments
 (0)