Documentation

Complexity.Crypto.Computational.CramerShoup.ProjectiveHash

Universal and $\text{universal}_2$ projective hash functions over prime-order groups #

This module formalizes the universal and $\text{universal}_2$ projective hash families over a PrimeOrderGroupFamily from Boneh and Shoup, Sections 12.5.1–12.5.2, printed pp. 484–488, which form the algebraic core of the Cramer–Shoup public-key encryption scheme (Section 12.5.3 and Exercise 12.27).

Groups are written additively as ZMod (F.order d)-modules (matching DiscreteLog, DiffieHellman, and ElGamal), so the book's $v^\sigma w^\tau$ is $\sigma \bullet v + \tau \bullet w$.

Source Statements ([BS23], Sections 12.5.1–12.5.2, printed pp. 485–488) #

Verbatim from [BS23], Section 12.5.1 (printed p. 485):

The function $f := f_{\sigma, \tau}$ is indexed by randomly chosen $\sigma, \tau \in \mathbb{Z}_q$, and is defined as follows: $$f_{\sigma, \tau} : \mathbb{G}^2 \to \mathbb{G}, \quad (v, w) \mapsto v^\sigma w^\tau. \quad (12.13)$$ The auxiliary information $h$ that defines $f$ on $L_u$ is $$h := f(g, u) = g^\sigma u^\tau. \quad (12.14)$$ … Lemma 12.5. Suppose $\sigma$ and $\tau$ are uniformly and independently distributed over $\mathbb{Z}_q$. Then for all $u, v, w, h, z \in \mathbb{G}$, if $(u, v, w)$ is not a DH-triple, then $$\Pr[g^\sigma u^\tau = h \land v^\sigma w^\tau = z] = \frac{1}{q^2}.$$

Verbatim from [BS23], Section 12.5.2 (printed pp. 487–488):

We define a new function $f' := f'_{\sigma_1, \tau_1, \sigma_2, \tau_2}$, indexed by randomly chosen $\sigma_1, \tau_1, \sigma_2, \tau_2 \in \mathbb{Z}_q$, as follows $$f'_{\sigma_1, \tau_1, \sigma_2, \tau_2} : \mathbb{G}^2 \times \mathbb{Z}_q \to \mathbb{G}, \quad (v, w, \rho) \mapsto f_{\sigma_1, \tau_1}(v, w) \cdot f_{\sigma_2, \tau_2}(v, w)^\rho = v^{\sigma_1 + \rho \sigma_2} w^{\tau_1 + \rho \tau_2}. \quad (12.16)$$ The auxiliary information that defines $f'$ on $L_u \times \mathbb{Z}_q$ is $h' := (h_1, h_2)$, where $h_i$ is the auxiliary information that defines $f_{\sigma_i, \tau_i}$ on $L_u$; that is $$h_i := f_{\sigma_i, \tau_i}(g, u) = g^{\sigma_i} u^{\tau_i} \quad \text{for } i = 1, 2. \quad (12.17)$$ … Lemma 12.7. Suppose $\sigma_1, \tau_1, \sigma_2, \tau_2$ are uniformly and independently distributed over $\mathbb{Z}_q$. Then for all $u, v, w, \hat{v}, \hat{w}, h_1, h_2, z, \hat{z} \in \mathbb{G}$ and all $\rho, \hat{\rho} \in \mathbb{Z}_q$, if $(u, v, w)$ and $(u, \hat{v}, \hat{w})$ are not DH-triples, and $\rho \ne \hat{\rho}$, then $$\Pr[g^{\sigma_1} u^{\tau_1} = h_1 \land g^{\sigma_2} u^{\tau_2} = h_2 \land v^{\sigma_1 + \rho_1 \sigma_2} w^{\tau_1 + \rho_1 \tau_2} = z \land \hat{v}^{\sigma_1 + \rho_2 \sigma_2} \hat{w}^{\tau_1 + \rho_2 \tau_2} = \hat{z}] = \frac{1}{q^4}.$$ … Lemma 12.8. In Attack Game 12.5, for any adversary $\mathcal{A}$ that outputs at most $Q$ tuples, the probability that it wins is at most $Q/q$.

Attack Game 12.5 itself is not formalized as a standalone game here; instead, this module proves the explicit change-of-variables equivalences (projHashFiberChangeEquiv, projHash2FiberChangeEquiv), the single-tuple 1 / q hit law (uniform_projHash2_fiber_apply), and the finite-list Q / q union bound (uniform_projHash2_fiber_any_le) on the τ₂-fiber given δ₁ = σ₁ + α * τ₁, δ₂ = σ₂ + α * τ₂, and ξ = τ₁ + ρ * τ₂ (where (h₁, h₂, z) and all DH queries depend only on (δ₁, δ₂, ξ)). The adaptive decryption-oracle reduction for Cramer–Shoup using these ingredients is carried by Complexity/Crypto/Computational/CramerShoup.lean (PR 2).

Main definitions #

Main results #

References #

Universal projective hash functions ([BS23], Section 12.5.1, printed p. 485) #

def Cslib.Crypto.ProjectiveHash.projHash (F : PrimeOrderGroupFamily) (d : F.Desc) (σ τ : ZMod (F.order d)) (v w : F.Carrier d) :

Universal projective hash evaluation f_{σ,τ}(v, w) = σ • v + τ • w ([BS23], Section 12.5.1, equation (12.13), printed p. 485).

Instances For

    Auxiliary public projection h = f_{σ,τ}(g, u) = σ • g + τ • u ([BS23], Section 12.5.1, equation (12.14), printed p. 485).

    Instances For
      @[simp]
      theorem Cslib.Crypto.ProjectiveHash.projHash_smul_generator (F : PrimeOrderGroupFamily) (d : F.Desc) (σ τ β : ZMod (F.order d)) (u : F.Carrier d) :
      projHash F d σ τ (β • F.generator d) (β • u) = β • projHashAux F d σ τ u

      Projective property of projHash on $L_u$ ([BS23], Section 12.5.1, printed p. 485): on any Diffie–Hellman pair (v, w) = (β • g, β • u), f_{σ,τ}(v, w) = β • h.

      @[simp]
      theorem Cslib.Crypto.ProjectiveHash.projHashAux_generator_smul (F : PrimeOrderGroupFamily) (d : F.Desc) (σ τ α : ZMod (F.order d)) :
      projHashAux F d σ τ (α • F.generator d) = (σ + α * τ) • F.generator d

      Explicit generator-exponent form of projHashAux on u = α • g.

      @[simp]
      theorem Cslib.Crypto.ProjectiveHash.projHash_generator_smul (F : PrimeOrderGroupFamily) (d : F.Desc) (σ τ β γ : ZMod (F.order d)) :
      projHash F d σ τ (β • F.generator d) (γ • F.generator d) = (β * σ + γ * τ) • F.generator d

      Explicit generator-exponent form of projHash on (v, w) = (β • g, γ • g).

      theorem Cslib.Crypto.ProjectiveHash.projHash_fiber_eq (F : PrimeOrderGroupFamily) (d : F.Desc) (α β γ δ τ : ZMod (F.order d)) :
      projHash F d (δ - α * τ) τ (β • F.generator d) (γ • F.generator d) = (β * δ + (γ - α * β) * τ) • F.generator d

      On the fiber σ = δ - α * τ where projHashAux F d σ τ (α • g) = δ • g, evaluating projHash on (β • g, γ • g) gives (β * δ + (γ - α * β) * τ) • g.

      theorem Cslib.Crypto.ProjectiveHash.projHashAux_fiber_eq (F : PrimeOrderGroupFamily) (d : F.Desc) (α δ τ : ZMod (F.order d)) :
      projHashAux F d (δ - α * τ) τ (α • F.generator d) = δ • F.generator d

      On the fiber σ = δ - α * τ, the auxiliary projection projHashAux is independent of τ and equals δ • g.

      The fiber change-of-variables (δ, τ) ↦ (δ - α * τ, τ) on ZMod (F.order d) × ZMod (F.order d) under which projHashAux F d σ τ (α • g) = δ • g depends only on δ.

      Instances For
        def Cslib.Crypto.ProjectiveHash.projHashFiberEquiv (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ : ZMod (F.order d)} (hγ : γ ≠ α * β) (δ : ZMod (F.order d)) :
        ZMod (F.order d) ≃ ZMod (F.order d)

        The affine bijection τ ↦ β * δ + (γ - α * β) * τ on ZMod (F.order d) when γ ≠ α * β.

        Instances For
          @[simp]
          theorem Cslib.Crypto.ProjectiveHash.projHashFiberEquiv_apply (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ : ZMod (F.order d)} (hγ : γ ≠ α * β) (δ τ : ZMod (F.order d)) :
          (projHashFiberEquiv F d hγ δ) τ = β * δ + (γ - α * β) * τ
          def Cslib.Crypto.ProjectiveHash.projHashEquiv (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ : ZMod (F.order d)} (hγ : γ ≠ α * β) :
          ZMod (F.order d) × ZMod (F.order d) ≃ ZMod (F.order d) × ZMod (F.order d)

          Explicit 2×2 linear equivalence (σ, τ) ↦ (σ + α * τ, β * p.1 + γ * p.2) on ZMod (F.order d) × ZMod (F.order d) when γ ≠ α * β ([BS23], proof of Lemma 12.5, printed pp. 485–486).

          Instances For
            theorem Cslib.Crypto.ProjectiveHash.projHash_bijective_of_ne (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ : ZMod (F.order d)} (hγ : γ ≠ α * β) :
            Function.Bijective fun (p : ZMod (F.order d) × ZMod (F.order d)) => (projHashAux F d p.1 p.2 (α • F.generator d), projHash F d p.1 p.2 (β • F.generator d) (γ • F.generator d))

            Lemma 12.5 bijection ([BS23], Section 12.5.1, printed p. 485): when γ ≠ α * β, the map (σ, τ) ↦ (projHashAux F d σ τ (α • g), projHash F d σ τ (β • g) (γ • g)) is a bijection from ZMod (F.order d) × ZMod (F.order d) to F.Carrier d × F.Carrier d.

            theorem Cslib.Crypto.ProjectiveHash.uniform_projHash_apply_of_ne (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ : ZMod (F.order d)} (hγ : γ ≠ α * β) (h z : F.Carrier d) :
            (PMF.map (fun (p : ZMod (F.order d) × ZMod (F.order d)) => (projHashAux F d p.1 p.2 (α • F.generator d), projHash F d p.1 p.2 (β • F.generator d) (γ • F.generator d))) (Probability.PMF.uniformOfFintype (ZMod (F.order d) × ZMod (F.order d)))) (h, z) = (↑(F.order d) ^ 2)⁻¹

            Lemma 12.5 (1 / q ^ 2 joint point mass) ([BS23], Section 12.5.1, printed p. 485): under uniform (σ, τ) : ZMod (F.order d) × ZMod (F.order d), for any non-DH triple γ ≠ α * β and any h, z : F.Carrier d, the joint pair (projHashAux F d σ τ (α • g), projHash F d σ τ (β • g) (γ • g)) equals (h, z) with probability ((F.order d : ℝ≥0∞) ^ 2)⁻¹.

            theorem Cslib.Crypto.ProjectiveHash.uniform_projHash_fiber (F : PrimeOrderGroupFamily) {α_out : Type u_1} (d : F.Desc) {α β γ : ZMod (F.order d)} (hγ : γ ≠ α * β) (δ : ZMod (F.order d)) (f : F.Carrier d → PMF α_out) :
            ((Probability.PMF.uniformOfFintype (ZMod (F.order d))).bind fun (τ : ZMod (F.order d)) => f (projHash F d (δ - α * τ) τ (β • F.generator d) (γ • F.generator d))) = (Probability.PMF.uniformOfFintype (ZMod (F.order d))).bind fun (ζ : ZMod (F.order d)) => f (ζ • F.generator d)

            Consequence of Lemma 12.5 (conditional uniformity on the τ-fiber) ([BS23], Section 12.5.1, printed p. 485): under the change of variables projHashFiberChangeEquiv (σ = δ - α * τ, so h = δ • g), for any fixed δ and uniform τ : ZMod (F.order d), projHash F d (δ - α * τ) τ (β • g) (γ • g) has the same distribution as ζ • g for a uniform ζ : ZMod (F.order d) whenever γ ≠ α * β.

            theorem Cslib.Crypto.ProjectiveHash.uniform_projHash_fiber_add (F : PrimeOrderGroupFamily) {α_out : Type u_1} (d : F.Desc) {α β γ : ZMod (F.order d)} (hγ : γ ≠ α * β) (δ : ZMod (F.order d)) (m : F.Carrier d) (f : F.Carrier d → PMF α_out) :
            ((Probability.PMF.uniformOfFintype (ZMod (F.order d))).bind fun (τ : ZMod (F.order d)) => f (projHash F d (δ - α * τ) τ (β • F.generator d) (γ • F.generator d) + m)) = (Probability.PMF.uniformOfFintype (ZMod (F.order d))).bind fun (ζ : ZMod (F.order d)) => f (ζ • F.generator d)

            One-time group mask via projHash on a non-DH triple: fixing δ = σ + α * τ, for any message m : F.Carrier d and any non-DH triple γ ≠ α * β, masking m by projHash F d (δ - α * τ) τ (β • g) (γ • g) + m under uniform τ has the same distribution as ζ • g for uniform ζ : ZMod (F.order d) (and is therefore independent of m).

            $\text{Universal}_2$ projective hash functions ([BS23], Section 12.5.2) #

            def Cslib.Crypto.ProjectiveHash.projHash2 (F : PrimeOrderGroupFamily) (d : F.Desc) (σ₁ τ₁ σ₂ τ₂ ρ : ZMod (F.order d)) (v w : F.Carrier d) :

            $\text{Universal}_2$ projective hash evaluation f'_{σ₁,τ₁,σ₂,τ₂}(v, w, ρ) = (σ₁ + ρ * σ₂) • v + (τ₁ + ρ * τ₂) • w ([BS23], Section 12.5.2, equation (12.16), printed p. 487).

            Instances For
              def Cslib.Crypto.ProjectiveHash.projHash2Aux (F : PrimeOrderGroupFamily) (d : F.Desc) (σ₁ τ₁ σ₂ τ₂ : ZMod (F.order d)) (u : F.Carrier d) :

              Auxiliary public projection pair (h₁, h₂) = (σ₁ • g + τ₁ • u, σ₂ • g + τ₂ • u) ([BS23], Section 12.5.2, equation (12.17), printed p. 487).

              Instances For
                theorem Cslib.Crypto.ProjectiveHash.projHash2_eq_projHash_add (F : PrimeOrderGroupFamily) (d : F.Desc) (σ₁ τ₁ σ₂ τ₂ ρ : ZMod (F.order d)) (v w : F.Carrier d) :
                projHash2 F d σ₁ τ₁ σ₂ τ₂ ρ v w = projHash F d σ₁ τ₁ v w + ρ • projHash F d σ₂ τ₂ v w

                projHash2 decomposes as f_{σ₁,τ₁}(v, w) + ρ • f_{σ₂,τ₂}(v, w) ([BS23], equation (12.16), printed p. 487).

                @[simp]
                theorem Cslib.Crypto.ProjectiveHash.projHash2_smul_generator (F : PrimeOrderGroupFamily) (d : F.Desc) (σ₁ τ₁ σ₂ τ₂ β ρ : ZMod (F.order d)) (u : F.Carrier d) :
                projHash2 F d σ₁ τ₁ σ₂ τ₂ ρ (β • F.generator d) (β • u) = β • ((projHash2Aux F d σ₁ τ₁ σ₂ τ₂ u).1 + ρ • (projHash2Aux F d σ₁ τ₁ σ₂ τ₂ u).2)

                Projective property of projHash2 on $L_u$ ([BS23], Section 12.5.2, printed p. 487): on any Diffie–Hellman pair (v, w) = (β • g, β • u), f'(v, w, ρ) = β • (h₁ + ρ • h₂).

                @[simp]
                theorem Cslib.Crypto.ProjectiveHash.projHash2_generator_smul (F : PrimeOrderGroupFamily) (d : F.Desc) (σ₁ τ₁ σ₂ τ₂ ρ β γ : ZMod (F.order d)) :
                projHash2 F d σ₁ τ₁ σ₂ τ₂ ρ (β • F.generator d) (γ • F.generator d) = (β * (σ₁ + ρ * σ₂) + γ * (τ₁ + ρ * τ₂)) • F.generator d

                Explicit generator-exponent form of projHash2 on (v, w) = (β • g, γ • g).

                theorem Cslib.Crypto.ProjectiveHash.projHash2_fiber_eq (F : PrimeOrderGroupFamily) (d : F.Desc) (α β γ δ₁ δ₂ τ₁ τ₂ ρ : ZMod (F.order d)) :
                projHash2 F d (δ₁ - α * τ₁) τ₁ (δ₂ - α * τ₂) τ₂ ρ (β • F.generator d) (γ • F.generator d) = (β * (δ₁ + ρ * δ₂) + (γ - α * β) * (τ₁ + ρ * τ₂)) • F.generator d

                On the fiber σ₁ = δ₁ - α * τ₁ and σ₂ = δ₂ - α * τ₂ (where (h₁, h₂) = (δ₁ • g, δ₂ • g)), evaluating projHash2 on (β • g, γ • g, ρ) gives (β * (δ₁ + ρ * δ₂) + (γ - α * β) * (τ₁ + ρ * τ₂)) • g.

                theorem Cslib.Crypto.ProjectiveHash.projHash2_fiber_dh (F : PrimeOrderGroupFamily) (d : F.Desc) (α β δ₁ δ₂ τ₁ τ₂ ρ : ZMod (F.order d)) :
                projHash2 F d (δ₁ - α * τ₁) τ₁ (δ₂ - α * τ₂) τ₂ ρ (β • F.generator d) ((α * β) • F.generator d) = (β * (δ₁ + ρ * δ₂)) • F.generator d

                On a Diffie–Hellman triple γ = α * β, projHash2 on the fiber σ₁ = δ₁ - α * τ₁, σ₂ = δ₂ - α * τ₂ equals (β * (δ₁ + ρ * δ₂)) • g, independent of (τ₁, τ₂).

                @[simp]
                theorem Cslib.Crypto.ProjectiveHash.projHash2Aux_fiber_eq (F : PrimeOrderGroupFamily) (d : F.Desc) (α δ₁ δ₂ τ₁ τ₂ : ZMod (F.order d)) :
                projHash2Aux F d (δ₁ - α * τ₁) τ₁ (δ₂ - α * τ₂) τ₂ (α • F.generator d) = (δ₁ • F.generator d, δ₂ • F.generator d)

                On the fiber σ₁ = δ₁ - α * τ₁ and σ₂ = δ₂ - α * τ₂, projHash2Aux is (δ₁ • g, δ₂ • g).

                The 4-tuple fiber change-of-variables ((δ₁, δ₂), (ξ, τ₂)) ↦ ((δ₁ - α * (ξ - ρ * τ₂), ξ - ρ * τ₂), (δ₂ - α * τ₂, τ₂)) on (ZMod (F.order d) × ZMod (F.order d)) × (ZMod (F.order d) × ZMod (F.order d)), under which (h₁, h₂), the challenge tag on (β • g, γ • g, ρ), and all Diffie–Hellman queries depend only on (δ₁, δ₂, ξ) and are independent of τ₂.

                Instances For
                  @[simp]
                  theorem Cslib.Crypto.ProjectiveHash.projHash2FiberChangeEquiv_apply (F : PrimeOrderGroupFamily) (d : F.Desc) (α ρ δ₁ δ₂ ξ τ₂ : ZMod (F.order d)) :
                  (projHash2FiberChangeEquiv F d α ρ) ((δ₁, δ₂), ξ, τ₂) = ((δ₁ - α * (ξ - ρ * τ₂), ξ - ρ * τ₂), δ₂ - α * τ₂, τ₂)
                  theorem Cslib.Crypto.ProjectiveHash.projHash2_fiber_challenge_eq (F : PrimeOrderGroupFamily) (d : F.Desc) (α β γ δ₁ δ₂ ξ τ₂ ρ : ZMod (F.order d)) :
                  projHash2 F d (δ₁ - α * (ξ - ρ * τ₂)) (ξ - ρ * τ₂) (δ₂ - α * τ₂) τ₂ ρ (β • F.generator d) (γ • F.generator d) = (β * (δ₁ + ρ * δ₂) + (γ - α * β) * ξ) • F.generator d

                  Further conditioning on ξ = τ₁ + ρ * τ₂ (so τ₁ = ξ - ρ * τ₂) makes the challenge tag on (β • g, γ • g, ρ) equal to (β * (δ₁ + ρ * δ₂) + (γ - α * β) * ξ) • g, independent of τ₂.

                  theorem Cslib.Crypto.ProjectiveHash.projHash2_fiber_query_eq (F : PrimeOrderGroupFamily) (d : F.Desc) (α β' γ' δ₁ δ₂ ξ τ₂ ρ ρ' : ZMod (F.order d)) :
                  projHash2 F d (δ₁ - α * (ξ - ρ * τ₂)) (ξ - ρ * τ₂) (δ₂ - α * τ₂) τ₂ ρ' (β' • F.generator d) (γ' • F.generator d) = (β' * (δ₁ + ρ' * δ₂) + (γ' - α * β') * ξ + (γ' - α * β') * (ρ' - ρ) * τ₂) • F.generator d

                  Further conditioning on ξ = τ₁ + ρ * τ₂ (so τ₁ = ξ - ρ * τ₂), a query on (β' • g, γ' • g, ρ') evaluates to (β' * (δ₁ + ρ' * δ₂) + (γ' - α * β') * ξ + (γ' - α * β') * (ρ' - ρ) * τ₂) • g.

                  def Cslib.Crypto.ProjectiveHash.projHash2QueryFiberEquiv (F : PrimeOrderGroupFamily) (d : F.Desc) {α β' γ' ρ ρ' : ZMod (F.order d)} (hγ' : γ' ≠ α * β') (hρ : ρ' ≠ ρ) (δ₁ δ₂ ξ : ZMod (F.order d)) :
                  ZMod (F.order d) ≃ ZMod (F.order d)

                  The affine bijection τ₂ ↦ (β' * (δ₁ + ρ' * δ₂) + (γ' - α * β') * ξ) + ((γ' - α * β') * (ρ' - ρ)) * τ₂ on ZMod (F.order d) when γ' ≠ α * β' and ρ' ≠ ρ.

                  Instances For
                    @[simp]
                    theorem Cslib.Crypto.ProjectiveHash.projHash2QueryFiberEquiv_apply (F : PrimeOrderGroupFamily) (d : F.Desc) {α β' γ' ρ ρ' : ZMod (F.order d)} (hγ' : γ' ≠ α * β') (hρ : ρ' ≠ ρ) (δ₁ δ₂ ξ τ₂ : ZMod (F.order d)) :
                    (projHash2QueryFiberEquiv F d hγ' hρ δ₁ δ₂ ξ) τ₂ = β' * (δ₁ + ρ' * δ₂) + (γ' - α * β') * ξ + (γ' - α * β') * (ρ' - ρ) * τ₂
                    theorem Cslib.Crypto.ProjectiveHash.projHash2_fiber_bijective_of_ne (F : PrimeOrderGroupFamily) (d : F.Desc) {α β' γ' ρ ρ' : ZMod (F.order d)} (hγ' : γ' ≠ α * β') (hρ : ρ' ≠ ρ) (δ₁ δ₂ ξ : ZMod (F.order d)) :
                    Function.Bijective fun (τ₂ : ZMod (F.order d)) => projHash2 F d (δ₁ - α * (ξ - ρ * τ₂)) (ξ - ρ * τ₂) (δ₂ - α * τ₂) τ₂ ρ' (β' • F.generator d) (γ' • F.generator d)

                    Single-tuple ingredient of Lemma 12.8 via Lemma 12.7 (bijection on the τ₂-fiber) ([BS23], Section 12.5.2, printed pp. 487–488): under the change of variables projHash2FiberChangeEquiv, for any γ' ≠ α * β' and ρ' ≠ ρ, the map τ₂ ↦ projHash2 F d (δ₁ - α * (ξ - ρ * τ₂)) (ξ - ρ * τ₂) (δ₂ - α * τ₂) τ₂ ρ' (β' • g) (γ' • g) is a bijection from ZMod (F.order d) to F.Carrier d.

                    theorem Cslib.Crypto.ProjectiveHash.uniform_projHash2_fiber_apply (F : PrimeOrderGroupFamily) (d : F.Desc) {α β' γ' ρ ρ' : ZMod (F.order d)} (hγ' : γ' ≠ α * β') (hρ : ρ' ≠ ρ) (δ₁ δ₂ ξ : ZMod (F.order d)) (z' : F.Carrier d) :
                    (PMF.map (fun (τ₂ : ZMod (F.order d)) => projHash2 F d (δ₁ - α * (ξ - ρ * τ₂)) (ξ - ρ * τ₂) (δ₂ - α * τ₂) τ₂ ρ' (β' • F.generator d) (γ' • F.generator d)) (Probability.PMF.uniformOfFintype (ZMod (F.order d)))) z' = (↑(F.order d))⁻¹

                    Single-tuple ingredient of Lemma 12.8 via Lemma 12.7 (1 / q hit law on the τ₂-fiber) ([BS23], Section 12.5.2, printed pp. 487–488): under projHash2FiberChangeEquiv, fixing δ₁ = σ₁ + α * τ₁, δ₂ = σ₂ + α * τ₂, and ξ = τ₁ + ρ * τ₂ (which completely determine (h₁, h₂), the challenge tag z, and all DH queries), as τ₂ varies uniformly over ZMod (F.order d), the tag on any non-DH query (β' • g, γ' • g, ρ') hits any target z' : F.Carrier d with probability (F.order d : ℝ≥0∞)⁻¹ whenever γ' ≠ α * β' and ρ' ≠ ρ.

                    theorem Cslib.Crypto.ProjectiveHash.uniform_projHash2_fiber_any_le (F : PrimeOrderGroupFamily) (d : F.Desc) [DecidableEq (F.Carrier d)] (α ρ δ₁ δ₂ ξ : ZMod (F.order d)) (queries : List (ZMod (F.order d) × ZMod (F.order d) × ZMod (F.order d) × F.Carrier d)) (hq : ∀ q ∈ queries, q.2.1 ≠ α * q.1 ∧ q.2.2.1 ≠ ρ) :
                    (PMF.map (fun (τ₂ : ZMod (F.order d)) => queries.any fun (q : ZMod (F.order d) × ZMod (F.order d) × ZMod (F.order d) × F.Carrier d) => decide (projHash2 F d (δ₁ - α * (ξ - ρ * τ₂)) (ξ - ρ * τ₂) (δ₂ - α * τ₂) τ₂ q.2.2.1 (q.1 • F.generator d) (q.2.1 • F.generator d) = q.2.2.2)) (Probability.PMF.uniformOfFintype (ZMod (F.order d)))) true ≤ ↑queries.length / ↑(F.order d)

                    Finite-list Q / q union-bound ingredient of Lemma 12.8 on the τ₂-fiber ([BS23], Section 12.5.2, printed p. 488): for any list queries of candidate tuples (β', γ', ρ', z') all satisfying γ' ≠ α * β' and ρ' ≠ ρ, and any fixed δ₁, δ₂, ξ : ZMod q, the probability over uniform τ₂ : ZMod (F.order d) that at least one tuple in queries has tag z' is at most (queries.length : ℝ≥0∞) / (F.order d : ℝ≥0∞).

                    def Cslib.Crypto.ProjectiveHash.projHash2Equiv (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ β' γ' ρ ρ' : ZMod (F.order d)} (hγ : γ ≠ α * β) (hγ' : γ' ≠ α * β') (hρ : ρ' ≠ ρ) :
                    (ZMod (F.order d) × ZMod (F.order d)) × ZMod (F.order d) × ZMod (F.order d) ≃ (ZMod (F.order d) × ZMod (F.order d)) × ZMod (F.order d) × ZMod (F.order d)

                    Explicit 4-tuple linear equivalence (σ₁, τ₁, σ₂, τ₂) ↦ ((σ₁ + α * τ₁, σ₂ + α * τ₂), (z, z')) on (ZMod (F.order d) × ZMod (F.order d)) × (ZMod (F.order d) × ZMod (F.order d)) when γ ≠ α * β, γ' ≠ α * β', and ρ' ≠ ρ ([BS23], proof of Lemma 12.7, printed p. 487).

                    Instances For
                      theorem Cslib.Crypto.ProjectiveHash.projHash2_bijective_of_ne (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ β' γ' ρ ρ' : ZMod (F.order d)} (hγ : γ ≠ α * β) (hγ' : γ' ≠ α * β') (hρ : ρ' ≠ ρ) :
                      Function.Bijective fun (p : (ZMod (F.order d) × ZMod (F.order d)) × ZMod (F.order d) × ZMod (F.order d)) => (projHash2Aux F d p.1.1 p.1.2 p.2.1 p.2.2 (α • F.generator d), projHash2 F d p.1.1 p.1.2 p.2.1 p.2.2 ρ (β • F.generator d) (γ • F.generator d), projHash2 F d p.1.1 p.1.2 p.2.1 p.2.2 ρ' (β' • F.generator d) (γ' • F.generator d))

                      Lemma 12.7 (universal₂ projective hash 4-tuple bijection) ([BS23], Section 12.5.2, printed pp. 487–488): for any non-DH triples γ ≠ α * β and γ' ≠ α * β' and any distinct tags ρ' ≠ ρ, the evaluation map ((σ₁, τ₁), (σ₂, τ₂)) ↦ ((h₁, h₂), (f'(v, w, ρ), f'(v', w', ρ'))) is a bijection from (ZMod (F.order d) × ZMod (F.order d)) × (ZMod (F.order d) × ZMod (F.order d)) to (F.Carrier d × F.Carrier d) × (F.Carrier d × F.Carrier d).

                      theorem Cslib.Crypto.ProjectiveHash.uniform_projHash2_apply_of_ne (F : PrimeOrderGroupFamily) (d : F.Desc) {α β γ β' γ' ρ ρ' : ZMod (F.order d)} (hγ : γ ≠ α * β) (hγ' : γ' ≠ α * β') (hρ : ρ' ≠ ρ) (h₁ h₂ z z' : F.Carrier d) :
                      (PMF.map (fun (p : (ZMod (F.order d) × ZMod (F.order d)) × ZMod (F.order d) × ZMod (F.order d)) => (projHash2Aux F d p.1.1 p.1.2 p.2.1 p.2.2 (α • F.generator d), projHash2 F d p.1.1 p.1.2 p.2.1 p.2.2 ρ (β • F.generator d) (γ • F.generator d), projHash2 F d p.1.1 p.1.2 p.2.1 p.2.2 ρ' (β' • F.generator d) (γ' • F.generator d))) (Probability.PMF.uniformOfFintype ((ZMod (F.order d) × ZMod (F.order d)) × ZMod (F.order d) × ZMod (F.order d)))) ((h₁, h₂), z, z') = (↑(F.order d) ^ 4)⁻¹

                      Lemma 12.7 (1 / q ^ 4 joint 4-tuple point mass) ([BS23], Section 12.5.2, printed pp. 487–488): under uniform ((σ₁, τ₁), (σ₂, τ₂)), for any non-DH triples γ ≠ α * β and γ' ≠ α * β', any distinct tags ρ' ≠ ρ, and any h₁, h₂, z, z' : F.Carrier d, the 4-tuple ((h₁, h₂), (z, z')) has probability ((F.order d : ℝ≥0∞) ^ 4)⁻¹.