Documentation

Complexity.Crypto.Computational.Homomorphic.GSW.FullyHomomorphic

Fully homomorphic encryption from GSW and decision LWE #

Gentry's generic bootstrapping constructions are instantiated with GSW at the logarithmic-depth parameter family. The base scheme is DepthParameters.scheme, its decryption circuits are the actual raw-input decryptors, and its bootstrappability, correctness, widths and native runtime are proved without computational assumptions. Bootstrappability is for Gentry's gate set Γ = {identity, NAND}: the schemes evaluate De Morgan circuits by compiling each De Morgan level into two NAND levels.

The security premise is decision LWE for exactly this family: secret dimension λ + 1, centered-binomial noise of width λ + 1, and the quasi-polynomial modulus 2 ^ (16384 * t ^ 2) with t = 1 + ⌈log₂ (λ + 2)⌉.

Neither theorem asserts lattice hardness, a worst-case reduction, or circuit privacy.

Main results #

References #

For any polynomial-time unary budget family, the unified base reduction leveledAdversary for the leveled GSW scheme is native strict PPT.

Exact concrete-security reduction loss of the leveled GSW scheme to the base GSW scheme ([Gen09], Section 2, Theorem 4, p. 171, up to a constant factor in the loss; the running-time clause is not formalized).

One uniform reduction bounds the base GSW scheme's chosen-message advantage by twice its decision-LWE advantage plus hidingError.

Concrete-security bound for the leveled GSW scheme in terms of the decision-LWE distinguisher advantage and hidingError ([Gen09], Section 2, Theorem 4, p. 171, up to a constant factor in the loss; the running-time clause is not formalized).

The leveled GSW scheme's complete tagged decryption algorithm has a uniformly generated family of polynomial-size circuits on the derived widths (3 * secretWidth k + 1) + (ciphertextWidth k + 1), shared across all depth budgets and requiring no computational assumption.

theorem Cslib.Crypto.Homomorphic.GSW.DepthParameters.exists_leveled_of_decisionLWE (hLWE : DecisionLWE Parameters.dimension samples width fun (k : ℕ) => noiseLaw (width k) (Parameters.noise k)) :
∃ (circuits : (k : ℕ) → Circuits.Circuit Circuits.Boolean.signature (3 * secretWidth k + 1 + (ciphertextWidth k + 1)) 1), Turing.MultiTapeTM.ComputableInPolyTime (fun (k : ℕ) => ⟨3 * secretWidth k + 1 + (ciphertextWidth k + 1), circuits k⟩) Turing.MultiTapeTM.encUnary (Circuits.Boolean.encCircuit 1) ∧ (PolynomiallyBounded fun (k : ℕ) => (circuits k).size) ∧ (∀ (k : ℕ) (sk ciphertext : List Bool), sk.length = 3 * secretWidth k + 1 → ciphertext.length = ciphertextWidth k + 1 → (circuits k).eval Circuits.Boolean.interpretation (BitString.ofList (3 * secretWidth k + 1 + (ciphertextWidth k + 1)) (sk ++ ciphertext)) 0 = Leveled.decrypt decryptionCircuits k sk ciphertext) ∧ Turing.MultiTapeTM.ComputableInPolyTime (fun (p : ℕ × List Bool × List Bool) => Leveled.decrypt decryptionCircuits p.1 p.2.1 p.2.2) (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits)) Turing.MultiTapeTM.encBool ∧ (PolynomiallyBounded fun (k : ℕ) => 3 * secretWidth k + 1) ∧ (PolynomiallyBounded fun (k : ℕ) => ciphertextWidth k + 1) ∧ ∀ (depth : ℕ → ℕ), PolynomiallyBounded depth → ∃ (budget : ℕ → ℕ), Turing.MultiTapeTM.ComputableInPolyTime budget Turing.MultiTapeTM.encUnary Turing.MultiTapeTM.encUnary ∧ (∀ (k : ℕ), depth k ≤ budget k) ∧ (Leveled.scheme decryptionCircuits budget).decrypt = Leveled.decrypt decryptionCircuits ∧ (Leveled.scheme decryptionCircuits budget).Correct ∧ (∀ (k : ℕ) (c : (m : ℕ) × Circuits.Circuit Circuits.Boolean.signature m 1), c.snd.depth ≤ depth k → (Leveled.scheme decryptionCircuits budget).permitted k c) ∧ ((Leveled.scheme decryptionCircuits budget).FixedWidth (fun (k : ℕ) => 3 * secretWidth k + 1) fun (k : ℕ) => ciphertextWidth k + 1) ∧ Probability.IsPPTOn Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits) (Leveled.scheme decryptionCircuits budget).keyGen ∧ (Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBool)) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × Bool) => (Leveled.scheme decryptionCircuits budget).encrypt p.1 p.2.1 p.2.2) ∧ (Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits (Turing.MultiTapeTM.encPair (Circuits.Boolean.encCircuit 1) (Turing.MultiTapeTM.encList Turing.MultiTapeTM.encBits)))) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × ((n : ℕ) × Circuits.Circuit Circuits.Boolean.signature n 1) × List (List Bool)) => (Leveled.scheme decryptionCircuits budget).evaluate p.1 p.2.1 p.2.2.1 p.2.2.2) ∧ Encryption.INDCPA (Leveled.scheme decryptionCircuits budget).keyGen (Leveled.scheme decryptionCircuits budget).encrypt

Leveled FHE from GSW under decision LWE for this family, with quasi-polynomial modulus. One uniformly generated polynomial-size circuit family computes the common decryption algorithm Leveled.decrypt decryptionCircuits, which is natively computable, and the key and ciphertext widths are fixed polynomials; all of these are chosen before the depth. Every polynomially bounded depth family is then covered by an actual scheme with an efficiently computable budget and exactly that decryption algorithm: it is correct for every circuit of the requested depth, has the fixed widths, native algorithms and IND-CPA security. No circular-security assumption is used.

theorem Cslib.Crypto.Homomorphic.GSW.DepthParameters.fullyHomomorphic_of_decisionLWE_of_circularSecure (hLWE : DecisionLWE Parameters.dimension samples width fun (k : ℕ) => noiseLaw (width k) (Parameters.noise k)) (hcircular : Encryption.CircularSecure scheme.keyGen scheme.encrypt) :
(FixedKey.scheme decryptionCircuits).Correct ∧ (∀ (k : ℕ) (c : (m : ℕ) × Circuits.Circuit Circuits.Boolean.signature m 1), (FixedKey.scheme decryptionCircuits).permitted k c) ∧ (FixedKey.scheme decryptionCircuits).FixedWidth secretWidth ciphertextWidth ∧ PolynomiallyBounded secretWidth ∧ PolynomiallyBounded ciphertextWidth ∧ (PolynomiallyBounded fun (k : ℕ) => ((FixedKey.decryptionCircuits decryptionCircuits).circuit k).size) ∧ Probability.IsPPTOn Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits) (FixedKey.scheme decryptionCircuits).keyGen ∧ (Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBool)) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × Bool) => (FixedKey.scheme decryptionCircuits).encrypt p.1 p.2.1 p.2.2) ∧ Turing.MultiTapeTM.ComputableInPolyTime (fun (p : ℕ × List Bool × List Bool) => (FixedKey.scheme decryptionCircuits).decrypt p.1 p.2.1 p.2.2) (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits)) Turing.MultiTapeTM.encBool ∧ (Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits (Turing.MultiTapeTM.encPair (Circuits.Boolean.encCircuit 1) (Turing.MultiTapeTM.encList Turing.MultiTapeTM.encBits)))) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × ((n : ℕ) × Circuits.Circuit Circuits.Boolean.signature n 1) × List (List Bool)) => (FixedKey.scheme decryptionCircuits).evaluate p.1 p.2.1 p.2.2.1 p.2.2.2) ∧ Encryption.INDCPA (FixedKey.scheme decryptionCircuits).keyGen (FixedKey.scheme decryptionCircuits).encrypt

Fully homomorphic encryption from GSW: under decision LWE for this family, with quasi-polynomial modulus, and the explicit one-key circular-security assumption for the base scheme, the self-loop construction correctly evaluates every finite circuit. Its widths are those of GSW, its decryption circuits have polynomial size, its four algorithms are native, and it is IND-CPA.