From 406085b41e0b4d8cfc314da7abd3af4ac29d765b Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Tue, 8 Mar 2016 14:29:57 -0500 Subject: Use [rewrite] rather than [change] to speed up Qed [Opaque] tells kernel unification to defer unfolding a constant as long as possible. This is not a problem for [change], when the functions are small and directly convertible. It's disastrous for [Qed]/[Defined], which (if I understand correctly) try to unify [Opaquemul x' y'] with [mul x y] by fully unfolding [mul] and [x] and [y] before trying to unfold [Opaquemul]; when [x] and [y] are large, this takes a very long time. Rewrite avoids this by telling Coq *how* to unify [Opaquemul x' y'] with [mul x y] (namely, by unifying [Opaquemul] with [mul], and then [x] with [x'] and [y] with [y']). --- src/ModularArithmetic/FField.v | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/ModularArithmetic/FField.v b/src/ModularArithmetic/FField.v index cd293056f..ac2ef48b5 100644 --- a/src/ModularArithmetic/FField.v +++ b/src/ModularArithmetic/FField.v @@ -14,6 +14,10 @@ Definition Opaquediv {p} : OpaqueF p -> OpaqueF p -> OpaqueF p := @div p. Definition Opaqueopp {p} : OpaqueF p -> OpaqueF p := @opp p. Definition Opaqueinv {p} : OpaqueF p -> OpaqueF p := @inv p. Definition OpaqueZToField {p} : BinInt.Z -> OpaqueF p := @ZToField p. +Definition Opaqueadd_correct {p} : @Opaqueadd p = @add p := eq_refl. +Definition Opaquesub_correct {p} : @Opaquesub p = @sub p := eq_refl. +Definition Opaquemul_correct {p} : @Opaquemul p = @mul p := eq_refl. +Definition Opaquediv_correct {p} : @Opaquediv p = @div p := eq_refl. Global Opaque F OpaqueZmodulo Opaqueadd Opaquemul Opaquesub Opaquediv Opaqueopp Opaqueinv OpaqueZToField. Definition OpaqueFieldTheory p {prime_p} : @field_theory (OpaqueF p) (OpaqueZToField 0%Z) (OpaqueZToField 1%Z) Opaqueadd Opaquemul Opaquesub Opaqueopp Opaquediv Opaqueinv eq := Eval hnf in @Ffield_theory p prime_p. @@ -26,7 +30,7 @@ Ltac FIELD_SIMPL_idtac FLD lH rl := get_FldPost FLD (). Ltac field_simplify_eq_idtac := let G := Get_goal in field_lookup (PackField FIELD_SIMPL_idtac) [] G. -Ltac F_to_Opaque := +Ltac F_to_Opaque := change F with OpaqueF in *; change BinInt.Z.modulo with OpaqueZmodulo in *; change @add with @Opaqueadd in *; @@ -41,13 +45,10 @@ Ltac F_from_Opaque p := change OpaqueF with F in *; change (@sig BinNums.Z (fun z : BinNums.Z => @eq BinNums.Z z (BinInt.Z.modulo z p))) with (F p) in *; change OpaqueZmodulo with BinInt.Z.modulo in *; - change @Opaqueadd with @add in *; - change @Opaquemul with @mul in *; - change @Opaquesub with @sub in *; - change @Opaquediv with @div in *; change @Opaqueopp with @opp in *; change @Opaqueinv with @inv in *; - change @OpaqueZToField with @ZToField in *. + change @OpaqueZToField with @ZToField in *; + rewrite ?@Opaqueadd_correct, ?@Opaquesub_correct, ?@Opaquemul_correct, ?@Opaquediv_correct in *. Ltac F_field_simplify_eq := lazymatch goal with |- @eq (F ?p) _ _ => @@ -59,4 +60,4 @@ Ltac F_field_simplify_eq := Ltac F_field := F_field_simplify_eq; [ring|..]. -Ltac notConstant t := constr:NotConstant. \ No newline at end of file +Ltac notConstant t := constr:NotConstant. -- cgit v1.2.3 From 003f348b0b69236309467d8e543c4da2c853de1b Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Tue, 8 Mar 2016 14:38:46 -0500 Subject: Remove [Admitted]; [Qed] is now under a second --- src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v b/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v index 01b3584c0..8ef1b95d4 100644 --- a/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v +++ b/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v @@ -18,10 +18,10 @@ Section CompleteEdwardsCurveTheorems. postprocess [Fpostprocess; try exact Fq_1_neq_0; try assumption], constants [Fconstant], div (@Fmorph_div_theory q), - power_tac (@Fpower_theory q) [Fexp_tac]). + power_tac (@Fpower_theory q) [Fexp_tac]). Add Field Ffield_notConstant : (OpaqueFieldTheory q) - (constants [notConstant]). + (constants [notConstant]). Ltac clear_prm := generalize dependent a; intro a; intros; @@ -34,7 +34,7 @@ Section CompleteEdwardsCurveTheorems. mkPoint p1 pf1 = mkPoint p2 pf2. Proof. destruct p1, p2; intros; find_injection; intros; subst; apply f_equal. - apply UIP_dec, F_eq_dec. (* this is a hack. We actually don't care about the equality of the proofs. However, we *can* prove it, and knowing it lets us use the universal equality instead of a type-specific equivalence, which makes many things nicer. *) + apply UIP_dec, F_eq_dec. (* this is a hack. We actually don't care about the equality of the proofs. However, we *can* prove it, and knowing it lets us use the universal equality instead of a type-specific equivalence, which makes many things nicer. *) Qed. Hint Resolve point_eq. @@ -55,11 +55,11 @@ Section CompleteEdwardsCurveTheorems. Lemma twistedAddAssoc : forall A B C, (A+(B+C) = (A+B)+C)%E. Proof. - (* The Ltac takes ~15s, the Qed takes longer than I have had patience for *) + (* The Ltac takes ~15s, the Qed no longer takes longer than I have had patience for *) Edefn; F_field_simplify_eq; try abstract (rewrite ?@F_pow_2_r in *; clear_prm; F_nsatz); repeat split; match goal with [ |- _ = 0%F -> False ] => admit end; fail "unreachable". - Admitted. + Qed. Lemma zeroIsIdentity : forall P, (P + zero = P)%E. Proof. -- cgit v1.2.3 From dbe09dd5bfc2595cb9fd96725d87d9a729cd0247 Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Thu, 10 Mar 2016 13:45:37 -0500 Subject: Absolutize Coqprime imports Used ```bash cd coqprime make -kj10 cd Coqprime git ls-files "*.v" | xargs python ~/Documents/repos/coq-tools/absolutize-imports.py -i -R . Coqprime ``` --- coqprime/Coqprime/Cyclic.v | 14 +++++++------- coqprime/Coqprime/EGroup.v | 18 +++++++++--------- coqprime/Coqprime/Euler.v | 8 ++++---- coqprime/Coqprime/FGroup.v | 8 ++++---- coqprime/Coqprime/IGroup.v | 12 ++++++------ coqprime/Coqprime/Iterator.v | 6 +++--- coqprime/Coqprime/Lagrange.v | 12 ++++++------ coqprime/Coqprime/ListAux.v | 10 +++++----- coqprime/Coqprime/LucasLehmer.v | 22 +++++++++++----------- coqprime/Coqprime/NatAux.v | 2 +- coqprime/Coqprime/PGroup.v | 18 +++++++++--------- coqprime/Coqprime/Permutation.v | 4 ++-- coqprime/Coqprime/Pmod.v | 10 +++++----- coqprime/Coqprime/Pocklington.v | 16 ++++++++-------- coqprime/Coqprime/PocklingtonCertificat.v | 16 ++++++++-------- coqprime/Coqprime/Root.v | 10 +++++----- coqprime/Coqprime/ZCAux.v | 8 ++++---- coqprime/Coqprime/ZCmisc.v | 2 +- coqprime/Coqprime/ZProgression.v | 6 +++--- coqprime/Coqprime/ZSum.v | 12 ++++++------ coqprime/Coqprime/Zp.v | 18 +++++++++--------- 21 files changed, 116 insertions(+), 116 deletions(-) diff --git a/coqprime/Coqprime/Cyclic.v b/coqprime/Coqprime/Cyclic.v index c25f683ca..e2daa4d67 100644 --- a/coqprime/Coqprime/Cyclic.v +++ b/coqprime/Coqprime/Cyclic.v @@ -11,13 +11,13 @@ Proof that an abelien ring is cyclic ************************************************************************) -Require Import ZCAux. -Require Import List. -Require Import Root. -Require Import UList. -Require Import IGroup. -Require Import EGroup. -Require Import FGroup. +Require Import Coqprime.ZCAux. +Require Import Coq.Lists.List. +Require Import Coqprime.Root. +Require Import Coqprime.UList. +Require Import Coqprime.IGroup. +Require Import Coqprime.EGroup. +Require Import Coqprime.FGroup. Open Scope Z_scope. diff --git a/coqprime/Coqprime/EGroup.v b/coqprime/Coqprime/EGroup.v index fd543fe04..553cb746c 100644 --- a/coqprime/Coqprime/EGroup.v +++ b/coqprime/Coqprime/EGroup.v @@ -11,15 +11,15 @@ Given an element a, create the group {e, a, a^2, ..., a^n} **********************************************************************) -Require Import ZArith. -Require Import Tactic. -Require Import List. -Require Import ZCAux. -Require Import ZArith Znumtheory. -Require Import Wf_nat. -Require Import UList. -Require Import FGroup. -Require Import Lagrange. +Require Import Coq.ZArith.ZArith. +Require Import Coqprime.Tactic. +Require Import Coq.Lists.List. +Require Import Coqprime.ZCAux. +Require Import Coq.ZArith.ZArith Coq.ZArith.Znumtheory. +Require Import Coq.Arith.Wf_nat. +Require Import Coqprime.UList. +Require Import Coqprime.FGroup. +Require Import Coqprime.Lagrange. Open Scope Z_scope. diff --git a/coqprime/Coqprime/Euler.v b/coqprime/Coqprime/Euler.v index 06d92ce57..e571d8e3c 100644 --- a/coqprime/Coqprime/Euler.v +++ b/coqprime/Coqprime/Euler.v @@ -11,10 +11,10 @@ Definition of the Euler Totient function *************************************************************************) -Require Import ZArith. -Require Export Znumtheory. -Require Import Tactic. -Require Export ZSum. +Require Import Coq.ZArith.ZArith. +Require Export Coq.ZArith.Znumtheory. +Require Import Coqprime.Tactic. +Require Export Coqprime.ZSum. Open Scope Z_scope. diff --git a/coqprime/Coqprime/FGroup.v b/coqprime/Coqprime/FGroup.v index a55710e7c..0bcc9ebf1 100644 --- a/coqprime/Coqprime/FGroup.v +++ b/coqprime/Coqprime/FGroup.v @@ -13,10 +13,10 @@ Definition: FGroup **********************************************************************) -Require Import List. -Require Import UList. -Require Import Tactic. -Require Import ZArith. +Require Import Coq.Lists.List. +Require Import Coqprime.UList. +Require Import Coqprime.Tactic. +Require Import Coq.ZArith.ZArith. Open Scope Z_scope. diff --git a/coqprime/Coqprime/IGroup.v b/coqprime/Coqprime/IGroup.v index 11a73d414..04219be5a 100644 --- a/coqprime/Coqprime/IGroup.v +++ b/coqprime/Coqprime/IGroup.v @@ -13,12 +13,12 @@ Definition: ZpGroup **********************************************************************) -Require Import ZArith. -Require Import Tactic. -Require Import Wf_nat. -Require Import UList. -Require Import ListAux. -Require Import FGroup. +Require Import Coq.ZArith.ZArith. +Require Import Coqprime.Tactic. +Require Import Coq.Arith.Wf_nat. +Require Import Coqprime.UList. +Require Import Coqprime.ListAux. +Require Import Coqprime.FGroup. Open Scope Z_scope. diff --git a/coqprime/Coqprime/Iterator.v b/coqprime/Coqprime/Iterator.v index 96d3e5655..e84687cd4 100644 --- a/coqprime/Coqprime/Iterator.v +++ b/coqprime/Coqprime/Iterator.v @@ -6,9 +6,9 @@ (* Benjamin.Gregoire@inria.fr Laurent.Thery@inria.fr *) (*************************************************************) -Require Export List. -Require Export Permutation. -Require Import Arith. +Require Export Coq.Lists.List. +Require Export Coqprime.Permutation. +Require Import Coq.Arith.Arith. Section Iterator. Variables A B : Set. diff --git a/coqprime/Coqprime/Lagrange.v b/coqprime/Coqprime/Lagrange.v index b35460bad..b890c5621 100644 --- a/coqprime/Coqprime/Lagrange.v +++ b/coqprime/Coqprime/Lagrange.v @@ -14,12 +14,12 @@ Definition: lagrange **********************************************************************) -Require Import List. -Require Import UList. -Require Import ListAux. -Require Import ZArith Znumtheory. -Require Import NatAux. -Require Import FGroup. +Require Import Coq.Lists.List. +Require Import Coqprime.UList. +Require Import Coqprime.ListAux. +Require Import Coq.ZArith.ZArith Coq.ZArith.Znumtheory. +Require Import Coqprime.NatAux. +Require Import Coqprime.FGroup. Open Scope Z_scope. diff --git a/coqprime/Coqprime/ListAux.v b/coqprime/Coqprime/ListAux.v index c3c9602bd..4ed154685 100644 --- a/coqprime/Coqprime/ListAux.v +++ b/coqprime/Coqprime/ListAux.v @@ -11,11 +11,11 @@ Auxillary functions & Theorems **********************************************************************) -Require Export List. -Require Export Arith. -Require Export Tactic. -Require Import Inverse_Image. -Require Import Wf_nat. +Require Export Coq.Lists.List. +Require Export Coq.Arith.Arith. +Require Export Coqprime.Tactic. +Require Import Coq.Wellfounded.Inverse_Image. +Require Import Coq.Arith.Wf_nat. (************************************** Some properties on list operators: app, map,... diff --git a/coqprime/Coqprime/LucasLehmer.v b/coqprime/Coqprime/LucasLehmer.v index c3c255036..c459195a8 100644 --- a/coqprime/Coqprime/LucasLehmer.v +++ b/coqprime/Coqprime/LucasLehmer.v @@ -13,17 +13,17 @@ Definition: LucasLehmer **********************************************************************) -Require Import ZArith. -Require Import ZCAux. -Require Import Tactic. -Require Import Wf_nat. -Require Import NatAux. -Require Import UList. -Require Import ListAux. -Require Import FGroup. -Require Import EGroup. -Require Import PGroup. -Require Import IGroup. +Require Import Coq.ZArith.ZArith. +Require Import Coqprime.ZCAux. +Require Import Coqprime.Tactic. +Require Import Coq.Arith.Wf_nat. +Require Import Coqprime.NatAux. +Require Import Coqprime.UList. +Require Import Coqprime.ListAux. +Require Import Coqprime.FGroup. +Require Import Coqprime.EGroup. +Require Import Coqprime.PGroup. +Require Import Coqprime.IGroup. Open Scope Z_scope. diff --git a/coqprime/Coqprime/NatAux.v b/coqprime/Coqprime/NatAux.v index eab09150c..6df511eed 100644 --- a/coqprime/Coqprime/NatAux.v +++ b/coqprime/Coqprime/NatAux.v @@ -11,7 +11,7 @@ Auxillary functions & Theorems **********************************************************************) -Require Export Arith. +Require Export Coq.Arith.Arith. (************************************** Some properties of minus diff --git a/coqprime/Coqprime/PGroup.v b/coqprime/Coqprime/PGroup.v index e9c1b2f47..19eff5850 100644 --- a/coqprime/Coqprime/PGroup.v +++ b/coqprime/Coqprime/PGroup.v @@ -14,15 +14,15 @@ Definition: PGroup **********************************************************************) -Require Import ZArith. -Require Import Znumtheory. -Require Import Tactic. -Require Import Wf_nat. -Require Import ListAux. -Require Import UList. -Require Import FGroup. -Require Import EGroup. -Require Import IGroup. +Require Import Coq.ZArith.ZArith. +Require Import Coq.ZArith.Znumtheory. +Require Import Coqprime.Tactic. +Require Import Coq.Arith.Wf_nat. +Require Import Coqprime.ListAux. +Require Import Coqprime.UList. +Require Import Coqprime.FGroup. +Require Import Coqprime.EGroup. +Require Import Coqprime.IGroup. Open Scope Z_scope. diff --git a/coqprime/Coqprime/Permutation.v b/coqprime/Coqprime/Permutation.v index a06693f89..7cb6f629d 100644 --- a/coqprime/Coqprime/Permutation.v +++ b/coqprime/Coqprime/Permutation.v @@ -11,8 +11,8 @@ Defintion and properties of permutations **********************************************************************) -Require Export List. -Require Export ListAux. +Require Export Coq.Lists.List. +Require Export Coqprime.ListAux. Section permutation. Variable A : Set. diff --git a/coqprime/Coqprime/Pmod.v b/coqprime/Coqprime/Pmod.v index f64af48e3..45961896e 100644 --- a/coqprime/Coqprime/Pmod.v +++ b/coqprime/Coqprime/Pmod.v @@ -6,8 +6,8 @@ (* Benjamin.Gregoire@inria.fr Laurent.Thery@inria.fr *) (*************************************************************) -Require Export ZArith. -Require Export ZCmisc. +Require Export Coq.ZArith.ZArith. +Require Export Coqprime.ZCmisc. Open Local Scope positive_scope. @@ -392,7 +392,7 @@ Lemma gcd_log2_mod0 : Proof. intros a b c H;destruct c;simpl;rewrite H;trivial. Qed. -Require Import Zwf. +Require Import Coq.ZArith.Zwf. Lemma Zwf_pos : well_founded (fun x y => Zpos x < Zpos y). Proof. @@ -510,8 +510,8 @@ Proof. destruct (gcd_log2 b r r);intros;trivial. Qed. -Require Import ZArith. -Require Import Znumtheory. +Require Import Coq.ZArith.ZArith. +Require Import Coq.ZArith.Znumtheory. Hint Rewrite Zpos_mult times_Zmult square_Zmult Psucc_Zplus: zmisc. diff --git a/coqprime/Coqprime/Pocklington.v b/coqprime/Coqprime/Pocklington.v index 9871cd3e6..79e7dc616 100644 --- a/coqprime/Coqprime/Pocklington.v +++ b/coqprime/Coqprime/Pocklington.v @@ -6,14 +6,14 @@ (* Benjamin.Gregoire@inria.fr Laurent.Thery@inria.fr *) (*************************************************************) -Require Import ZArith. -Require Export Znumtheory. -Require Import Tactic. -Require Import ZCAux. -Require Import Zp. -Require Import FGroup. -Require Import EGroup. -Require Import Euler. +Require Import Coq.ZArith.ZArith. +Require Export Coq.ZArith.Znumtheory. +Require Import Coqprime.Tactic. +Require Import Coqprime.ZCAux. +Require Import Coqprime.Zp. +Require Import Coqprime.FGroup. +Require Import Coqprime.EGroup. +Require Import Coqprime.Euler. Open Scope Z_scope. diff --git a/coqprime/Coqprime/PocklingtonCertificat.v b/coqprime/Coqprime/PocklingtonCertificat.v index ed75ca281..fccea30b6 100644 --- a/coqprime/Coqprime/PocklingtonCertificat.v +++ b/coqprime/Coqprime/PocklingtonCertificat.v @@ -6,14 +6,14 @@ (* Benjamin.Gregoire@inria.fr Laurent.Thery@inria.fr *) (*************************************************************) -Require Import List. -Require Import ZArith. -Require Import Zorder. -Require Import ZCAux. -Require Import LucasLehmer. -Require Import Pocklington. -Require Import ZCmisc. -Require Import Pmod. +Require Import Coq.Lists.List. +Require Import Coq.ZArith.ZArith. +Require Import Coq.ZArith.Zorder. +Require Import Coqprime.ZCAux. +Require Import Coqprime.LucasLehmer. +Require Import Coqprime.Pocklington. +Require Import Coqprime.ZCmisc. +Require Import Coqprime.Pmod. Definition dec_prime := list (positive * positive). diff --git a/coqprime/Coqprime/Root.v b/coqprime/Coqprime/Root.v index 321865ba1..4e74a4d2f 100644 --- a/coqprime/Coqprime/Root.v +++ b/coqprime/Coqprime/Root.v @@ -11,11 +11,11 @@ Proof that a polynomial has at most n roots ************************************************************************) -Require Import ZArith. -Require Import List. -Require Import UList. -Require Import Tactic. -Require Import Permutation. +Require Import Coq.ZArith.ZArith. +Require Import Coq.Lists.List. +Require Import Coqprime.UList. +Require Import Coqprime.Tactic. +Require Import Coqprime.Permutation. Open Scope Z_scope. diff --git a/coqprime/Coqprime/ZCAux.v b/coqprime/Coqprime/ZCAux.v index de03a2fe2..aa47fb655 100644 --- a/coqprime/Coqprime/ZCAux.v +++ b/coqprime/Coqprime/ZCAux.v @@ -12,10 +12,10 @@ Auxillary functions & Theorems **********************************************************************) -Require Import ArithRing. -Require Export ZArith Zpow_facts. -Require Export Znumtheory. -Require Export Tactic. +Require Import Coq.setoid_ring.ArithRing. +Require Export Coq.ZArith.ZArith Coq.ZArith.Zpow_facts. +Require Export Coq.ZArith.Znumtheory. +Require Export Coqprime.Tactic. Theorem Zdivide_div_prime_le_square: forall x, 1 < x -> ~prime x -> exists p, prime p /\ (p | x) /\ p * p <= x. intros x Hx; generalize Hx; pattern x; apply Z_lt_induction; auto with zarith. diff --git a/coqprime/Coqprime/ZCmisc.v b/coqprime/Coqprime/ZCmisc.v index c1bdacc63..e2ec66ba1 100644 --- a/coqprime/Coqprime/ZCmisc.v +++ b/coqprime/Coqprime/ZCmisc.v @@ -6,7 +6,7 @@ (* Benjamin.Gregoire@inria.fr Laurent.Thery@inria.fr *) (*************************************************************) -Require Export ZArith. +Require Export Coq.ZArith.ZArith. Open Local Scope Z_scope. Coercion Zpos : positive >-> Z. diff --git a/coqprime/Coqprime/ZProgression.v b/coqprime/Coqprime/ZProgression.v index 51ce91cdc..4cf30d692 100644 --- a/coqprime/Coqprime/ZProgression.v +++ b/coqprime/Coqprime/ZProgression.v @@ -6,9 +6,9 @@ (* Benjamin.Gregoire@inria.fr Laurent.Thery@inria.fr *) (*************************************************************) -Require Export Iterator. -Require Import ZArith. -Require Export UList. +Require Export Coqprime.Iterator. +Require Import Coq.ZArith.ZArith. +Require Export Coqprime.UList. Open Scope Z_scope. Theorem next_n_Z: forall n m, next_n Zsucc n m = n + Z_of_nat m. diff --git a/coqprime/Coqprime/ZSum.v b/coqprime/Coqprime/ZSum.v index 3a7f14065..907720f7c 100644 --- a/coqprime/Coqprime/ZSum.v +++ b/coqprime/Coqprime/ZSum.v @@ -9,12 +9,12 @@ (*********************************************************************** Summation.v from Z to Z *********************************************************************) -Require Import Arith. -Require Import ArithRing. -Require Import ListAux. -Require Import ZArith. -Require Import Iterator. -Require Import ZProgression. +Require Import Coq.Arith.Arith. +Require Import Coq.setoid_ring.ArithRing. +Require Import Coqprime.ListAux. +Require Import Coq.ZArith.ZArith. +Require Import Coqprime.Iterator. +Require Import Coqprime.ZProgression. Open Scope Z_scope. diff --git a/coqprime/Coqprime/Zp.v b/coqprime/Coqprime/Zp.v index 9b99bef1d..2f7d28d69 100644 --- a/coqprime/Coqprime/Zp.v +++ b/coqprime/Coqprime/Zp.v @@ -14,16 +14,16 @@ Definition: ZpGroup **********************************************************************) -Require Import ZArith Znumtheory Zpow_facts. +Require Import Coq.ZArith.ZArith Coq.ZArith.Znumtheory Coq.ZArith.Zpow_facts. Require Import Coqprime.Tactic. -Require Import Wf_nat. -Require Import UList. -Require Import FGroup. -Require Import EGroup. -Require Import IGroup. -Require Import Cyclic. -Require Import Euler. -Require Import ZProgression. +Require Import Coq.Arith.Wf_nat. +Require Import Coqprime.UList. +Require Import Coqprime.FGroup. +Require Import Coqprime.EGroup. +Require Import Coqprime.IGroup. +Require Import Coqprime.Cyclic. +Require Import Coqprime.Euler. +Require Import Coqprime.ZProgression. Open Scope Z_scope. -- cgit v1.2.3 From bb6d1cb9e5dea833adf07689df0864178732a494 Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Thu, 10 Mar 2016 13:49:01 -0500 Subject: Finish absolutizing imports The file coqprime/Coqprime/ListAux.v was importing List, which was confusing machines on which mathclasses was also installed. Using https://github.com/JasonGross/coq-tools ```bash make -kj10 cd src git ls-files "*.v" | xargs python ~/Documents/repos/coq-tools/absolutize-imports.py -i -R . Crypto ``` --- src/BaseSystem.v | 8 ++++---- src/BoundedIterOp.v | 2 +- src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v | 2 +- src/CompleteEdwardsCurve/DoubleAndAdd.v | 2 +- src/CompleteEdwardsCurve/Pre.v | 2 +- src/EdDSAProofs.v | 8 ++++---- src/ModularArithmetic/FField.v | 2 +- src/ModularArithmetic/FNsatz.v | 2 +- src/ModularArithmetic/ModularArithmeticTheorems.v | 10 +++++----- src/ModularArithmetic/ModularBaseSystem.v | 6 +++--- src/ModularArithmetic/Pre.v | 6 +++--- src/ModularArithmetic/PrimeFieldTheorems.v | 16 ++++++++-------- src/ModularArithmetic/Tutorial.v | 4 ++-- src/Spec/CompleteEdwardsCurve.v | 2 +- src/Spec/Ed25519.v | 10 +++++----- src/Spec/EdDSA.v | 4 ++-- src/Spec/Encoding.v | 6 +++--- src/Spec/ModularArithmetic.v | 2 +- src/Spec/PointEncoding.v | 6 +++--- src/Specific/GF25519.v | 12 ++++++------ src/Util/CaseUtil.v | 2 +- src/Util/IterAssocOp.v | 2 +- src/Util/ListUtil.v | 8 ++++---- src/Util/NatUtil.v | 2 +- src/Util/NumTheoryUtil.v | 6 +++--- src/Util/WordUtil.v | 4 ++-- src/Util/ZUtil.v | 4 ++-- 27 files changed, 70 insertions(+), 70 deletions(-) diff --git a/src/BaseSystem.v b/src/BaseSystem.v index f0e0db077..4e07c4564 100644 --- a/src/BaseSystem.v +++ b/src/BaseSystem.v @@ -1,7 +1,7 @@ -Require Import List. -Require Import Util.ListUtil Util.CaseUtil Util.ZUtil. -Require Import ZArith.ZArith ZArith.Zdiv. -Require Import Omega NPeano Arith. +Require Import Coq.Lists.List. +Require Import Crypto.Util.ListUtil Crypto.Util.CaseUtil Crypto.Util.ZUtil. +Require Import Coq.ZArith.ZArith Coq.ZArith.Zdiv. +Require Import Coq.omega.Omega Coq.Numbers.Natural.Peano.NPeano Coq.Arith.Arith. Local Open Scope Z. diff --git a/src/BoundedIterOp.v b/src/BoundedIterOp.v index fbdc823ad..bd4f7d66e 100644 --- a/src/BoundedIterOp.v +++ b/src/BoundedIterOp.v @@ -1,5 +1,5 @@ Require Import Crypto.Tactics.VerdiTactics. -Require Import BinNums NArith Nnat ZArith. +Require Import Coq.Numbers.BinNums Coq.NArith.NArith Coq.NArith.Nnat Coq.ZArith.ZArith. Definition testbit_rev p i bound := Pos.testbit_nat p (bound - i). diff --git a/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v b/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v index 8ef1b95d4..3740f5a29 100644 --- a/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v +++ b/src/CompleteEdwardsCurve/CompleteEdwardsCurveTheorems.v @@ -4,7 +4,7 @@ Require Import Crypto.ModularArithmetic.FField. Require Import Crypto.ModularArithmetic.FNsatz. Require Import Crypto.CompleteEdwardsCurve.Pre. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. -Require Import Eqdep_dec. +Require Import Coq.Logic.Eqdep_dec. Require Import Crypto.Tactics.VerdiTactics. Section CompleteEdwardsCurveTheorems. diff --git a/src/CompleteEdwardsCurve/DoubleAndAdd.v b/src/CompleteEdwardsCurve/DoubleAndAdd.v index 7c1e173ee..84c1289f6 100644 --- a/src/CompleteEdwardsCurve/DoubleAndAdd.v +++ b/src/CompleteEdwardsCurve/DoubleAndAdd.v @@ -1,7 +1,7 @@ Require Import Crypto.Tactics.VerdiTactics. Require Import Crypto.Spec.CompleteEdwardsCurve Crypto.BoundedIterOp. Require Import Crypto.CompleteEdwardsCurve.CompleteEdwardsCurveTheorems. -Require Import BinNums NArith Nnat ZArith. +Require Import Coq.Numbers.BinNums Coq.NArith.NArith Coq.NArith.Nnat Coq.ZArith.ZArith. Section EdwardsDoubleAndAdd. Context {prm:TwistedEdwardsParams}. diff --git a/src/CompleteEdwardsCurve/Pre.v b/src/CompleteEdwardsCurve/Pre.v index e4dc140e1..fea4a99b3 100644 --- a/src/CompleteEdwardsCurve/Pre.v +++ b/src/CompleteEdwardsCurve/Pre.v @@ -1,4 +1,4 @@ -Require Import BinInt Znumtheory VerdiTactics. +Require Import Coq.ZArith.BinInt Coq.ZArith.Znumtheory Crypto.Tactics.VerdiTactics. Require Import Crypto.Spec.ModularArithmetic. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. diff --git a/src/EdDSAProofs.v b/src/EdDSAProofs.v index 7357284e1..83467bf6d 100644 --- a/src/EdDSAProofs.v +++ b/src/EdDSAProofs.v @@ -1,11 +1,11 @@ Require Import Crypto.Spec.EdDSA Crypto.Spec.Encoding. -Require Import NPeano. +Require Import Coq.Numbers.Natural.Peano.NPeano. Require Import Bedrock.Word. -Require Import Znumtheory BinInt ZArith. +Require Import Coq.ZArith.Znumtheory Coq.ZArith.BinInt Coq.ZArith.ZArith. Require Import Crypto.Spec.CompleteEdwardsCurve Crypto.CompleteEdwardsCurve.CompleteEdwardsCurveTheorems. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems Crypto.ModularArithmetic.ModularArithmeticTheorems. -Require Import Util.ListUtil Util.CaseUtil Util.ZUtil. -Require Import VerdiTactics. +Require Import Crypto.Util.ListUtil Crypto.Util.CaseUtil Crypto.Util.ZUtil. +Require Import Crypto.Tactics.VerdiTactics. Local Open Scope nat_scope. Section EdDSAProofs. diff --git a/src/ModularArithmetic/FField.v b/src/ModularArithmetic/FField.v index ac2ef48b5..4f2b623e0 100644 --- a/src/ModularArithmetic/FField.v +++ b/src/ModularArithmetic/FField.v @@ -1,5 +1,5 @@ Require Export Crypto.Spec.ModularArithmetic. -Require Export Field. +Require Export Coq.setoid_ring.Field. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. diff --git a/src/ModularArithmetic/FNsatz.v b/src/ModularArithmetic/FNsatz.v index a0f34073d..221b8d799 100644 --- a/src/ModularArithmetic/FNsatz.v +++ b/src/ModularArithmetic/FNsatz.v @@ -1,6 +1,6 @@ Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. Require Export Crypto.ModularArithmetic.FField. -Require Import Nsatz. +Require Import Coq.nsatz.Nsatz. Ltac FqAsIntegralDomain := lazymatch goal with [H:Znumtheory.prime ?q |- _ ] => diff --git a/src/ModularArithmetic/ModularArithmeticTheorems.v b/src/ModularArithmetic/ModularArithmeticTheorems.v index f39cc4176..ddb689547 100644 --- a/src/ModularArithmetic/ModularArithmeticTheorems.v +++ b/src/ModularArithmetic/ModularArithmeticTheorems.v @@ -1,11 +1,11 @@ Require Import Crypto.Spec.ModularArithmetic. Require Import Crypto.ModularArithmetic.Pre. -Require Import Eqdep_dec. -Require Import Tactics.VerdiTactics. -Require Import BinInt Zdiv Znumtheory NArith. (* import Zdiv before Znumtheory *) -Require Import Coq.Classes.Morphisms Setoid. -Require Export Ring_theory Field_theory Field_tac. +Require Import Coq.Logic.Eqdep_dec. +Require Import Crypto.Tactics.VerdiTactics. +Require Import Coq.ZArith.BinInt Coq.ZArith.Zdiv Coq.ZArith.Znumtheory Coq.NArith.NArith. (* import Zdiv before Znumtheory *) +Require Import Coq.Classes.Morphisms Coq.Setoids.Setoid. +Require Export Coq.setoid_ring.Ring_theory Coq.setoid_ring.Field_theory Coq.setoid_ring.Field_tac. Section ModularArithmeticPreliminaries. Context {m:Z}. diff --git a/src/ModularArithmetic/ModularBaseSystem.v b/src/ModularArithmetic/ModularBaseSystem.v index 8c22a8091..b2bea21cf 100644 --- a/src/ModularArithmetic/ModularBaseSystem.v +++ b/src/ModularArithmetic/ModularBaseSystem.v @@ -1,9 +1,9 @@ -Require Import Zpower ZArith. -Require Import List. +Require Import Coq.ZArith.Zpower Coq.ZArith.ZArith. +Require Import Coq.Lists.List. Require Import Crypto.Util.ListUtil Crypto.Util.CaseUtil Crypto.Util.ZUtil. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. Require Import Crypto.BaseSystem. -Require Import VerdiTactics. +Require Import Crypto.Tactics.VerdiTactics. Local Open Scope Z_scope. Module Type PseudoMersenneBaseParams (Import B:BaseCoefs) (Import M:Modulus). diff --git a/src/ModularArithmetic/Pre.v b/src/ModularArithmetic/Pre.v index 3432488c4..2978fdd42 100644 --- a/src/ModularArithmetic/Pre.v +++ b/src/ModularArithmetic/Pre.v @@ -1,6 +1,6 @@ -Require Import BinInt BinNat BinNums Zdiv Znumtheory. -Require Import Eqdep_dec. -Require Import EqdepFacts. +Require Import Coq.ZArith.BinInt Coq.NArith.BinNat Coq.Numbers.BinNums Coq.ZArith.Zdiv Coq.ZArith.Znumtheory. +Require Import Coq.Logic.Eqdep_dec. +Require Import Coq.Logic.EqdepFacts. Require Import Crypto.Tactics.VerdiTactics. Lemma Z_mod_mod x m : x mod m = (x mod m) mod m. diff --git a/src/ModularArithmetic/PrimeFieldTheorems.v b/src/ModularArithmetic/PrimeFieldTheorems.v index 40af15dac..91ac63d26 100644 --- a/src/ModularArithmetic/PrimeFieldTheorems.v +++ b/src/ModularArithmetic/PrimeFieldTheorems.v @@ -1,13 +1,13 @@ -Require Export Spec.ModularArithmetic ModularArithmetic.ModularArithmeticTheorems. -Require Export Ring_theory Field_theory Field_tac. +Require Export Crypto.Spec.ModularArithmetic Crypto.ModularArithmetic.ModularArithmeticTheorems. +Require Export Coq.setoid_ring.Ring_theory Coq.setoid_ring.Field_theory Coq.setoid_ring.Field_tac. -Require Import Nsatz. +Require Import Coq.nsatz.Nsatz. Require Import Crypto.ModularArithmetic.Pre. -Require Import Util.NumTheoryUtil. -Require Import Tactics.VerdiTactics. -Require Import Coq.Classes.Morphisms Setoid. -Require Import BinInt BinNat ZArith Znumtheory NArith. (* import Zdiv before Znumtheory *) -Require Import Eqdep_dec. +Require Import Crypto.Util.NumTheoryUtil. +Require Import Crypto.Tactics.VerdiTactics. +Require Import Coq.Classes.Morphisms Coq.Setoids.Setoid. +Require Import Coq.ZArith.BinInt Coq.NArith.BinNat Coq.ZArith.ZArith Coq.ZArith.Znumtheory Coq.NArith.NArith. (* import Zdiv before Znumtheory *) +Require Import Coq.Logic.Eqdep_dec. Require Import Crypto.Util.NumTheoryUtil Crypto.Util.ZUtil. Existing Class prime. diff --git a/src/ModularArithmetic/Tutorial.v b/src/ModularArithmetic/Tutorial.v index 425816f9e..d6c7fa4b8 100644 --- a/src/ModularArithmetic/Tutorial.v +++ b/src/ModularArithmetic/Tutorial.v @@ -1,5 +1,5 @@ -Require Import BinInt Zpower ZArith Znumtheory. -Require Import Spec.ModularArithmetic ModularArithmetic.PrimeFieldTheorems. +Require Import Coq.ZArith.BinInt Coq.ZArith.Zpower Coq.ZArith.ZArith Coq.ZArith.Znumtheory. +Require Import Crypto.Spec.ModularArithmetic Crypto.ModularArithmetic.PrimeFieldTheorems. (* Example for modular arithmetic with a concrete modulus in a section *) diff --git a/src/Spec/CompleteEdwardsCurve.v b/src/Spec/CompleteEdwardsCurve.v index 23e201405..8dbfdf7b9 100644 --- a/src/Spec/CompleteEdwardsCurve.v +++ b/src/Spec/CompleteEdwardsCurve.v @@ -1,4 +1,4 @@ -Require BinInt Znumtheory. +Require Coq.ZArith.BinInt Coq.ZArith.Znumtheory. Require Crypto.CompleteEdwardsCurve.Pre. diff --git a/src/Spec/Ed25519.v b/src/Spec/Ed25519.v index e16cc73f6..92c36b56c 100644 --- a/src/Spec/Ed25519.v +++ b/src/Spec/Ed25519.v @@ -1,14 +1,14 @@ -Require Import ZArith.ZArith Zpower ZArith Znumtheory. -Require Import NPeano NArith. +Require Import Coq.ZArith.ZArith Coq.ZArith.Zpower Coq.ZArith.ZArith Coq.ZArith.Znumtheory. +Require Import Coq.Numbers.Natural.Peano.NPeano Coq.NArith.NArith. Require Import Crypto.Spec.Encoding Crypto.Spec.PointEncoding. Require Import Crypto.Spec.EdDSA. Require Import Crypto.Spec.CompleteEdwardsCurve Crypto.CompleteEdwardsCurve.CompleteEdwardsCurveTheorems. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems Crypto.ModularArithmetic.ModularArithmeticTheorems. Require Import Crypto.Util.NatUtil Crypto.Util.ZUtil Crypto.Util.WordUtil Crypto.Util.NumTheoryUtil. Require Import Bedrock.Word. -Require Import VerdiTactics. -Require Import Decidable. -Require Import Omega. +Require Import Crypto.Tactics.VerdiTactics. +Require Import Coq.Logic.Decidable. +Require Import Coq.omega.Omega. Local Open Scope nat_scope. Definition q : Z := (2 ^ 255 - 19)%Z. diff --git a/src/Spec/EdDSA.v b/src/Spec/EdDSA.v index 45950f6a1..6f57d7bec 100644 --- a/src/Spec/EdDSA.v +++ b/src/Spec/EdDSA.v @@ -4,8 +4,8 @@ Require Import Crypto.Spec.CompleteEdwardsCurve. Require Import Crypto.Util.WordUtil. Require Bedrock.Word. -Require Znumtheory BinInt. -Require NPeano. +Require Coq.ZArith.Znumtheory Coq.ZArith.BinInt. +Require Coq.Numbers.Natural.Peano.NPeano. Coercion Word.wordToNat : Word.word >-> nat. diff --git a/src/Spec/Encoding.v b/src/Spec/Encoding.v index 7bef9295b..14cf9d9d9 100644 --- a/src/Spec/Encoding.v +++ b/src/Spec/Encoding.v @@ -1,8 +1,8 @@ -Require Import ZArith.ZArith Zpower ZArith. -Require Import NPeano. +Require Import Coq.ZArith.ZArith Coq.ZArith.Zpower Coq.ZArith.ZArith. +Require Import Coq.Numbers.Natural.Peano.NPeano. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems Crypto.ModularArithmetic.ModularArithmeticTheorems. Require Import Bedrock.Word. -Require Import VerdiTactics. +Require Import Crypto.Tactics.VerdiTactics. Require Import Crypto.Util.NatUtil. Require Import Crypto.Util.WordUtil. diff --git a/src/Spec/ModularArithmetic.v b/src/Spec/ModularArithmetic.v index da6a62ada..76efe3d79 100644 --- a/src/Spec/ModularArithmetic.v +++ b/src/Spec/ModularArithmetic.v @@ -1,4 +1,4 @@ -Require Znumtheory BinNums. +Require Coq.ZArith.Znumtheory Coq.Numbers.BinNums. Require Crypto.ModularArithmetic.Pre. diff --git a/src/Spec/PointEncoding.v b/src/Spec/PointEncoding.v index 2fec05863..4823ef28f 100644 --- a/src/Spec/PointEncoding.v +++ b/src/Spec/PointEncoding.v @@ -1,11 +1,11 @@ -Require Import ZArith.ZArith Zpower ZArith Znumtheory. -Require Import NPeano NArith. +Require Import Coq.ZArith.ZArith Coq.ZArith.Zpower Coq.ZArith.ZArith Coq.ZArith.Znumtheory. +Require Import Coq.Numbers.Natural.Peano.NPeano Coq.NArith.NArith. Require Import Crypto.Spec.Encoding Crypto.Encoding.EncodingTheorems. Require Import Crypto.Spec.CompleteEdwardsCurve Crypto.CompleteEdwardsCurve.CompleteEdwardsCurveTheorems. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems Crypto.ModularArithmetic.ModularArithmeticTheorems. Require Import Crypto.Util.NatUtil Crypto.Util.ZUtil Crypto.Util.NumTheoryUtil. Require Import Bedrock.Word. -Require Import VerdiTactics. +Require Import Crypto.Tactics.VerdiTactics. Local Open Scope F_scope. diff --git a/src/Specific/GF25519.v b/src/Specific/GF25519.v index 516efd8b2..0d3923945 100644 --- a/src/Specific/GF25519.v +++ b/src/Specific/GF25519.v @@ -1,10 +1,10 @@ -Require Import ModularArithmetic.PrimeFieldTheorems. -Require Import BaseSystem ModularBaseSystem. -Require Import List Util.ListUtil. +Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. +Require Import Crypto.BaseSystem Crypto.ModularArithmetic.ModularBaseSystem. +Require Import Coq.Lists.List Crypto.Util.ListUtil. Import ListNotations. -Require Import ZArith.ZArith Zpower ZArith Znumtheory. -Require Import QArith.QArith QArith.Qround. -Require Import VerdiTactics. +Require Import Coq.ZArith.ZArith Coq.ZArith.Zpower Coq.ZArith.ZArith Coq.ZArith.Znumtheory. +Require Import Coq.QArith.QArith Coq.QArith.Qround. +Require Import Crypto.Tactics.VerdiTactics. Close Scope Q. Ltac twoIndices i j base := diff --git a/src/Util/CaseUtil.v b/src/Util/CaseUtil.v index 35f207ffc..af04a1e49 100644 --- a/src/Util/CaseUtil.v +++ b/src/Util/CaseUtil.v @@ -1,4 +1,4 @@ -Require Import Arith. +Require Import Coq.Arith.Arith. Ltac case_max := match goal with [ |- context[max ?x ?y] ] => diff --git a/src/Util/IterAssocOp.v b/src/Util/IterAssocOp.v index 4524f5cb9..016a4f7bd 100644 --- a/src/Util/IterAssocOp.v +++ b/src/Util/IterAssocOp.v @@ -1,5 +1,5 @@ Require Import Coq.Setoids.Setoid Coq.Classes.Morphisms Coq.Classes.Equivalence. -Require Import NArith BinPosDef. +Require Import Coq.NArith.NArith Coq.PArith.BinPosDef. Local Open Scope equiv_scope. Generalizable All Variables. diff --git a/src/Util/ListUtil.v b/src/Util/ListUtil.v index 783e3f527..1f9a62457 100644 --- a/src/Util/ListUtil.v +++ b/src/Util/ListUtil.v @@ -1,7 +1,7 @@ -Require Import List. -Require Import Omega. -Require Import Arith.Peano_dec. -Require Import VerdiTactics. +Require Import Coq.Lists.List. +Require Import Coq.omega.Omega. +Require Import Coq.Arith.Peano_dec. +Require Import Crypto.Tactics.VerdiTactics. Ltac boring := simpl; intuition; diff --git a/src/Util/NatUtil.v b/src/Util/NatUtil.v index 4ba6d0808..6a62d6c22 100644 --- a/src/Util/NatUtil.v +++ b/src/Util/NatUtil.v @@ -1,4 +1,4 @@ -Require Import NPeano Omega. +Require Import Coq.Numbers.Natural.Peano.NPeano Coq.omega.Omega. Local Open Scope nat_scope. diff --git a/src/Util/NumTheoryUtil.v b/src/Util/NumTheoryUtil.v index 5acef8b75..10ce148b0 100644 --- a/src/Util/NumTheoryUtil.v +++ b/src/Util/NumTheoryUtil.v @@ -1,8 +1,8 @@ -Require Import Zpower Znumtheory ZArith.ZArith ZArith.Zdiv. -Require Import Omega NPeano Arith. +Require Import Coq.ZArith.Zpower Coq.ZArith.Znumtheory Coq.ZArith.ZArith Coq.ZArith.Zdiv. +Require Import Coq.omega.Omega Coq.Numbers.Natural.Peano.NPeano Coq.Arith.Arith. Require Import Crypto.Util.NatUtil Crypto.Util.ZUtil. Require Import Coqprime.Zp. -Require Import VerdiTactics. +Require Import Crypto.Tactics.VerdiTactics. Local Open Scope Z. (* TODO: move somewhere else for lemmas about Coqprime? *) diff --git a/src/Util/WordUtil.v b/src/Util/WordUtil.v index 49de971ef..17d04c60a 100644 --- a/src/Util/WordUtil.v +++ b/src/Util/WordUtil.v @@ -1,5 +1,5 @@ -Require Import NPeano. -Require Import ZArith.ZArith. +Require Import Coq.Numbers.Natural.Peano.NPeano. +Require Import Coq.ZArith.ZArith. Require Import Bedrock.Word. Local Open Scope nat_scope. diff --git a/src/Util/ZUtil.v b/src/Util/ZUtil.v index 2cfab2e90..db3d84b2d 100644 --- a/src/Util/ZUtil.v +++ b/src/Util/ZUtil.v @@ -1,5 +1,5 @@ -Require Import Zpower Znumtheory ZArith.ZArith ZArith.Zdiv. -Require Import Omega NPeano Arith. +Require Import Coq.ZArith.Zpower Coq.ZArith.Znumtheory Coq.ZArith.ZArith Coq.ZArith.Zdiv. +Require Import Coq.omega.Omega Coq.Numbers.Natural.Peano.NPeano Coq.Arith.Arith. Require Import Crypto.Util.NatUtil. Local Open Scope Z. -- cgit v1.2.3 From b2de1ea79a9b0499d3931b936fda7e3289061285 Mon Sep 17 00:00:00 2001 From: Andres Erbsen Date: Sun, 20 Mar 2016 13:45:46 -0400 Subject: extended coordinates setoid boilerplate --- src/CompleteEdwardsCurve/ExtendedCoordinates.v | 100 ++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 3 deletions(-) diff --git a/src/CompleteEdwardsCurve/ExtendedCoordinates.v b/src/CompleteEdwardsCurve/ExtendedCoordinates.v index 226600428..e918ac128 100644 --- a/src/CompleteEdwardsCurve/ExtendedCoordinates.v +++ b/src/CompleteEdwardsCurve/ExtendedCoordinates.v @@ -3,6 +3,9 @@ Require Import Crypto.CompleteEdwardsCurve.CompleteEdwardsCurveTheorems. Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. Require Import Crypto.ModularArithmetic.FField. Require Import Crypto.Tactics.VerdiTactics. +Require Import Util.IterAssocOp BinNat NArith. +Require Import Coq.Setoids.Setoid Coq.Classes.Morphisms Coq.Classes.Equivalence. +Local Open Scope equiv_scope. Local Open Scope F_scope. Section ExtendedCoordinates. @@ -80,10 +83,43 @@ Section ExtendedCoordinates. solveExtended. Qed. + Definition extendedPoint := { P:extended | rep P (extendedToTwisted P) /\ onCurve (extendedToTwisted P) }. + + Program Definition mkExtendedPoint : point -> extendedPoint := twistedToExtended. + Next Obligation. + destruct x; erewrite extendedToTwisted_rep; eauto using twistedToExtended_rep. + Qed. + + Program Definition unExtendedPoint : extendedPoint -> point := extendedToTwisted. + Next Obligation. + destruct x; simpl; intuition. + Qed. + + Definition extendedPoint_eq P Q := unExtendedPoint P = unExtendedPoint Q. + Global Instance Equivalence_extendedPoint_eq : Equivalence extendedPoint_eq. + Proof. + repeat (econstructor || intro); unfold extendedPoint_eq in *; congruence. + Qed. + + Lemma unExtendedPoint_mkExtendedPoint : forall P, unExtendedPoint (mkExtendedPoint P) = P. + Proof. + destruct P; eapply point_eq; simpl; erewrite extendedToTwisted_rep; eauto using twistedToExtended_rep. + Qed. + + Global Instance Proper_mkExtendedPoint : Proper (eq==>equiv) mkExtendedPoint. + Proof. + repeat (econstructor || intro); unfold extendedPoint_eq in *; congruence. + Qed. + + Global Instance Proper_unExtendedPoint : Proper (equiv==>eq) unExtendedPoint. + Proof. + repeat (econstructor || intro); unfold extendedPoint_eq in *; congruence. + Qed. + Section TwistMinus1. Context (a_eq_minus1 : a = opp 1). (** Second equation from section 3.1, also and *) - Definition unifiedAddM1 (P1 P2 : extended) : extended := + Definition unifiedAddM1' (P1 P2 : extended) : extended := let '(X1, Y1, Z1, T1) := P1 in let '(X2, Y2, Z2, T2) := P2 in let A := (Y1-X1)*(Y2-X2) in @@ -101,8 +137,8 @@ Section ExtendedCoordinates. (X3, Y3, Z3, T3). Local Hint Unfold unifiedAdd. - Lemma unifiedAdd_repM1: forall P Q rP rQ, onCurve rP -> onCurve rQ -> - P ~= rP -> Q ~= rQ -> (unifiedAddM1 P Q) ~= (unifiedAdd' rP rQ). + Lemma unifiedAddM1'_rep: forall P Q rP rQ, onCurve rP -> onCurve rQ -> + P ~= rP -> Q ~= rQ -> (unifiedAddM1' P Q) ~= (unifiedAdd' rP rQ). Proof. intros P Q rP rQ HoP HoQ HrP HrQ. pose proof (@edwardsAddCompletePlus _ _ _ _ two_lt_q nonzero_a square_a nonsquare_d). @@ -136,5 +172,63 @@ Section ExtendedCoordinates. - replace (ZP * ZToField 2 * ZQ * (ZP * ZQ) + XP * YP * ZToField 2 * d * (XQ * YQ)) with (ZToField 2*ZQ*ZQ*ZP*ZP* (1 + d * (XQ / ZQ) * (XP / ZP) * (YQ / ZQ) * (YP / ZP))) by (field; tnz); tnz. - replace (ZP * ZToField 2 * ZQ * (ZP * ZQ) - XP * YP * ZToField 2 * d * (XQ * YQ)) with (ZToField 2*ZQ*ZQ*ZP*ZP* (1 - d * (XQ / ZQ) * (XP / ZP) * (YQ / ZQ) * (YP / ZP))) by (field; tnz); tnz. Qed. + + Lemma unifiedAdd'_onCurve : forall P Q, onCurve P -> onCurve Q -> onCurve (unifiedAdd' P Q). + Proof. + intros; pose proof (proj2_sig (unifiedAdd (mkPoint _ H) (mkPoint _ H0))); eauto. + Qed. + + Program Definition unifiedAddM1 : extendedPoint -> extendedPoint -> extendedPoint := unifiedAddM1'. + Next Obligation. + destruct x, x0; simpl; intuition. + - erewrite extendedToTwisted_rep; eauto using unifiedAddM1'_rep. + - erewrite extendedToTwisted_rep. + (* It would be nice if I could use eauto here, but it gets evars wrong :( *) + 2: eapply unifiedAddM1'_rep. 5:apply H1. 4:apply H. 3:auto. 2:auto. + eauto using unifiedAdd'_onCurve. + Qed. + + Lemma unifiedAddM1_rep : forall P Q, unifiedAdd (unExtendedPoint P) (unExtendedPoint Q) = unExtendedPoint (unifiedAddM1 P Q). + Proof. + destruct P, Q; unfold unExtendedPoint, unifiedAdd, unifiedAddM1; eapply point_eq; simpl in *; intuition. + pose proof (unifiedAddM1'_rep x x0 (extendedToTwisted x) (extendedToTwisted x0)); + destruct (unifiedAddM1' x x0); + unfold rep in *; intuition. + Qed. + + Global Instance Proper_unifiedAddM1 : Proper (equiv==>equiv==>equiv) unifiedAddM1. + Proof. + repeat (econstructor || intro). + repeat match goal with [H: _ === _ |- _ ] => inversion H; clear H end; unfold equiv, extendedPoint_eq. + rewrite <-!unifiedAddM1_rep. + destruct x, y, x0, y0; simpl in *; eapply point_eq; congruence. + Qed. + + Lemma unifiedAddM1_0_r : forall P, unifiedAddM1 P (mkExtendedPoint zero) === P. + unfold equiv, extendedPoint_eq; intros. + rewrite <-!unifiedAddM1_rep, unExtendedPoint_mkExtendedPoint, zeroIsIdentity; auto. + Qed. + + Lemma unifiedAddM1_0_l : forall P, unifiedAddM1 (mkExtendedPoint zero) P === P. + unfold equiv, extendedPoint_eq; intros. + rewrite <-!unifiedAddM1_rep, twistedAddComm, unExtendedPoint_mkExtendedPoint, zeroIsIdentity; auto. + Qed. + + Lemma unifiedAddM1_assoc : forall a b c, unifiedAddM1 a (unifiedAddM1 b c) === unifiedAddM1 (unifiedAddM1 a b) c. + Proof. + unfold equiv, extendedPoint_eq; intros. + rewrite <-!unifiedAddM1_rep, twistedAddAssoc; auto. + Qed. + + Definition scalarMultM1 := iter_op unifiedAddM1 (mkExtendedPoint zero). + Definition scalarMultM1_spec := iter_op_spec unifiedAddM1 unifiedAddM1_assoc (mkExtendedPoint zero) unifiedAddM1_0_l. + Lemma scalarMultM1_rep : forall n P, unExtendedPoint (scalarMultM1 (N.of_nat n) P) = scalarMult n (unExtendedPoint P). + intros; rewrite scalarMultM1_spec, Nat2N.id. + induction n; [simpl; rewrite !unExtendedPoint_mkExtendedPoint; reflexivity|]. + unfold scalarMult; fold scalarMult. + rewrite <-IHn, unifiedAddM1_rep; auto. + Qed. + End TwistMinus1. + End ExtendedCoordinates. \ No newline at end of file -- cgit v1.2.3 From 5f3561d6de74183448ceaf03685b0a1aaa1d6e0a Mon Sep 17 00:00:00 2001 From: Andres Erbsen Date: Sun, 20 Mar 2016 18:59:20 -0400 Subject: Ed25519: d is nonsquare --- src/ModularArithmetic/PrimeFieldTheorems.v | 12 +++++++++++- src/Spec/Ed25519.v | 30 +++++++++++++++++++----------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/ModularArithmetic/PrimeFieldTheorems.v b/src/ModularArithmetic/PrimeFieldTheorems.v index 91ac63d26..77d84c455 100644 --- a/src/ModularArithmetic/PrimeFieldTheorems.v +++ b/src/ModularArithmetic/PrimeFieldTheorems.v @@ -294,7 +294,7 @@ Section VariousModPrime. } Qed. - Lemma euler_criterion_if : forall (a : F q) (q_odd : 2 < q), + Lemma euler_criterion_if' : forall (a : F q) (q_odd : 2 < q), if (orb (F_eqb a 0) (F_eqb (a ^ (Z.to_N (q / 2))) 1)) then (isSquare a) else (forall b, b ^ 2 <> a). Proof. @@ -309,6 +309,16 @@ Section VariousModPrime. apply euler_criterion_F in a_square; auto. Qed. + Lemma euler_criterion_if : forall (a : F q) (q_odd : 2 < q), + if (a =? 0) || (powmod q a (Z.to_N (q / 2)) =? 1) + then (isSquare a) else (forall b, b ^ 2 <> a). + Proof. + intros. + pose proof (euler_criterion_if' a q_odd) as H. + unfold F_eqb in *; simpl in *. + rewrite !Zmod_small, !@FieldToZ_pow_efficient in H by omega; eauto. + Qed. + Lemma sqrt_solutions : forall x y : F q, y ^ 2 = x ^ 2 -> y = x \/ y = opp x. Proof. intros ? ? squares_eq. diff --git a/src/Spec/Ed25519.v b/src/Spec/Ed25519.v index 92c36b56c..d6d02b93f 100644 --- a/src/Spec/Ed25519.v +++ b/src/Spec/Ed25519.v @@ -43,11 +43,26 @@ Proof. rewrite Z.mod_small; q_bound. Qed. -(* TODO *) -(* d = .*) +Hint Rewrite + @FieldToZ_add + @FieldToZ_mul + @FieldToZ_opp + @FieldToZ_inv_efficient + @FieldToZ_pow_efficient + @FieldToZ_ZToField + @Zmod_mod + : ZToField. + Definition d : F q := (opp (ZToField 121665) / (ZToField 121666))%F. -Lemma nonsquare_d : forall x, (x^2 <> d)%F. Admitted. -(* Definition nonsquare_d : (forall x, x^2 <> d) := euler_criterion_if d. <-- currently not computable in reasonable time *) +Lemma nonsquare_d : forall x, (x^2 <> d)%F. + pose proof @euler_criterion_if q prime_q d two_lt_q. + match goal with + [H: if ?b then ?x else ?y |- ?y ] => replace b with false in H; [exact H|clear H] + end. + unfold d, div. autorewrite with ZToField; [|eauto using prime_q, two_lt_q..]. + vm_compute. (* 10s *) + exact eq_refl. +Qed. (* 10s *) Instance TEParams : TwistedEdwardsParams := { q := q; @@ -117,13 +132,6 @@ Definition FlEncoding : encoding of F (Z.of_nat l) as word b := Lemma q_5mod8 : (q mod 8 = 5)%Z. cbv; reflexivity. Qed. -Hint Rewrite - @FieldToZ_pow_efficient - @FieldToZ_ZToField - @FieldToZ_opp - @FieldToZ_ZToField : ZToField - . - Lemma sqrt_minus1_valid : ((@ZToField q 2 ^ Z.to_N (q / 4)) ^ 2 = opp 1)%F. Proof. apply F_eq. -- cgit v1.2.3 From a189e7a6b7d0b462f128ab7eba1612f373c8ee6f Mon Sep 17 00:00:00 2001 From: Andres Erbsen Date: Sun, 20 Mar 2016 19:13:03 -0400 Subject: instantiate ed25519 sign in spec --- src/Spec/Ed25519.v | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Spec/Ed25519.v b/src/Spec/Ed25519.v index d6d02b93f..6ab47e8e5 100644 --- a/src/Spec/Ed25519.v +++ b/src/Spec/Ed25519.v @@ -64,7 +64,7 @@ Lemma nonsquare_d : forall x, (x^2 <> d)%F. exact eq_refl. Qed. (* 10s *) -Instance TEParams : TwistedEdwardsParams := { +Instance curve25519params : TwistedEdwardsParams := { q := q; prime_q := prime_q; two_lt_q := two_lt_q; @@ -140,15 +140,15 @@ Proof. reflexivity. Qed. -Definition PointEncoding := @point_encoding TEParams (b - 1) FqEncoding q_5mod8 sqrt_minus1_valid. +Definition PointEncoding := @point_encoding curve25519params (b - 1) FqEncoding q_5mod8 sqrt_minus1_valid. Definition H : forall n : nat, word n -> word (b + b). Admitted. Definition B : point. Admitted. (* TODO: B = decodePoint (y=4/5, x="positive") *) Definition B_nonzero : B <> zero. Admitted. Definition l_order_B : scalarMult l B = zero. Admitted. -Instance x : EdDSAParams := { - E := TEParams; +Local Instance ed25519params : EdDSAParams := { + E := curve25519params; b := b; H := H; c := c; @@ -168,3 +168,7 @@ Instance x : EdDSAParams := { l_odd := l_odd; l_order_B := l_order_B }. + +Definition ed25519_verify + : forall (pubkey:word b) (len:nat) (msg:word len) (sig:word (b+b)), bool + := @verify ed25519params. \ No newline at end of file -- cgit v1.2.3 From 0f77ed606c8687e5cdcd72c85eefde609c5e0de1 Mon Sep 17 00:00:00 2001 From: Andres Erbsen Date: Sun, 20 Mar 2016 20:06:28 -0400 Subject: state top-level derivation for Ed25519.verify --- _CoqProject | 1 + src/Specific/Ed25519.v | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/Specific/Ed25519.v diff --git a/_CoqProject b/_CoqProject index d7c71f7cb..6d2b3a880 100644 --- a/_CoqProject +++ b/_CoqProject @@ -20,6 +20,7 @@ src/Spec/EdDSA.v src/Spec/Encoding.v src/Spec/ModularArithmetic.v src/Spec/PointEncoding.v +src/Specific/Ed25519.v src/Specific/GF25519.v src/Tactics/VerdiTactics.v src/Util/CaseUtil.v diff --git a/src/Specific/Ed25519.v b/src/Specific/Ed25519.v new file mode 100644 index 000000000..33c8398f7 --- /dev/null +++ b/src/Specific/Ed25519.v @@ -0,0 +1,30 @@ +Require Import Crypto.Spec.Ed25519. +Require Import Crypto.Tactics.VerdiTactics. +Require Import BinNat BinInt NArith Crypto.Spec.ModularArithmetic. +Require Import Crypto.Spec.CompleteEdwardsCurve Crypto.CompleteEdwardsCurve.ExtendedCoordinates. + +Local Infix "++" := Word.combine. +Local Notation " a '[:' i ']' " := (Word.split1 i _ a) (at level 40). +Local Notation " a '[' i ':]' " := (Word.split2 i _ a) (at level 40). + +Lemma sharper_verify : { verify | forall pk l msg sig, verify pk l msg sig = ed25519_verify pk l msg sig}. +Proof. + eexists; intros. + cbv [ed25519_verify EdDSA.verify Encoding.dec EdDSA.PointEncoding PointEncoding + PointEncoding.point_encoding EdDSA.FlEncoding FlEncoding + Encoding.modular_word_encoding ed25519params]. + break_match. + break_match. + break_match. + repeat match goal with + | |- context [(?n * ?P)%E] => + rewrite <-(unExtendedPoint_mkExtendedPoint P); + erewrite <-scalarMultM1_rep + | |- context [(?P + unExtendedPoint _)%E] => + rewrite <-(unExtendedPoint_mkExtendedPoint P); + erewrite unifiedAddM1_rep + end. + rewrite !Znat.Z_nat_N, <-!Word.wordToN_nat. + + (* unfold scalarMultM1 at 1. *) +Admitted. \ No newline at end of file -- cgit v1.2.3 From 3d75a97748a6ce76364324762b919d3e54a4cac3 Mon Sep 17 00:00:00 2001 From: Andres Erbsen Date: Mon, 21 Mar 2016 23:21:50 -0400 Subject: nicer verify() derivation starter --- src/Spec/CompleteEdwardsCurve.v | 5 ++++- src/Spec/EdDSA.v | 3 +-- src/Specific/Ed25519.v | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/Spec/CompleteEdwardsCurve.v b/src/Spec/CompleteEdwardsCurve.v index 8dbfdf7b9..b7d2c0d8e 100644 --- a/src/Spec/CompleteEdwardsCurve.v +++ b/src/Spec/CompleteEdwardsCurve.v @@ -46,8 +46,11 @@ Section TwistedEdwardsCurves. | O => zero | S n' => unifiedAdd P (scalarMult n' P) end. + + Axiom point_eq_dec : forall P Q : point, {P = Q} + {P <> Q}. End TwistedEdwardsCurves. Delimit Scope E_scope with E. Infix "+" := unifiedAdd : E_scope. -Infix "*" := scalarMult : E_scope. \ No newline at end of file +Infix "*" := scalarMult : E_scope. +Infix "==" := point_eq_dec (no associativity, at level 70) : E_scope. diff --git a/src/Spec/EdDSA.v b/src/Spec/EdDSA.v index 6f57d7bec..c9660bd98 100644 --- a/src/Spec/EdDSA.v +++ b/src/Spec/EdDSA.v @@ -14,6 +14,7 @@ Infix "mod" := NPeano.modulo. Infix "++" := Word.combine. Section EdDSAParams. + Class EdDSAParams := { (* *) E : TwistedEdwardsParams; (* underlying elliptic curve *) @@ -70,8 +71,6 @@ Section EdDSA. (r + H (enc R ++ public sk ++ M) * s)) in enc R ++ enc S. - Axiom point_eq_dec : forall P Q : point, {P = Q} + {P <> Q}. - Infix "==" := point_eq_dec (no associativity, at level 70) : E_scope. Definition verify (A_:publickey) {n:nat} (M : Word.word n) (sig:signature) : bool := let R_ := Word.split1 b b sig in let S_ := Word.split2 b b sig in diff --git a/src/Specific/Ed25519.v b/src/Specific/Ed25519.v index 33c8398f7..efee4e7af 100644 --- a/src/Specific/Ed25519.v +++ b/src/Specific/Ed25519.v @@ -1,30 +1,49 @@ +Require Import Bedrock.Word. Require Import Crypto.Spec.Ed25519. Require Import Crypto.Tactics.VerdiTactics. Require Import BinNat BinInt NArith Crypto.Spec.ModularArithmetic. -Require Import Crypto.Spec.CompleteEdwardsCurve Crypto.CompleteEdwardsCurve.ExtendedCoordinates. +Require Import Crypto.Spec.CompleteEdwardsCurve. +Require Import Crypto.Spec.Encoding Crypto.Spec.PointEncoding. +Require Import Crypto.CompleteEdwardsCurve.ExtendedCoordinates. +Require Import Crypto.Util.IterAssocOp. Local Infix "++" := Word.combine. Local Notation " a '[:' i ']' " := (Word.split1 i _ a) (at level 40). Local Notation " a '[' i ':]' " := (Word.split2 i _ a) (at level 40). +Local Arguments H {_} _. +Local Arguments scalarMultM1 {_} {_} _ _. +Local Arguments unifiedAddM1 {_} {_} _ _. Lemma sharper_verify : { verify | forall pk l msg sig, verify pk l msg sig = ed25519_verify pk l msg sig}. Proof. eexists; intros. - cbv [ed25519_verify EdDSA.verify Encoding.dec EdDSA.PointEncoding PointEncoding - PointEncoding.point_encoding EdDSA.FlEncoding FlEncoding - Encoding.modular_word_encoding ed25519params]. - break_match. - break_match. - break_match. + cbv [ed25519_verify EdDSA.verify + ed25519params curve25519params + EdDSA.E EdDSA.B EdDSA.b EdDSA.l EdDSA.H + EdDSA.PointEncoding EdDSA.FlEncoding EdDSA.FqEncoding]. + + (* zoom in to the interesting case *) + repeat match goal with |- context[match ?a with Some x => _ | _ => _ end] => + let n := fresh x in + let H := fresh "Heq" x in + destruct a as [x|] + end. + + let p1 := constr:(scalarMultM1_rep eq_refl) in + let p2 := constr:(unifiedAddM1_rep eq_refl) in repeat match goal with | |- context [(?n * ?P)%E] => rewrite <-(unExtendedPoint_mkExtendedPoint P); - erewrite <-scalarMultM1_rep + erewrite <-p1 | |- context [(?P + unExtendedPoint _)%E] => rewrite <-(unExtendedPoint_mkExtendedPoint P); - erewrite unifiedAddM1_rep + erewrite p2 end. rewrite !Znat.Z_nat_N, <-!Word.wordToN_nat. - (* unfold scalarMultM1 at 1. *) + cbv [scalarMultM1 iter_op]. + Local Arguments funexp {_} _ {_} {_}. (* do not display the initializer and iteration bound for now *) + cbv iota zeta delta [test_and_op]. + + Admitted. \ No newline at end of file -- cgit v1.2.3 From 824d84126187f359605527beb947a385e43761c4 Mon Sep 17 00:00:00 2001 From: Andres Erbsen Date: Thu, 24 Mar 2016 18:15:48 -0400 Subject: ed25519 derivation: pair programming with jgross... slow progress --- src/Spec/EdDSA.v | 2 +- src/Specific/Ed25519.v | 148 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 128 insertions(+), 22 deletions(-) diff --git a/src/Spec/EdDSA.v b/src/Spec/EdDSA.v index c9660bd98..3decae6a7 100644 --- a/src/Spec/EdDSA.v +++ b/src/Spec/EdDSA.v @@ -74,9 +74,9 @@ Section EdDSA. Definition verify (A_:publickey) {n:nat} (M : Word.word n) (sig:signature) : bool := let R_ := Word.split1 b b sig in let S_ := Word.split2 b b sig in + match dec S_ : option (F (BinInt.Z.of_nat l)) with None => false | Some S' => match dec A_ : option point with None => false | Some A => match dec R_ : option point with None => false | Some R => - match dec S_ : option (F (BinInt.Z.of_nat l)) with None => false | Some S' => if BinInt.Z.to_nat (FieldToZ S') * B == R + (H (R_ ++ A_ ++ M)) * A then true else false end diff --git a/src/Specific/Ed25519.v b/src/Specific/Ed25519.v index efee4e7af..a705ceb90 100644 --- a/src/Specific/Ed25519.v +++ b/src/Specific/Ed25519.v @@ -14,7 +14,69 @@ Local Arguments H {_} _. Local Arguments scalarMultM1 {_} {_} _ _. Local Arguments unifiedAddM1 {_} {_} _ _. -Lemma sharper_verify : { verify | forall pk l msg sig, verify pk l msg sig = ed25519_verify pk l msg sig}. +Ltac set_evars := + repeat match goal with + | [ |- appcontext[?E] ] => is_evar E; let e := fresh "e" in set (e := E) + end. +Ltac subst_evars := + repeat match goal with + | [ e := ?E |- _ ] => is_evar E; subst e + end. + +Axiom point_eqb : forall {prm : TwistedEdwardsParams}, point -> point -> bool. +Axiom point_eqb_correct : forall P Q, point_eqb P Q = if point_eq_dec P Q then true else false. + +Require Import Coq.Setoids.Setoid. +Require Import Coq.Classes.Morphisms. +Global Instance option_rect_Proper_nd {A T} + : Proper ((pointwise_relation _ eq) ==> eq ==> eq ==> eq) (@option_rect A (fun _ => T)). +Proof. + intros ?? H ??? [|]??; subst; simpl; congruence. +Qed. + +Global Instance option_rect_Proper_nd' {A T} + : Proper ((pointwise_relation _ eq) ==> eq ==> forall_relation (fun _ => eq)) (@option_rect A (fun _ => T)). +Proof. + intros ?? H ??? [|]; subst; simpl; congruence. +Qed. + +Hint Extern 1 (Proper _ (@option_rect ?A (fun _ => ?T))) => exact (@option_rect_Proper_nd' A T) : typeclass_instances. + +Lemma option_rect_option_map : forall {A B C} (f:A->B) some none v, + option_rect (fun _ => C) (fun x => some (f x)) none v = option_rect (fun _ => C) some none (option_map f v). +Proof. + destruct v; reflexivity. +Qed. + +Axiom decode_scalar : word b -> option N. +Local Existing Instance Ed25519.FlEncoding. +Axiom decode_scalar_correct : forall x, decode_scalar x = option_map (fun x : F (Z.of_nat Ed25519.l) => Z.to_N x) (dec x). + +Local Infix "==?" := point_eqb (at level 70) : E_scope. + +Axiom negate : point -> point. +Definition point_sub P Q := (P + negate Q)%E. +Infix "-" := point_sub : E_scope. +Axiom solve_for_R : forall A B C, (A ==? B + C)%E = (B ==? A - C)%E. + +Axiom negateExtended : extendedPoint -> extendedPoint. +Axiom negateExtended_correct : forall P, negate (unExtendedPoint P) = unExtendedPoint (negateExtended P). + +Local Existing Instance PointEncoding. +Axiom decode_point_eq : forall (P_ Q_ : word (S (b-1))) (P Q:point), dec P_ = Some P -> dec Q_ = Some Q -> weqb P_ Q_ = (P ==? Q)%E. + +Lemma decode_test_encode_test : forall S_ X, option_rect (fun _ : option point => bool) + (fun S : point => (S ==? X)%E) false (dec S_) = weqb S_ (enc X). +Proof. + intros. + destruct (dec S_) eqn:H. + { symmetry; eauto using decode_point_eq, encoding_valid. } + { simpl @option_rect. + destruct (weqb S_ (enc X)) eqn:Heqb; trivial. + apply weqb_true_iff in Heqb. subst. rewrite encoding_valid in H; discriminate. } +Qed. + +Lemma sharper_verify : forall pk l msg sig, { verify | verify = ed25519_verify pk l msg sig}. Proof. eexists; intros. cbv [ed25519_verify EdDSA.verify @@ -22,28 +84,72 @@ Proof. EdDSA.E EdDSA.B EdDSA.b EdDSA.l EdDSA.H EdDSA.PointEncoding EdDSA.FlEncoding EdDSA.FqEncoding]. - (* zoom in to the interesting case *) - repeat match goal with |- context[match ?a with Some x => _ | _ => _ end] => - let n := fresh x in - let H := fresh "Heq" x in - destruct a as [x|] - end. + etransitivity. + Focus 2. + { repeat match goal with + | [ |- ?x = ?x ] => reflexivity + | [ |- _ = match ?a with None => ?N | Some x => @?S x end :> ?T ] + => etransitivity; + [ + | refine (_ : option_rect (fun _ => T) _ N a = _); + let S' := match goal with |- option_rect _ ?S' _ _ = _ => S' end in + refine (option_rect (fun a' => option_rect (fun _ => T) S' N a' = match a' with None => N | Some x => S x end) + (fun x => _) _ a); intros; simpl @option_rect ]; + [ reflexivity | .. ] + end. + set_evars. + rewrite<- point_eqb_correct. + rename x0 into R. rename x1 into S. rename x into A. + rewrite solve_for_R. + let p1 := constr:(scalarMultM1_rep eq_refl) in + let p2 := constr:(unifiedAddM1_rep eq_refl) in + repeat match goal with + | |- context [(_ * ?P)%E] => + rewrite <-(unExtendedPoint_mkExtendedPoint P); + rewrite <-p1 + | |- context [(?P + unExtendedPoint _)%E] => + rewrite <-(unExtendedPoint_mkExtendedPoint P); + rewrite p2 + end; + rewrite ?Znat.Z_nat_N, <-?Word.wordToN_nat; + subst_evars; + reflexivity. + } Unfocus. + + etransitivity. + Focus 2. + { lazymatch goal with |- _ = option_rect _ _ ?false ?dec => + symmetry; etransitivity; [|eapply (option_rect_option_map (fun (x:F _) => Z.to_N x) _ false dec)] + end. + eapply option_rect_Proper_nd; [intro|reflexivity..]. + match goal with + | [ |- ?RHS = ?e ?v ] + => let RHS' := (match eval pattern v in RHS with ?RHS' _ => RHS' end) in + unify e RHS' + end. + reflexivity. + } Unfocus. + rewrite <-decode_scalar_correct. + + etransitivity. + Focus 2. + { do 2 (eapply option_rect_Proper_nd; [intro|reflexivity..]). + symmetry; apply decode_test_encode_test. + } Unfocus. + + etransitivity. + Focus 2. + { do 2 (eapply option_rect_Proper_nd; [intro|reflexivity..]). + unfold point_sub. rewrite negateExtended_correct. + let p := constr:(unifiedAddM1_rep eq_refl) in rewrite p. + reflexivity. + } Unfocus. - let p1 := constr:(scalarMultM1_rep eq_refl) in - let p2 := constr:(unifiedAddM1_rep eq_refl) in - repeat match goal with - | |- context [(?n * ?P)%E] => - rewrite <-(unExtendedPoint_mkExtendedPoint P); - erewrite <-p1 - | |- context [(?P + unExtendedPoint _)%E] => - rewrite <-(unExtendedPoint_mkExtendedPoint P); - erewrite p2 - end. - rewrite !Znat.Z_nat_N, <-!Word.wordToN_nat. - cbv [scalarMultM1 iter_op]. - Local Arguments funexp {_} _ {_} {_}. (* do not display the initializer and iteration bound for now *) cbv iota zeta delta [test_and_op]. + Local Arguments funexp {_} _ {_} {_}. (* do not display the initializer and iteration bound for now *) - + Axiom rep : forall {m}, list Z -> F m -> Prop. + Axiom decode_point_limbs : word (S (b-1)) -> option (list Z * list Z). + Axiom point_dec_rep : forall P_ P lx ly, dec P_ = Some P -> decode_point_limbs P_ = Some (lx, ly) -> rep lx (fst (proj1_sig P)) /\ rep ly (fst (proj1_sig P)). Admitted. \ No newline at end of file -- cgit v1.2.3 From d819eeb7bd87746b62f6a6398f6ad69edb89a5ff Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Tue, 29 Mar 2016 14:22:53 -0400 Subject: Drop second projections in Ed25519 --- src/Spec/PointEncoding.v | 21 +++++++++ src/Specific/Ed25519.v | 112 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 127 insertions(+), 6 deletions(-) diff --git a/src/Spec/PointEncoding.v b/src/Spec/PointEncoding.v index 4823ef28f..e1d3744fb 100644 --- a/src/Spec/PointEncoding.v +++ b/src/Spec/PointEncoding.v @@ -57,6 +57,18 @@ Section PointEncoding. Definition sign_bit (x : F q) := (wordToN (enc (opp x)) None + | Some y => let x2 := solve_for_x2 y in + let x := sqrt_mod_q x2 in + if F_eq_dec (x ^ 2) x2 + then if Bool.eqb (whd w) (sign_bit x) + then Some (x, y) + else Some (opp x, y) + else None + end. + Definition point_dec (w : word (S sz)) : option point := match dec (wtl w) with | None => None @@ -70,6 +82,15 @@ Definition point_dec (w : word (S sz)) : option point := end end. +Lemma point_dec_coordinates_correct w + : option_map (@proj1_sig _ _) (point_dec w) = point_dec_coordinates w. +Proof. + unfold point_dec, point_dec_coordinates. + edestruct dec; [ | reflexivity ]. + edestruct @F_eq_dec; [ | reflexivity ]. + edestruct @Bool.eqb; reflexivity. +Qed. + Lemma y_decode : forall p, dec (wtl (point_enc p)) = Some (snd (proj1_sig p)). Proof. intros. diff --git a/src/Specific/Ed25519.v b/src/Specific/Ed25519.v index a705ceb90..32de3dc13 100644 --- a/src/Specific/Ed25519.v +++ b/src/Specific/Ed25519.v @@ -14,18 +14,52 @@ Local Arguments H {_} _. Local Arguments scalarMultM1 {_} {_} _ _. Local Arguments unifiedAddM1 {_} {_} _ _. -Ltac set_evars := +Local Ltac set_evars := repeat match goal with | [ |- appcontext[?E] ] => is_evar E; let e := fresh "e" in set (e := E) end. -Ltac subst_evars := +Local Ltac subst_evars := repeat match goal with | [ e := ?E |- _ ] => is_evar E; subst e end. +Lemma funexp_proj {T T'} (proj : T -> T') (f : T -> T) (f' : T' -> T') x n + (f_proj : forall a, proj (f a) = f' (proj a)) + : proj (funexp f x n) = funexp f' (proj x) n. +Proof. + revert x; induction n as [|n IHn]; simpl; congruence. +Qed. + +Lemma iter_op_proj {T T'} (proj : T -> T') (op : T -> T -> T) (op' : T' -> T' -> T') x y z + (op_proj : forall a b, proj (op a b) = op' (proj a) (proj b)) + : proj (iter_op op x y z) = iter_op op' (proj x) y (proj z). +Proof. + unfold iter_op. + simpl. + lazymatch goal with + | [ |- ?proj (snd (funexp ?f ?x ?n)) = snd (funexp ?f' _ ?n) ] + => pose proof (fun x0 x1 => funexp_proj (fun x => (fst x, proj (snd x))) f f' (x0, x1)) as H' + end. + simpl in H'. + rewrite <- H'. + { reflexivity. } + { intros [??]; simpl. + repeat match goal with + | [ |- context[match ?n with _ => _ end] ] + => destruct n eqn:? + | _ => progress simpl + | _ => progress subst + | _ => reflexivity + | _ => rewrite op_proj + end. } +Qed. + Axiom point_eqb : forall {prm : TwistedEdwardsParams}, point -> point -> bool. Axiom point_eqb_correct : forall P Q, point_eqb P Q = if point_eq_dec P Q then true else false. +Axiom Bc : F q * F q. +Axiom B_proj : proj1_sig B = Bc. + Require Import Coq.Setoids.Setoid. Require Import Coq.Classes.Morphisms. Global Instance option_rect_Proper_nd {A T} @@ -59,7 +93,13 @@ Definition point_sub P Q := (P + negate Q)%E. Infix "-" := point_sub : E_scope. Axiom solve_for_R : forall A B C, (A ==? B + C)%E = (B ==? A - C)%E. -Axiom negateExtended : extendedPoint -> extendedPoint. +Axiom negateExtendedc : extended -> extended. +Definition negateExtended : extendedPoint -> extendedPoint. +Proof. + intro x. + exists (negateExtendedc (proj1_sig x)). + admit. +Defined. Axiom negateExtended_correct : forall P, negate (unExtendedPoint P) = unExtendedPoint (negateExtended P). Local Existing Instance PointEncoding. @@ -76,6 +116,18 @@ Proof. apply weqb_true_iff in Heqb. subst. rewrite encoding_valid in H; discriminate. } Qed. +Definition enc' : F q * F q -> word (S (b - 1)). +Proof. + intro x. + let enc' := (eval hnf in (@enc (@point curve25519params) _ _)) in + match (eval cbv [proj1_sig] in (fun pf => enc' (exist _ x pf))) with + | (fun _ => ?enc') => exact enc' + end. +Defined. + +Definition enc'_correct : @enc (@point curve25519params) _ _ = (fun x => enc' (proj1_sig x)) + := eq_refl. + Lemma sharper_verify : forall pk l msg sig, { verify | verify = ed25519_verify pk l msg sig}. Proof. eexists; intros. @@ -145,11 +197,59 @@ Proof. reflexivity. } Unfocus. - cbv [scalarMultM1 iter_op]. + rewrite enc'_correct. + cbv [unExtendedPoint unifiedAddM1 negateExtended scalarMultM1]. + unfold proj1_sig at 1 2 5 6. + etransitivity. + Focus 2. + { do 2 (eapply option_rect_Proper_nd; [intro|reflexivity..]). + set_evars. + repeat match goal with + | [ |- appcontext[@proj1_sig ?A ?P (@iter_op ?T ?f ?x ?y ?z)] ] + => erewrite (@iter_op_proj T A (@proj1_sig _ _)) by reflexivity + end. + subst_evars. + reflexivity. } + Unfocus. + + cbv [mkExtendedPoint zero mkPoint]. + unfold proj1_sig at 1 2 3 5 6 7. + rewrite B_proj. + + etransitivity. + Focus 2. + { do 1 (eapply option_rect_Proper_nd; [intro|reflexivity..]). + set_evars. + lazymatch goal with |- _ = option_rect _ _ ?false ?dec => + symmetry; etransitivity; [|eapply (option_rect_option_map (@proj1_sig _ _) _ false dec)] + end. + eapply option_rect_Proper_nd; [intro|reflexivity..]. + match goal with + | [ |- ?RHS = ?e ?v ] + => let RHS' := (match eval pattern v in RHS with ?RHS' _ => RHS' end) in + unify e RHS' + end. + reflexivity. + } Unfocus. + + cbv [dec PointEncoding point_encoding]. + etransitivity. + Focus 2. + { do 1 (eapply option_rect_Proper_nd; [intro|reflexivity..]). + etransitivity. + Focus 2. + { apply f_equal. + symmetry. + apply point_dec_coordinates_correct. } + Unfocus. + reflexivity. } + Unfocus. + + (* cbv iota zeta delta [test_and_op]. Local Arguments funexp {_} _ {_} {_}. (* do not display the initializer and iteration bound for now *) Axiom rep : forall {m}, list Z -> F m -> Prop. Axiom decode_point_limbs : word (S (b-1)) -> option (list Z * list Z). - Axiom point_dec_rep : forall P_ P lx ly, dec P_ = Some P -> decode_point_limbs P_ = Some (lx, ly) -> rep lx (fst (proj1_sig P)) /\ rep ly (fst (proj1_sig P)). -Admitted. \ No newline at end of file + Axiom point_dec_rep : forall P_ P lx ly, dec P_ = Some P -> decode_point_limbs P_ = Some (lx, ly) -> rep lx (fst (proj1_sig P)) /\ rep ly (fst (proj1_sig P)).*) +Admitted. -- cgit v1.2.3