PQXDH in Lean

6.2. Usage🔗

After normalizing both sides of a distributional equality to bind chains of uniform draws (typically via simp and simp_all), a single call to perm_draws closes the goal:

private lemma passiveReal_eq_ddhExpReal
    (g : G) (adv : PassiveAdversary G SK) :
    evalDist (execGame (passiveReal g adv)) =
    evalDist (DiffieHellman.ddhExpReal g (ddhReduction adv)) := by
  unfold passiveReal passiveGame DiffieHellman.ddhExpReal ddhReduction execGame
  simp only [simulateQ_bind, simulateQ_query, ...]
  ext z; change Pr[= z | _] = Pr[= z | _]; simp_all
  perm_draws