Theory ETP

subsection ‹ ETP definitions ›

text ‹ We define Extended Trapdoor Permutations (ETPs) following cite"DBLP:books/sp/17/Lindell17" and cite"DBLP:books/cu/Goldreich2004". 
In particular we consider the property of Hard Core Predicates (HCPs). ›

theory ETP imports
  CryptHOL.CryptHOL
begin

type_synonym ('index,'range) dist2 = "(bool × 'index × bool × bool)  bool spmf"

type_synonym ('index,'range) advP2 = "'index  bool  bool  ('index,'range) dist2  'range  bool spmf"

locale etp =
  fixes I :: "('index × 'trap) spmf" ― ‹samples index and trapdoor›
    and domain :: "'index  'range set" 
    and range :: "'index  'range set"
    and F :: "'index  ('range  'range)" ― ‹permutation›
    and Finv :: "'index  'trap  'range  'range" ― ‹must be efficiently computable›
    and B :: "'index  'range  bool" ― ‹hard core predicate›
  assumes dom_eq_ran: "y  set_spmf I  domain (fst y) = range (fst y)"
    and finite_range: "y  set_spmf I  finite (range (fst y))" 
    and non_empty_range: "y  set_spmf I  range (fst y)  {}" 
    and bij_betw: "y  set_spmf I  bij_betw (F (fst y)) (domain (fst y)) (range (fst y))"
    and lossless_I: "lossless_spmf I"
    and F_f_inv: "y  set_spmf I  x  range (fst y)  Finv (fst y) (snd y) (F (fst y) x) = x"
begin

definition S :: "'index  'range spmf"
  where "S α = spmf_of_set (range α)"

lemma lossless_S: "y  set_spmf I   lossless_spmf (S (fst y))"
  by(simp add: lossless_spmf_def S_def finite_range non_empty_range)

lemma set_spmf_S [simp]: "y  set_spmf I  set_spmf (S (fst y)) = range (fst y)" 
  by (simp add: S_def finite_range)

lemma f_inj_on: "y  set_spmf I  inj_on (F (fst y)) (range (fst y))" 
  by(metis bij_betw_def bij_betw dom_eq_ran bij_betw_def bij_betw dom_eq_ran) 

lemma range_f: "y  set_spmf I   x  range (fst y)  F (fst y) x  range (fst y)" 
  by (metis bij_betw bij_betw dom_eq_ran bij_betwE)   

lemma f_inv_f [simp]: "y  set_spmf I  x  range (fst y)  Finv (fst y) (snd y) (F (fst y) x) = x"
  by (metis bij_betw bij_betw_inv_into_left dom_eq_ran F_f_inv)

lemma f_inv_f' [simp]: "y  set_spmf I  x  range (fst y)  Hilbert_Choice.inv_into (range (fst y)) (F (fst y)) (F (fst y) x) = x" 
  by (metis bij_betw bij_betw_inv_into_left bij_betw dom_eq_ran)

lemma B_F_inv_rewrite: "(B α (Finv α τ yσ') = (B α (Finv α τ yσ') = m1)) = m1" 
  by auto

lemma uni_set_samp: 
  assumes "y  set_spmf I"
  shows "map_spmf (λ x. F (fst y) x) (S (fst y)) = (S (fst y))" 
(is "?lhs = ?rhs")
proof-
  have rhs: "?rhs = spmf_of_set (range (fst y))" 
    unfolding S_def by(simp)
  also have "map_spmf (λ x. F (fst y) x) (spmf_of_set (range (fst y))) = spmf_of_set ((λ x. F (fst y) x) ` (range (fst y)))"
    using f_inj_on assms 
    by (metis map_spmf_of_set_inj_on) 
  also have "(λ x. F (fst y) x) ` (range (fst y)) = range (fst y)"
    apply(rule endo_inj_surj) 
    using bij_betw
      by (auto simp add: bij_betw_def dom_eq_ran f_inj_on bij_betw finite_range assms)  
  finally show ?thesis by(simp add: rhs)
qed

text‹We define the security property of the hard core predicate (HCP) using a game.›

definition HCP_game :: "('index,'range) advP2   bool  bool  ('index,'range) dist2  bool spmf"
  where "HCP_game A = (λ σ bσ D. do {
    (α, τ)  I;
    x  S α;
    b'  A α σ bσ D x;
    let b = B α (Finv α τ x);
    return_spmf (b = b')})"

definition "HCP_adv A σ bσ D = ¦((spmf (HCP_game A σ bσ D) True) - 1/2)¦" 

end

end