< Module library:security.
< Prove_Constraint library:host:proj_e_unique. Proof completed.
< Prove_Constraint library:host:proj_e_is. Proof completed.
< Prove_Constraint library:host:proj_s_unique. Variables: S2 E Ty N Sl Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp1 : |{s}- secdecl N Ty Sl E ~~> S2 ============================ decl N Ty E = S2
< case Hyp1. Variables: E Ty N Sl Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E ============================ decl N Ty E = decl N Ty E
< search. Proof completed.
< Prove_Constraint library:host:proj_s_is. Variables: E Ty N Sl Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp1 : is_s (secdecl N Ty Sl E) ============================ is_s (decl N Ty E)
< case Hyp1. Variables: E Ty N Sl Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E H1 : is_string N H2 : is_ty Ty H3 : is_sl Sl H4 : is_e E ============================ is_s (decl N Ty E)
< search. Proof completed.
< Prove_Constraint library:host:proj_ty_unique. Proof completed.
< Prove_Constraint library:host:proj_ty_is. Proof completed.
< Add_Proj_Rel library:host:is_e. Proof completed.
< Prove_Ext_Ind library:host:is_e. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Proof completed.
< Prove library:host:is_e_var_or_not. Proof completed.
< Prove library:host:is_e_intlit_or_not. Proof completed.
< Prove library:host:is_e_trueE_or_not. Proof completed.
< Prove library:host:is_e_falseE_or_not. Proof completed.
< Prove library:host:is_e_add_or_not. Proof completed.
< Prove library:host:is_e_eqC_or_not. Proof completed.
< Prove library:host:is_e_gt_or_not. Proof completed.
< Prove library:host:is_e_not_or_not. Proof completed.
< Prove library:host:is_e_eq_or_not. Proof completed.
< Prove library:host:vars_unique. Proof completed.
< Prove_Constraint library:host:proj_e_vars_exist. Proof completed.
< Prove_Constraint library:host:proj_e_vars. Proof completed.
< Prove library:host:vars_is. Proof completed.
< Prove library:host:vars_exist. Proof completed.
< Prove library:host:value_empty_typable. Proof completed.
< Prove library:host:eval_e_is. Proof completed.
< Prove library:host:type_preservation_e. Proof completed.
< Prove library:host:var_types_maintained. Subgoal 7: Variables: G X Ty Ty1 N E Sl IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @ Lkp : lookup G X Ty Ty1 : ty_e G E Ty1 Ty2 : no_lookup G N ============================ lookup ((N, Ty1)::G) X Ty
< assert N = X -> false. Subgoal 7.1: Variables: G X Ty Ty1 N E Sl IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @ Lkp : lookup G X Ty Ty1 : ty_e G E Ty1 Ty2 : no_lookup G N ============================ N = X -> false
< intros E. Subgoal 7.1: Variables: G X Ty Ty1 N E Sl IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @ Lkp : lookup G X Ty Ty1 : ty_e G E Ty1 Ty2 : no_lookup G N E : N = X ============================ false
< case E. Subgoal 7.1: Variables: G X Ty Ty1 E Sl IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty Ty : ty_s G (secdecl X Ty1 Sl E) ((X, Ty1)::G) @ Lkp : lookup G X Ty Ty1 : ty_e G E Ty1 Ty2 : no_lookup G X ============================ false
< apply no_lookup to Ty2 Lkp. Subgoal 7: Variables: G X Ty Ty1 N E Sl IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty Ty : ty_s G (secdecl N Ty1 Sl E) ((N, Ty1)::G) @ Lkp : lookup G X Ty Ty1 : ty_e G E Ty1 Ty2 : no_lookup G N H1 : N = X -> false ============================ lookup ((N, Ty1)::G) X Ty
< search. Proof completed.
< Prove library:host:type_preservation_s. Subgoal 9: Variables: TG EG TG' X Ty V V1 N E Sl Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ty : ty_s TG (secdecl N Ty1 Sl E) TG' Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty LkpV : lookup ((N, V1)::EG) X V Ev1 : eval_e EG E V1 ============================ ty_e [] V Ty
< Ty: case Ty. Subgoal 9: Variables: TG EG X Ty V V1 N E Sl Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup ((N, Ty1)::TG) X Ty LkpV : lookup ((N, V1)::EG) X V Ev1 : eval_e EG E V1 Ty : ty_e TG E Ty1 Ty1 : no_lookup TG N ============================ ty_e [] V Ty
< apply type_preservation_e to Ty Ev1 Rel. Subgoal 9: Variables: TG EG X Ty V V1 N E Sl Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup ((N, Ty1)::TG) X Ty LkpV : lookup ((N, V1)::EG) X V Ev1 : eval_e EG E V1 Ty : ty_e TG E Ty1 Ty1 : no_lookup TG N H1 : ty_e [] V1 Ty1 ============================ ty_e [] V Ty
< LT: case LkpTy. Subgoal 9.1: Variables: TG EG X Ty V V1 E Sl IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl X Ty Sl E) ((X, V1)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty LkpV : lookup ((X, V1)::EG) X V Ev1 : eval_e EG E V1 Ty : ty_e TG E Ty Ty1 : no_lookup TG X H1 : ty_e [] V1 Ty ============================ ty_e [] V Ty
< LV: case LkpV. Subgoal 9.1.1: Variables: TG EG X Ty V E Sl IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl X Ty Sl E) ((X, V)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E V Ty : ty_e TG E Ty Ty1 : no_lookup TG X H1 : ty_e [] V Ty ============================ ty_e [] V Ty
< search. Subgoal 9.1.2: Variables: TG EG X Ty V V1 E Sl IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl X Ty Sl E) ((X, V1)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E V1 Ty : ty_e TG E Ty Ty1 : no_lookup TG X H1 : ty_e [] V1 Ty LV : X = X -> false LV1 : lookup EG X V ============================ ty_e [] V Ty
< apply LV to _. Subgoal 9.2: Variables: TG EG X Ty V V1 N E Sl Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty LkpV : lookup ((N, V1)::EG) X V Ev1 : eval_e EG E V1 Ty : ty_e TG E Ty1 Ty1 : no_lookup TG N H1 : ty_e [] V1 Ty1 LT : N = X -> false LT1 : lookup TG X Ty ============================ ty_e [] V Ty
< LV: case LkpV. Subgoal 9.2.1: Variables: TG EG X Ty V E Sl Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl X Ty1 Sl E) ((X, V)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E V Ty : ty_e TG E Ty1 Ty1 : no_lookup TG X H1 : ty_e [] V Ty1 LT : X = X -> false LT1 : lookup TG X Ty ============================ ty_e [] V Ty
< apply LT to _. Subgoal 9.2.2: Variables: TG EG X Ty V V1 N E Sl Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (secdecl N Ty1 Sl E) ((N, V1)::EG) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E V1 Ty : ty_e TG E Ty1 Ty1 : no_lookup TG N H1 : ty_e [] V1 Ty1 LT : N = X -> false LT1 : lookup TG X Ty LV : N = X -> false LV1 : lookup EG X V ============================ ty_e [] V Ty
< backchain Rel. Proof completed.
< Prove_Constraint library:host:proj_eval_e. Proof completed.
< Prove library:host:eval_e_unique. Proof completed.
< Prove_Constraint library:host:proj_s_eval. Variables: G G2 E Ty N Sl Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp1 : eval_s G (secdecl N Ty Sl E) G2 ============================ exists G', eval_s G (decl N Ty E) G'
< case Hyp1. Variables: G E Ty N Sl V Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E H1 : eval_e G E V ============================ exists G', eval_s G (decl N Ty E) G'
< search. Proof completed.
< Add_Ext_Size library:host:eval_s. Proof completed.
< Add_Proj_Rel library:host:eval_s. Proof completed.
< Prove_Ext_Ind library:host:eval_s. Subgoal 9: Variables: G V N1 E Sl Ty IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (secdecl N1 Ty Sl E) ((N1, V)::G) 1 @@ Acc : acc 1 @ R1 : eval_e G E V ============================ <eval_s {P}> G (secdecl N1 Ty Sl E) ((N1, V)::G)
< search. Proof completed.
< Prove_Constraint library:host:proj_s_eval_results. Variables: G G1 G2 X V E Ty N Sl Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp1 : eval_s G (secdecl N Ty Sl E) G1 Hyp2 : eval_s G (decl N Ty E) G2 Hyp3 : lookup G1 X V ============================ lookup G2 X V
< VS: case Hyp1. Variables: G G2 X V E Ty N Sl V1 Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp2 : eval_s G (decl N Ty E) G2 Hyp3 : lookup ((N, V1)::G) X V VS : eval_e G E V1 ============================ lookup G2 X V
< VD: case Hyp2. Variables: G X V E Ty N Sl V1 V2 Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp3 : lookup ((N, V1)::G) X V VS : eval_e G E V1 VD : eval_e G E V2 ============================ lookup ((N, V2)::G) X V
< apply eval_e_unique to VS VD. Variables: G X V E Ty N Sl V2 Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp3 : lookup ((N, V2)::G) X V VS : eval_e G E V2 VD : eval_e G E V2 ============================ lookup ((N, V2)::G) X V
< search. Proof completed.
< Prove_Constraint library:host:proj_s_eval_results_back. Variables: G G1 G2 X V E Ty N Sl Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp1 : eval_s G (secdecl N Ty Sl E) G1 Hyp2 : eval_s G (decl N Ty E) G2 Hyp3 : lookup G2 X V ============================ lookup G1 X V
< VS: case Hyp1. Variables: G G2 X V E Ty N Sl V1 Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp2 : eval_s G (decl N Ty E) G2 Hyp3 : lookup G2 X V VS : eval_e G E V1 ============================ lookup ((N, V1)::G) X V
< VD: case Hyp2. Variables: G X V E Ty N Sl V1 V2 Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp3 : lookup ((N, V2)::G) X V VS : eval_e G E V1 VD : eval_e G E V2 ============================ lookup ((N, V1)::G) X V
< apply eval_e_unique to VS VD. Variables: G X V E Ty N Sl V2 Hyp : |{s}- secdecl N Ty Sl E ~~> decl N Ty E Hyp3 : lookup ((N, V2)::G) X V VS : eval_e G E V2 VD : eval_e G E V2 ============================ lookup ((N, V2)::G) X V
< search. Proof completed.
< Prove library:host:eval_e_value. Proof completed.
< Prove library:host:eval_s_value. Subgoal 9: Variables: G Y YV V N E Sl Ty IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @ AllVal : forall X XV, mem (X, XV) G -> value XV Mem : mem (Y, YV) ((N, V)::G) Ev1 : eval_e G E V ============================ value YV
< apply eval_e_value to Ev1 _. Subgoal 9: Variables: G Y YV V N E Sl Ty IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @ AllVal : forall X XV, mem (X, XV) G -> value XV Mem : mem (Y, YV) ((N, V)::G) Ev1 : eval_e G E V H1 : value V ============================ value YV
< case Mem. Subgoal 9.1: Variables: G V N E Sl Ty IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E V H1 : value V ============================ value V
< search. Subgoal 9.2: Variables: G Y YV V N E Sl Ty IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E V H1 : value V H2 : mem (Y, YV) G ============================ value YV
< backchain AllVal. Proof completed.
< Prove library:host:vars_eval_same_result. Proof completed.
< Extensible_Theorem sl_form : forall SL, Is : is_sl SL -> SL = public \/ SL = private on Is. Subgoal 1: IH : forall SL, is_sl SL * -> SL = public \/ SL = private Is : is_sl public @ ============================ public = public \/ public = private
< search. Subgoal 2: IH : forall SL, is_sl SL * -> SL = public \/ SL = private Is : is_sl private @ ============================ private = public \/ private = private
< search. Proof completed.
< Theorem join_unique : forall A B S1 S2, join A B S1 -> join A B S2 -> S1 = S2. ============================ forall A B S1 S2, join A B S1 -> join A B S2 -> S1 = S2
< intros J1 J2. Variables: A B S1 S2 J1 : join A B S1 J2 : join A B S2 ============================ S1 = S2
< case J1. Subgoal 1: Variables: S2 J2 : join public public S2 ============================ public = S2
< case J2. Subgoal 1: ============================ public = public
< search. Subgoal 2: Variables: B S2 J2 : join private B S2 ============================ private = S2
< case J2. Subgoal 2.1: Variables: B ============================ private = private
< search. Subgoal 2.2: ============================ private = private
< search. Subgoal 3: Variables: A S2 J2 : join A private S2 ============================ private = S2
< case J2. Subgoal 3.1: ============================ private = private
< search. Subgoal 3.2: Variables: A ============================ private = private
< search. Proof completed.
< Theorem join_public : forall A B, join A B public -> A = public /\ B = public. ============================ forall A B, join A B public -> A = public /\ B = public
< intros J. Variables: A B J : join A B public ============================ A = public /\ B = public
< case J. ============================ public = public /\ public = public
< search. Proof completed.
< Extensible_Theorem level_public_vars : forall SG E V X, Lev : level SG E public -> Vars : vars E V -> Mem : mem X V -> lookup SG X public on Lev. Subgoal 1: Variables: SG V X I IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (intlit I) public @ Vars : vars (intlit I) V Mem : mem X V ============================ lookup SG X public
< case Vars. Subgoal 1: Variables: SG X I IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (intlit I) public @ Mem : mem X [] ============================ lookup SG X public
< case Mem. Subgoal 2: Variables: SG V X IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG trueE public @ Vars : vars trueE V Mem : mem X V ============================ lookup SG X public
< case Vars. Subgoal 2: Variables: SG X IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG trueE public @ Mem : mem X [] ============================ lookup SG X public
< case Mem. Subgoal 3: Variables: SG V X IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG falseE public @ Vars : vars falseE V Mem : mem X V ============================ lookup SG X public
< case Vars. Subgoal 3: Variables: SG X IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG falseE public @ Mem : mem X [] ============================ lookup SG X public
< case Mem. Subgoal 4: Variables: SG V X N IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (var N) public @ Vars : vars (var N) V Mem : mem X V Lev1 : lookup SG N public ============================ lookup SG X public
< case Vars. Subgoal 4: Variables: SG X N IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (var N) public @ Mem : mem X [N] Lev1 : lookup SG N public ============================ lookup SG X public
< M: case Mem. Subgoal 4.1: Variables: SG N IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (var N) public @ Lev1 : lookup SG N public ============================ lookup SG N public
< search. Subgoal 4.2: Variables: SG X N IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (var N) public @ Lev1 : lookup SG N public M : mem X [] ============================ lookup SG X public
< case M. Subgoal 5: Variables: SG V X L1 L2 E2 E1 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Vars : vars (add E1 E2) V Mem : mem X V Lev1 : level SG E1 L1 * Lev2 : level SG E2 L2 * Lev3 : join L1 L2 public ============================ lookup SG X public
< V: case Vars. Subgoal 5: Variables: SG V X L1 L2 E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Mem : mem X V Lev1 : level SG E1 L1 * Lev2 : level SG E2 L2 * Lev3 : join L1 L2 public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V ============================ lookup SG X public
< apply join_public to Lev3. Subgoal 5: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V ============================ lookup SG X public
< Or: apply mem_append to Mem V2. Subgoal 5: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V Or : mem X Vr1 \/ mem X Vr2 ============================ lookup SG X public
< M: case Or. Subgoal 5.1: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr1 ============================ lookup SG X public
< apply IH to Lev1 V M. Subgoal 5.1: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr1 H1 : lookup SG X public ============================ lookup SG X public
< search. Subgoal 5.2: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr2 ============================ lookup SG X public
< apply IH to Lev2 V1 M. Subgoal 5.2: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (add E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr2 H1 : lookup SG X public ============================ lookup SG X public
< search. Subgoal 6: Variables: SG V X L1 L2 E2 E1 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Vars : vars (eq E1 E2) V Mem : mem X V Lev1 : level SG E1 L1 * Lev2 : level SG E2 L2 * Lev3 : join L1 L2 public ============================ lookup SG X public
< V: case Vars. Subgoal 6: Variables: SG V X L1 L2 E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Mem : mem X V Lev1 : level SG E1 L1 * Lev2 : level SG E2 L2 * Lev3 : join L1 L2 public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V ============================ lookup SG X public
< apply join_public to Lev3. Subgoal 6: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V ============================ lookup SG X public
< Or: apply mem_append to Mem V2. Subgoal 6: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V Or : mem X Vr1 \/ mem X Vr2 ============================ lookup SG X public
< M: case Or. Subgoal 6.1: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr1 ============================ lookup SG X public
< apply IH to Lev1 V M. Subgoal 6.1: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr1 H1 : lookup SG X public ============================ lookup SG X public
< search. Subgoal 6.2: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr2 ============================ lookup SG X public
< apply IH to Lev2 V1 M. Subgoal 6.2: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (eq E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr2 H1 : lookup SG X public ============================ lookup SG X public
< search. Subgoal 7: Variables: SG V X L1 L2 E2 E1 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Vars : vars (gt E1 E2) V Mem : mem X V Lev1 : level SG E1 L1 * Lev2 : level SG E2 L2 * Lev3 : join L1 L2 public ============================ lookup SG X public
< V: case Vars. Subgoal 7: Variables: SG V X L1 L2 E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Mem : mem X V Lev1 : level SG E1 L1 * Lev2 : level SG E2 L2 * Lev3 : join L1 L2 public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V ============================ lookup SG X public
< apply join_public to Lev3. Subgoal 7: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V ============================ lookup SG X public
< Or: apply mem_append to Mem V2. Subgoal 7: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V Or : mem X Vr1 \/ mem X Vr2 ============================ lookup SG X public
< M: case Or. Subgoal 7.1: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr1 ============================ lookup SG X public
< apply IH to Lev1 V M. Subgoal 7.1: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr1 H1 : lookup SG X public ============================ lookup SG X public
< search. Subgoal 7.2: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr2 ============================ lookup SG X public
< apply IH to Lev2 V1 M. Subgoal 7.2: Variables: SG V X E2 E1 Vr1 Vr2 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (gt E1 E2) public @ Mem : mem X V Lev1 : level SG E1 public * Lev2 : level SG E2 public * Lev3 : join public public public V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V M : mem X Vr2 H1 : lookup SG X public ============================ lookup SG X public
< search. Subgoal 8: Variables: SG V X E1 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (not E1) public @ Vars : vars (not E1) V Mem : mem X V Lev1 : level SG E1 public * ============================ lookup SG X public
< V: case Vars. Subgoal 8: Variables: SG V X E1 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (not E1) public @ Mem : mem X V Lev1 : level SG E1 public * V : vars E1 V ============================ lookup SG X public
< apply IH to Lev1 V Mem. Subgoal 8: Variables: SG V X E1 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG (not E1) public @ Mem : mem X V Lev1 : level SG E1 public * V : vars E1 V H1 : lookup SG X public ============================ lookup SG X public
< search. Subgoal 9: Variables: SG V X E1 IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG <unknown I e> public @ Vars : vars <unknown I e> V Mem : mem X V Lev1 : |{e}- <unknown I e> ~~> E1 Lev2 : level SG E1 public * ============================ lookup SG X public
< V: apply proj_e_vars_exist to Lev1 Vars. Subgoal 9: Variables: SG V X E1 V' IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG <unknown I e> public @ Vars : vars <unknown I e> V Mem : mem X V Lev1 : |{e}- <unknown I e> ~~> E1 Lev2 : level SG E1 public * V : vars E1 V' ============================ lookup SG X public
< M: apply proj_e_vars to Lev1 Vars V Mem. Subgoal 9: Variables: SG V X E1 V' IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG <unknown I e> public @ Vars : vars <unknown I e> V Mem : mem X V Lev1 : |{e}- <unknown I e> ~~> E1 Lev2 : level SG E1 public * V : vars E1 V' M : mem X V' ============================ lookup SG X public
< apply IH to Lev2 V M. Subgoal 9: Variables: SG V X E1 V' IH : forall SG E V X, level SG E public * -> vars E V -> mem X V -> lookup SG X public Lev : level SG <unknown I e> public @ Vars : vars <unknown I e> V Mem : mem X V Lev1 : |{e}- <unknown I e> ~~> E1 Lev2 : level SG E1 public * V : vars E1 V' M : mem X V' H1 : lookup SG X public ============================ lookup SG X public
< search. Proof completed.
< Define public_equiv : (list (pair (string) sl)) -> (list (pair (string) e)) -> (list (pair (string) e)) -> prop by public_equiv S G1 G2 := (forall X V, lookup S X public -> lookup G1 X V -> lookup G2 X V) /\ (forall X V, lookup S X public -> lookup G2 X V -> lookup G1 X V).
< Theorem public_equiv_trans : forall SG GA GB GC, public_equiv SG GA GB -> public_equiv SG GB GC -> public_equiv SG GA GC. ============================ forall SG GA GB GC, public_equiv SG GA GB -> public_equiv SG GB GC -> public_equiv SG GA GC
< intros PEAB PEBC. Variables: SG GA GB GC PEAB : public_equiv SG GA GB PEBC : public_equiv SG GB GC ============================ public_equiv SG GA GC
< PEAB: case PEAB. Variables: SG GA GB GC PEBC : public_equiv SG GB GC PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ public_equiv SG GA GC
< PEBC: case PEBC. Variables: SG GA GB GC PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V ============================ public_equiv SG GA GC
< unfold . Subgoal 1: Variables: SG GA GB GC PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V ============================ forall X V, lookup SG X public -> lookup GA X V -> lookup GC X V
< intros LkpSec LkpA. Subgoal 1: Variables: SG GA GB GC X V PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V LkpSec : lookup SG X public LkpA : lookup GA X V ============================ lookup GC X V
< LkpB: apply PEAB to LkpSec LkpA. Subgoal 1: Variables: SG GA GB GC X V PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V LkpSec : lookup SG X public LkpA : lookup GA X V LkpB : lookup GB X V ============================ lookup GC X V
< apply PEBC to LkpSec LkpB. Subgoal 1: Variables: SG GA GB GC X V PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V LkpSec : lookup SG X public LkpA : lookup GA X V LkpB : lookup GB X V H1 : lookup GC X V ============================ lookup GC X V
< search. Subgoal 2: Variables: SG GA GB GC PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V ============================ forall X V, lookup SG X public -> lookup GC X V -> lookup GA X V
< intros LkpSec LkpC. Subgoal 2: Variables: SG GA GB GC X V PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V LkpSec : lookup SG X public LkpC : lookup GC X V ============================ lookup GA X V
< LkpB: apply PEBC1 to LkpSec LkpC. Subgoal 2: Variables: SG GA GB GC X V PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V LkpSec : lookup SG X public LkpC : lookup GC X V LkpB : lookup GB X V ============================ lookup GA X V
< apply PEAB1 to LkpSec LkpB. Subgoal 2: Variables: SG GA GB GC X V PEAB : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V PEAB1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V PEBC : forall X V, lookup SG X public -> lookup GB X V -> lookup GC X V PEBC1 : forall X V, lookup SG X public -> lookup GC X V -> lookup GB X V LkpSec : lookup SG X public LkpC : lookup GC X V LkpB : lookup GB X V H1 : lookup GA X V ============================ lookup GA X V
< search. Proof completed.
< Theorem public_equiv_symm : forall SG GA GB, public_equiv SG GA GB -> public_equiv SG GB GA. ============================ forall SG GA GB, public_equiv SG GA GB -> public_equiv SG GB GA
< intros Rel. Variables: SG GA GB Rel : public_equiv SG GA GB ============================ public_equiv SG GB GA
< Rel: case Rel. Variables: SG GA GB Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ public_equiv SG GB GA
< unfold . Subgoal 1: Variables: SG GA GB Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
< intros LkpSec LkpB. Subgoal 1: Variables: SG GA GB X V Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpB : lookup GB X V ============================ lookup GA X V
< apply Rel1 to LkpSec LkpB. Subgoal 1: Variables: SG GA GB X V Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpB : lookup GB X V H1 : lookup GA X V ============================ lookup GA X V
< search. Subgoal 2: Variables: SG GA GB Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
< intros LkpSec LkpA. Subgoal 2: Variables: SG GA GB X V Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpA : lookup GA X V ============================ lookup GB X V
< apply Rel to LkpSec LkpA. Subgoal 2: Variables: SG GA GB X V Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpA : lookup GA X V H1 : lookup GB X V ============================ lookup GB X V
< search. Proof completed.
< Theorem public_equiv_refl : forall SG G, public_equiv SG G G. ============================ forall SG G, public_equiv SG G G
< intros. Variables: SG G ============================ public_equiv SG G G
< unfold . Subgoal 1: Variables: SG G ============================ forall X V, lookup SG X public -> lookup G X V -> lookup G X V
< intros. Subgoal 1: Variables: SG G X V H1 : lookup SG X public H2 : lookup G X V ============================ lookup G X V
< search. Subgoal 2: Variables: SG G ============================ forall X V, lookup SG X public -> lookup G X V -> lookup G X V
< intros. Subgoal 2: Variables: SG G X V H1 : lookup SG X public H2 : lookup G X V ============================ lookup G X V
< search. Proof completed.
< Theorem level_secure : forall SG G1 G2 E V1 V2, is_e E -> level SG E public -> public_equiv SG G1 G2 -> eval_e G1 E V1 -> eval_e G2 E V2 -> V1 = V2. ============================ forall SG G1 G2 E V1 V2, is_e E -> level SG E public -> public_equiv SG G1 G2 -> eval_e G1 E V1 -> eval_e G2 E V2 -> V1 = V2
< intros IsE Lev Equiv Ev1 Ev2. Variables: SG G1 G2 E V1 V2 IsE : is_e E Lev : level SG E public Equiv : public_equiv SG G1 G2 Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 ============================ V1 = V2
< Vars: apply vars_exist to IsE. Variables: SG G1 G2 E V1 V2 V IsE : is_e E Lev : level SG E public Equiv : public_equiv SG G1 G2 Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 Vars : vars E V ============================ V1 = V2
< Equiv: case Equiv. Variables: SG G1 G2 E V1 V2 V IsE : is_e E Lev : level SG E public Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 Vars : vars E V Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V ============================ V1 = V2
< apply vars_eval_same_result to _ Vars Ev1 Ev2. Subgoal 1: Variables: SG G1 G2 E V1 V2 V IsE : is_e E Lev : level SG E public Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 Vars : vars E V Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V ============================ forall X U1 U2, mem X V -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< intros Mem Lkp1 Lkp2. Subgoal 1: Variables: SG G1 G2 E V1 V2 V X U1 U2 IsE : is_e E Lev : level SG E public Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 Vars : vars E V Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V Mem : mem X V Lkp1 : lookup G1 X U1 Lkp2 : lookup G2 X U2 ============================ U1 = U2
< LkpS: apply level_public_vars to Lev Vars Mem. Subgoal 1: Variables: SG G1 G2 E V1 V2 V X U1 U2 IsE : is_e E Lev : level SG E public Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 Vars : vars E V Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V Mem : mem X V Lkp1 : lookup G1 X U1 Lkp2 : lookup G2 X U2 LkpS : lookup SG X public ============================ U1 = U2
< L: apply Equiv to LkpS Lkp1. Subgoal 1: Variables: SG G1 G2 E V1 V2 V X U1 U2 IsE : is_e E Lev : level SG E public Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 Vars : vars E V Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V Mem : mem X V Lkp1 : lookup G1 X U1 Lkp2 : lookup G2 X U2 LkpS : lookup SG X public L : lookup G2 X U1 ============================ U1 = U2
< apply lookup_unique to L Lkp2. Subgoal 1: Variables: SG G1 G2 E V1 V2 V X U2 IsE : is_e E Lev : level SG E public Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 Vars : vars E V Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V Mem : mem X V Lkp1 : lookup G1 X U2 Lkp2 : lookup G2 X U2 LkpS : lookup SG X public L : lookup G2 X U2 ============================ U2 = U2
< search. Variables: SG G1 G2 E V2 V IsE : is_e E Lev : level SG E public Ev1 : eval_e G1 E V2 Ev2 : eval_e G2 E V2 Vars : vars E V Equiv : forall X V, lookup SG X public -> lookup G1 X V -> lookup G2 X V Equiv1 : forall X V, lookup SG X public -> lookup G2 X V -> lookup G1 X V ============================ V2 = V2
< search. Proof completed.
< Extensible_Theorem level_unique : forall SG E S1 S2, LevA : level SG E S1 -> LevB : level SG E S2 -> S1 = S2 on LevA. Subgoal 1: Variables: SG S2 I IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (intlit I) public @ LevB : level SG (intlit I) S2 ============================ public = S2
< case LevB. Subgoal 1: Variables: SG I IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (intlit I) public @ ============================ public = public
< search. Subgoal 2: Variables: SG S2 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG trueE public @ LevB : level SG trueE S2 ============================ public = S2
< case LevB. Subgoal 2: Variables: SG IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG trueE public @ ============================ public = public
< search. Subgoal 3: Variables: SG S2 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG falseE public @ LevB : level SG falseE S2 ============================ public = S2
< case LevB. Subgoal 3: Variables: SG IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG falseE public @ ============================ public = public
< search. Subgoal 4: Variables: SG S1 S2 N IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (var N) S1 @ LevB : level SG (var N) S2 LevA1 : lookup SG N S1 ============================ S1 = S2
< L: case LevB. Subgoal 4: Variables: SG S1 S2 N IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (var N) S1 @ LevA1 : lookup SG N S1 L : lookup SG N S2 ============================ S1 = S2
< apply lookup_unique to LevA1 L. Subgoal 4: Variables: SG S2 N IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (var N) S2 @ LevA1 : lookup SG N S2 L : lookup SG N S2 ============================ S2 = S2
< search. Subgoal 5: Variables: SG S1 S2 L1 L2 E2 E1 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (add E1 E2) S1 @ LevB : level SG (add E1 E2) S2 LevA1 : level SG E1 L1 * LevA2 : level SG E2 L2 * LevA3 : join L1 L2 S1 ============================ S1 = S2
< L: case LevB. Subgoal 5: Variables: SG S1 S2 L1 L2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (add E1 E2) S1 @ LevA1 : level SG E1 L1 * LevA2 : level SG E2 L2 * LevA3 : join L1 L2 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply IH to LevA1 L. Subgoal 5: Variables: SG S1 S2 L2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (add E1 E2) S1 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L2 * LevA3 : join L3 L2 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply IH to LevA2 L1. Subgoal 5: Variables: SG S1 S2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (add E1 E2) S1 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L4 * LevA3 : join L3 L4 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply join_unique to LevA3 L2. Subgoal 5: Variables: SG S2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (add E1 E2) S2 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L4 * LevA3 : join L3 L4 S2 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S2 = S2
< search. Subgoal 6: Variables: SG S1 S2 L1 L2 E2 E1 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (eq E1 E2) S1 @ LevB : level SG (eq E1 E2) S2 LevA1 : level SG E1 L1 * LevA2 : level SG E2 L2 * LevA3 : join L1 L2 S1 ============================ S1 = S2
< L: case LevB. Subgoal 6: Variables: SG S1 S2 L1 L2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (eq E1 E2) S1 @ LevA1 : level SG E1 L1 * LevA2 : level SG E2 L2 * LevA3 : join L1 L2 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply IH to LevA1 L. Subgoal 6: Variables: SG S1 S2 L2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (eq E1 E2) S1 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L2 * LevA3 : join L3 L2 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply IH to LevA2 L1. Subgoal 6: Variables: SG S1 S2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (eq E1 E2) S1 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L4 * LevA3 : join L3 L4 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply join_unique to LevA3 L2. Subgoal 6: Variables: SG S2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (eq E1 E2) S2 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L4 * LevA3 : join L3 L4 S2 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S2 = S2
< search. Subgoal 7: Variables: SG S1 S2 L1 L2 E2 E1 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (gt E1 E2) S1 @ LevB : level SG (gt E1 E2) S2 LevA1 : level SG E1 L1 * LevA2 : level SG E2 L2 * LevA3 : join L1 L2 S1 ============================ S1 = S2
< L: case LevB. Subgoal 7: Variables: SG S1 S2 L1 L2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (gt E1 E2) S1 @ LevA1 : level SG E1 L1 * LevA2 : level SG E2 L2 * LevA3 : join L1 L2 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply IH to LevA1 L. Subgoal 7: Variables: SG S1 S2 L2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (gt E1 E2) S1 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L2 * LevA3 : join L3 L2 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply IH to LevA2 L1. Subgoal 7: Variables: SG S1 S2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (gt E1 E2) S1 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L4 * LevA3 : join L3 L4 S1 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S1 = S2
< apply join_unique to LevA3 L2. Subgoal 7: Variables: SG S2 E2 E1 L3 L4 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (gt E1 E2) S2 @ LevA1 : level SG E1 L3 * LevA2 : level SG E2 L4 * LevA3 : join L3 L4 S2 L : level SG E1 L3 L1 : level SG E2 L4 L2 : join L3 L4 S2 ============================ S2 = S2
< search. Subgoal 8: Variables: SG S1 S2 E1 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (not E1) S1 @ LevB : level SG (not E1) S2 LevA1 : level SG E1 S1 * ============================ S1 = S2
< L: case LevB. Subgoal 8: Variables: SG S1 S2 E1 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (not E1) S1 @ LevA1 : level SG E1 S1 * L : level SG E1 S2 ============================ S1 = S2
< apply IH to LevA1 L. Subgoal 8: Variables: SG S2 E1 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG (not E1) S2 @ LevA1 : level SG E1 S2 * L : level SG E1 S2 ============================ S2 = S2
< search. Subgoal 9: Variables: SG S1 S2 E1 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG <unknown I e> S1 @ LevB : level SG <unknown I e> S2 LevA1 : |{e}- <unknown I e> ~~> E1 LevA2 : level SG E1 S1 * ============================ S1 = S2
< L: case LevB. Subgoal 9: Variables: SG S1 S2 E1 E2 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG <unknown I e> S1 @ LevA1 : |{e}- <unknown I e> ~~> E1 LevA2 : level SG E1 S1 * L : |{e}- <unknown I e> ~~> E2 L1 : level SG E2 S2 ============================ S1 = S2
< apply proj_e_unique to LevA1 L. Subgoal 9: Variables: SG S1 S2 E2 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG <unknown I e> S1 @ LevA1 : |{e}- <unknown I e> ~~> E2 LevA2 : level SG E2 S1 * L : |{e}- <unknown I e> ~~> E2 L1 : level SG E2 S2 ============================ S1 = S2
< apply IH to LevA2 L1. Subgoal 9: Variables: SG S2 E2 IH : forall SG E S1 S2, level SG E S1 * -> level SG E S2 -> S1 = S2 LevA : level SG <unknown I e> S2 @ LevA1 : |{e}- <unknown I e> ~~> E2 LevA2 : level SG E2 S2 * L : |{e}- <unknown I e> ~~> E2 L1 : level SG E2 S2 ============================ S2 = S2
< search. Proof completed.
< Theorem level_not_public : forall SG G1 G2 E V1 V2, is_e E -> public_equiv SG G1 G2 -> level SG E public -> eval_e G1 E V1 -> eval_e G2 E V2 -> (V1 = V2 -> false) -> false. ============================ forall SG G1 G2 E V1 V2, is_e E -> public_equiv SG G1 G2 -> level SG E public -> eval_e G1 E V1 -> eval_e G2 E V2 -> (V1 = V2 -> false) -> false
< intros Is Equiv Lev Ev1 Ev2 NEq. Variables: SG G1 G2 E V1 V2 Is : is_e E Equiv : public_equiv SG G1 G2 Lev : level SG E public Ev1 : eval_e G1 E V1 Ev2 : eval_e G2 E V2 NEq : V1 = V2 -> false ============================ false
< apply level_secure to Is Lev Equiv Ev1 Ev2. Variables: SG G1 G2 E V2 Is : is_e E Equiv : public_equiv SG G1 G2 Lev : level SG E public Ev1 : eval_e G1 E V2 Ev2 : eval_e G2 E V2 NEq : V2 = V2 -> false ============================ false
< backchain NEq. Proof completed.
< Extensible_Theorem stmt_public_branch : forall SG SL SG2 S X, Sec : secure SG SL S SG2 -> LkpSec : lookup SG X public -> lookup SG2 X public on Sec. Subgoal 1: Variables: SL SG2 X IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG2 SL skipS SG2 @ LkpSec : lookup SG2 X public ============================ lookup SG2 X public
< search. Subgoal 2: Variables: SG SL SG2 X SG1 S2 S1 IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (seq S1 S2) SG2 @ LkpSec : lookup SG X public Sec1 : secure SG SL S1 SG1 * Sec2 : secure SG1 SL S2 SG2 * ============================ lookup SG2 X public
< L: apply IH to Sec1 LkpSec. Subgoal 2: Variables: SG SL SG2 X SG1 S2 S1 IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (seq S1 S2) SG2 @ LkpSec : lookup SG X public Sec1 : secure SG SL S1 SG1 * Sec2 : secure SG1 SL S2 SG2 * L : lookup SG1 X public ============================ lookup SG2 X public
< apply IH to Sec2 L. Subgoal 2: Variables: SG SL SG2 X SG1 S2 S1 IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (seq S1 S2) SG2 @ LkpSec : lookup SG X public Sec1 : secure SG SL S1 SG1 * Sec2 : secure SG1 SL S2 SG2 * L : lookup SG1 X public H1 : lookup SG2 X public ============================ lookup SG2 X public
< search. Subgoal 3: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (decl N Ty E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N ============================ lookup ((N, public)::SG) X public
< assert N = X -> false. Subgoal 3.1: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (decl N Ty E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N ============================ N = X -> false
< intros E. Subgoal 3.1: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (decl N Ty E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N E : N = X ============================ false
< case E. Subgoal 3.1: Variables: SG X E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (decl X Ty E) ((X, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG X ============================ false
< apply no_lookup to Sec2 LkpSec. Subgoal 3: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (decl N Ty E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N H1 : N = X -> false ============================ lookup ((N, public)::SG) X public
< search. Subgoal 4: Variables: SL SG2 X L E N IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG2 SL (assign N E) SG2 @ LkpSec : lookup SG2 X public Sec1 : level SG2 E L Sec2 : lookup SG2 N private ============================ lookup SG2 X public
< search. Subgoal 5: Variables: SG2 X E N IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG2 public (assign N E) SG2 @ LkpSec : lookup SG2 X public Sec1 : level SG2 E public Sec2 : lookup SG2 N public ============================ lookup SG2 X public
< search. Subgoal 6: Variables: SL SG2 X L Sl1 SG1 SG3 S2 S1 E IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG2 SL (ifte E S1 S2) SG2 @ LkpSec : lookup SG2 X public Sec1 : level SG2 E L Sec2 : join L SL Sl1 Sec3 : secure SG2 Sl1 S1 SG1 * Sec4 : secure SG2 Sl1 S2 SG3 * ============================ lookup SG2 X public
< search. Subgoal 7: Variables: SL SG2 X L Sl1 SG1 S1 E IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG2 SL (while E S1) SG2 @ LkpSec : lookup SG2 X public Sec1 : level SG2 E L Sec2 : join L SL Sl1 Sec3 : secure SG2 Sl1 S1 SG1 * ============================ lookup SG2 X public
< search. Subgoal 8: Variables: SG SL X L N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E L Sec2 : no_lookup SG N ============================ lookup ((N, private)::SG) X public
< assert N = X -> false. Subgoal 8.1: Variables: SG SL X L N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E L Sec2 : no_lookup SG N ============================ N = X -> false
< intros E. Subgoal 8.1: Variables: SG SL X L N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E L Sec2 : no_lookup SG N E : N = X ============================ false
< case E. Subgoal 8.1: Variables: SG SL X L E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (secdecl X Ty private E) ((X, private)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E L Sec2 : no_lookup SG X ============================ false
< apply no_lookup to Sec2 LkpSec. Subgoal 8: Variables: SG SL X L N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL (secdecl N Ty private E) ((N, private)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E L Sec2 : no_lookup SG N H1 : N = X -> false ============================ lookup ((N, private)::SG) X public
< search. Subgoal 9: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N ============================ lookup ((N, public)::SG) X public
< assert N = X -> false. Subgoal 9.1: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N ============================ N = X -> false
< intros E. Subgoal 9.1: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N E : N = X ============================ false
< case E. Subgoal 9.1: Variables: SG X E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (secdecl X Ty public E) ((X, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG X ============================ false
< apply no_lookup to Sec2 LkpSec. Subgoal 9: Variables: SG X N E Ty IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG public (secdecl N Ty public E) ((N, public)::SG) @ LkpSec : lookup SG X public Sec1 : level SG E public Sec2 : no_lookup SG N H1 : N = X -> false ============================ lookup ((N, public)::SG) X public
< search. Subgoal 10: Variables: SG SL SG2 X S1 IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL <unknown I s> SG2 @ LkpSec : lookup SG X public Sec1 : |{s}- <unknown I s> ~~> S1 Sec2 : secure SG SL S1 SG2 * ============================ lookup SG2 X public
< apply IH to Sec2 LkpSec. Subgoal 10: Variables: SG SL SG2 X S1 IH : forall SG SL SG2 S X, secure SG SL S SG2 * -> lookup SG X public -> lookup SG2 X public Sec : secure SG SL <unknown I s> SG2 @ LkpSec : lookup SG X public Sec1 : |{s}- <unknown I s> ~~> S1 Sec2 : secure SG SL S1 SG2 * H1 : lookup SG2 X public ============================ lookup SG2 X public
< search. Proof completed.
< Theorem public_equiv_swap : forall SG SG' GA GB, (forall X, lookup SG X public -> lookup SG' X public) -> public_equiv SG' GA GB -> public_equiv SG GA GB. ============================ forall SG SG' GA GB, (forall X, lookup SG X public -> lookup SG' X public) -> public_equiv SG' GA GB -> public_equiv SG GA GB
< intros LkpEquiv Eq. Variables: SG SG' GA GB LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : public_equiv SG' GA GB ============================ public_equiv SG GA GB
< Eq: case Eq. Variables: SG SG' GA GB LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V ============================ public_equiv SG GA GB
< unfold . Subgoal 1: Variables: SG SG' GA GB LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V ============================ forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V
< intros LkpSec LkpA. Subgoal 1: Variables: SG SG' GA GB X V LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpA : lookup GA X V ============================ lookup GB X V
< LkpSG': apply LkpEquiv to LkpSec. Subgoal 1: Variables: SG SG' GA GB X V LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpA : lookup GA X V LkpSG' : lookup SG' X public ============================ lookup GB X V
< apply Eq to LkpSG' LkpA. Subgoal 1: Variables: SG SG' GA GB X V LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpA : lookup GA X V LkpSG' : lookup SG' X public H1 : lookup GB X V ============================ lookup GB X V
< search. Subgoal 2: Variables: SG SG' GA GB LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V ============================ forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V
< intros LkpSec LkpB. Subgoal 2: Variables: SG SG' GA GB X V LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpB : lookup GB X V ============================ lookup GA X V
< LkpSG': apply LkpEquiv to LkpSec. Subgoal 2: Variables: SG SG' GA GB X V LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpB : lookup GB X V LkpSG' : lookup SG' X public ============================ lookup GA X V
< apply Eq1 to LkpSG' LkpB. Subgoal 2: Variables: SG SG' GA GB X V LkpEquiv : forall X, lookup SG X public -> lookup SG' X public Eq : forall X V, lookup SG' X public -> lookup GA X V -> lookup GB X V Eq1 : forall X V, lookup SG' X public -> lookup GB X V -> lookup GA X V LkpSec : lookup SG X public LkpB : lookup GB X V LkpSG' : lookup SG' X public H1 : lookup GA X V ============================ lookup GA X V
< search. Proof completed.
< Extensible_Theorem stmt_not_public_no_public_change : forall S SG SL SG1 G G1, Sec : secure SG SL S SG1 -> NEq : (SL = public -> false) -> Ev : eval_s G S G1 -> public_equiv SG G G1 on Ev. Subgoal 1: Variables: SG SL SG1 G1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL skipS SG1 NEq : SL = public -> false Ev : eval_s G1 skipS G1 @ ============================ public_equiv SG G1 G1
< case Sec. Subgoal 1: Variables: SL SG1 G1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G1 skipS G1 @ ============================ public_equiv SG1 G1 G1
< backchain public_equiv_refl. Subgoal 2: Variables: SG SL SG1 G V N E Ty IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (decl N Ty E) SG1 NEq : SL = public -> false Ev : eval_s G (decl N Ty E) ((N, V)::G) @ Ev1 : eval_e G E V ============================ public_equiv SG G ((N, V)::G)
< Sec: case Sec. Subgoal 2: Variables: SG G V N E Ty IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : public = public -> false Ev : eval_s G (decl N Ty E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E public Sec1 : no_lookup SG N ============================ public_equiv SG G ((N, V)::G)
< apply NEq to _. Subgoal 3: Variables: SG SL SG1 G VOld NewG V N E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (assign N E) SG1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G ============================ public_equiv SG G ((N, V)::NewG)
< Sec: case Sec. Subgoal 3.1: Variables: SL SG1 G VOld NewG V N E L IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private ============================ public_equiv SG1 G ((N, V)::NewG)
< unfold . Subgoal 3.1.1: Variables: SL SG1 G VOld NewG V N E L IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private ============================ forall X V1, lookup SG1 X public -> lookup G X V1 -> lookup ((N, V)::NewG) X V1
< intros LS LA. Subgoal 3.1.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 ============================ lookup ((N, V)::NewG) X V1
< N: assert N = X -> false. Subgoal 3.1.1.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 ============================ N = X -> false
< intros E. Subgoal 3.1.1.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 E : N = X ============================ false
< case E. Subgoal 3.1.1.1: Variables: SL SG1 G VOld NewG V E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign X E) ((X, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (X, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 X private LS : lookup SG1 X public LA : lookup G X V1 ============================ false
< apply lookup_unique to Sec1 LS. Subgoal 3.1.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 N : N = X -> false ============================ lookup ((N, V)::NewG) X V1
< assert X = N -> false. Subgoal 3.1.1.2: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 N : N = X -> false ============================ X = N -> false
< intros E. Subgoal 3.1.1.2: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 N : N = X -> false E : X = N ============================ false
< case E. Subgoal 3.1.1.2: Variables: SL SG1 G VOld NewG V N E L V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 N public LA : lookup G N V1 N : N = N -> false ============================ false
< backchain N. Subgoal 3.1.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 N : N = X -> false H1 : X = N -> false ============================ lookup ((N, V)::NewG) X V1
< apply select_lookup to LA Ev2 _. Subgoal 3.1.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LA : lookup G X V1 N : N = X -> false H1 : X = N -> false H2 : lookup NewG X V1 ============================ lookup ((N, V)::NewG) X V1
< search. Subgoal 3.1.2: Variables: SL SG1 G VOld NewG V N E L IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private ============================ forall X V1, lookup SG1 X public -> lookup ((N, V)::NewG) X V1 -> lookup G X V1
< intros LS LB. Subgoal 3.1.2: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public LB : lookup ((N, V)::NewG) X V1 ============================ lookup G X V1
< L: case LB. Subgoal 3.1.2.1: Variables: SL SG1 G VOld NewG E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign X E) ((X, V1)::NewG) @ Ev1 : eval_e G E V1 Ev2 : select (X, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 X private LS : lookup SG1 X public ============================ lookup G X V1
< apply lookup_unique to Sec1 LS. Subgoal 3.1.2.2: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public L : N = X -> false L1 : lookup NewG X V1 ============================ lookup G X V1
< assert X = N -> false. Subgoal 3.1.2.2.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public L : N = X -> false L1 : lookup NewG X V1 ============================ X = N -> false
< intros E. Subgoal 3.1.2.2.1: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public L : N = X -> false L1 : lookup NewG X V1 E : X = N ============================ false
< case E. Subgoal 3.1.2.2.1: Variables: SL SG1 G VOld NewG V N E L V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 N public L : N = N -> false L1 : lookup NewG N V1 ============================ false
< backchain L. Subgoal 3.1.2.2: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public L : N = X -> false L1 : lookup NewG X V1 H1 : X = N -> false ============================ lookup G X V1
< apply lookup_after_select_before to L1 Ev2 _. Subgoal 3.1.2.2: Variables: SL SG1 G VOld NewG V N E L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E L Sec1 : lookup SG1 N private LS : lookup SG1 X public L : N = X -> false L1 : lookup NewG X V1 H1 : X = N -> false H2 : lookup G X V1 ============================ lookup G X V1
< search. Subgoal 3.2: Variables: SG1 G VOld NewG V N E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : public = public -> false Ev : eval_s G (assign N E) ((N, V)::NewG) @ Ev1 : eval_e G E V Ev2 : select (N, VOld) NewG G Sec : level SG1 E public Sec1 : lookup SG1 N public ============================ public_equiv SG1 G ((N, V)::NewG)
< apply NEq to _. Subgoal 4: Variables: SG SL SG1 G G1 G2 S2 S1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (seq S1 S2) SG1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * ============================ public_equiv SG G G1
< Sec: case Sec. Subgoal 4: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 ============================ public_equiv SG G G1
< PE1: apply IH to Sec _ Ev1. Subgoal 4: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 ============================ public_equiv SG G G1
< PE2: apply IH to Sec1 _ Ev2. Subgoal 4: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 PE2 : public_equiv SG2 G2 G1 ============================ public_equiv SG G G1
< E: assert forall X, lookup SG X public -> lookup SG2 X public. Subgoal 4.1: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 PE2 : public_equiv SG2 G2 G1 ============================ forall X, lookup SG X public -> lookup SG2 X public
< intros L. Subgoal 4.1: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 X IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 PE2 : public_equiv SG2 G2 G1 L : lookup SG X public ============================ lookup SG2 X public
< L': apply stmt_public_branch to Sec L. Subgoal 4.1: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 X IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 PE2 : public_equiv SG2 G2 G1 L : lookup SG X public L' : lookup SG2 X public ============================ lookup SG2 X public
< search. Subgoal 4: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 PE2 : public_equiv SG2 G2 G1 E : forall X, lookup SG X public -> lookup SG2 X public ============================ public_equiv SG G G1
< PE': apply public_equiv_swap to E PE2. Subgoal 4: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 PE2 : public_equiv SG2 G2 G1 E : forall X, lookup SG X public -> lookup SG2 X public PE' : public_equiv SG G2 G1 ============================ public_equiv SG G G1
< apply public_equiv_trans to PE1 PE'. Subgoal 4: Variables: SG SL SG1 G G1 G2 S2 S1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (seq S1 S2) G1 @ Ev1 : eval_s G S1 G2 * Ev2 : eval_s G2 S2 G1 * Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 PE1 : public_equiv SG G G2 PE2 : public_equiv SG2 G2 G1 E : forall X, lookup SG X public -> lookup SG2 X public PE' : public_equiv SG G2 G1 H1 : public_equiv SG G G1 ============================ public_equiv SG G G1
< search. Subgoal 5: Variables: SG SL SG1 G G1 S2 S1 E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (ifte E S1 S2) SG1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * ============================ public_equiv SG G G1
< Sec: case Sec. Subgoal 5: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 ============================ public_equiv SG1 G G1
< assert Sl1 = public -> false. Subgoal 5.1: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 ============================ Sl1 = public -> false
< intros E. Subgoal 5.1: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 E : Sl1 = public ============================ false
< case E. Subgoal 5.1: Variables: SL SG1 G G1 S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 ============================ false
< backchain NEq. Subgoal 5.1: Variables: SL SG1 G G1 S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 ============================ SL = public
< apply join_public to Sec1. Subgoal 5.1: Variables: SG1 G G1 S2 S1 E SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : public = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E public Sec1 : join public public public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 ============================ public = public
< search. Subgoal 5: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 H1 : Sl1 = public -> false ============================ public_equiv SG1 G G1
< apply IH to Sec2 _ Ev2. Subgoal 5: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 H1 : Sl1 = public -> false H2 : public_equiv SG1 G G1 ============================ public_equiv SG1 G G1
< search. Subgoal 6: Variables: SG SL SG1 G G1 S2 S1 E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (ifte E S1 S2) SG1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * ============================ public_equiv SG G G1
< Sec: case Sec. Subgoal 6: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 ============================ public_equiv SG1 G G1
< assert Sl1 = public -> false. Subgoal 6.1: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 ============================ Sl1 = public -> false
< intros E. Subgoal 6.1: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 E : Sl1 = public ============================ false
< case E. Subgoal 6.1: Variables: SL SG1 G G1 S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 ============================ false
< backchain NEq. Subgoal 6.1: Variables: SL SG1 G G1 S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 ============================ SL = public
< apply join_public to Sec1. Subgoal 6.1: Variables: SG1 G G1 S2 S1 E SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : public = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E public Sec1 : join public public public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 ============================ public = public
< search. Subgoal 6: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 H1 : Sl1 = public -> false ============================ public_equiv SG1 G G1
< apply IH to Sec3 _ Ev2. Subgoal 6: Variables: SL SG1 G G1 S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (ifte E S1 S2) G1 @ Ev1 : eval_e G E falseE Ev2 : eval_s G S2 G1 * Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 H1 : Sl1 = public -> false H2 : public_equiv SG1 G G1 ============================ public_equiv SG1 G G1
< search. Subgoal 7: Variables: SG SL SG1 G G1 G2 S1 E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * ============================ public_equiv SG G G1
< Sec: case Sec (keep). Subgoal 7: Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 ============================ public_equiv SG1 G G1
< assert Sl1 = public -> false. Subgoal 7.1: Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 ============================ Sl1 = public -> false
< intros E. Subgoal 7.1: Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 E : Sl1 = public ============================ false
< case E. Subgoal 7.1: Variables: SL SG1 G G1 G2 S1 E L SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL public Sec3 : secure SG1 public S1 SG2 ============================ false
< backchain NEq. Subgoal 7.1: Variables: SL SG1 G G1 G2 S1 E L SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL public Sec3 : secure SG1 public S1 SG2 ============================ SL = public
< apply join_public to Sec2. Subgoal 7.1: Variables: SG1 G G1 G2 S1 E SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 public (while E S1) SG1 NEq : public = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E public Sec2 : join public public public Sec3 : secure SG1 public S1 SG2 ============================ public = public
< search. Subgoal 7: Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 H1 : Sl1 = public -> false ============================ public_equiv SG1 G G1
< EqGG2: apply IH to Sec3 _ Ev2. Subgoal 7: Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 H1 : Sl1 = public -> false EqGG2 : public_equiv SG1 G G2 ============================ public_equiv SG1 G G1
< EqG2G1: apply IH to _ _ Ev3. Subgoal 7: Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 H1 : Sl1 = public -> false EqGG2 : public_equiv SG1 G G2 EqG2G1 : public_equiv SG1 G2 G1 ============================ public_equiv SG1 G G1
< apply public_equiv_trans to EqGG2 EqG2G1. Subgoal 7: Variables: SL SG1 G G1 G2 S1 E L Sl1 SG2 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG1 SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G (while E S1) G1 @ Ev1 : eval_e G E trueE Ev2 : eval_s G S1 G2 * Ev3 : eval_s G2 (while E S1) G1 * Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 H1 : Sl1 = public -> false EqGG2 : public_equiv SG1 G G2 EqG2G1 : public_equiv SG1 G2 G1 H2 : public_equiv SG1 G G1 ============================ public_equiv SG1 G G1
< search. Subgoal 8: Variables: SG SL SG1 G1 S1 E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G1 (while E S1) G1 @ Ev1 : eval_e G1 E falseE ============================ public_equiv SG G1 G1
< unfold . Subgoal 8.1: Variables: SG SL SG1 G1 S1 E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G1 (while E S1) G1 @ Ev1 : eval_e G1 E falseE ============================ forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
< intros LkpSec LkpG1. Subgoal 8.1: Variables: SG SL SG1 G1 S1 E X V IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G1 (while E S1) G1 @ Ev1 : eval_e G1 E falseE LkpSec : lookup SG X public LkpG1 : lookup G1 X V ============================ lookup G1 X V
< search. Subgoal 8.2: Variables: SG SL SG1 G1 S1 E IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G1 (while E S1) G1 @ Ev1 : eval_e G1 E falseE ============================ forall X V, lookup SG X public -> lookup G1 X V -> lookup G1 X V
< intros LkpSec LkpG1. Subgoal 8.2: Variables: SG SL SG1 G1 S1 E X V IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (while E S1) SG1 NEq : SL = public -> false Ev : eval_s G1 (while E S1) G1 @ Ev1 : eval_e G1 E falseE LkpSec : lookup SG X public LkpG1 : lookup G1 X V ============================ lookup G1 X V
< search. Subgoal 9: Variables: SG SL SG1 G V N E Sl Ty IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL (secdecl N Ty Sl E) SG1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty Sl E) ((N, V)::G) @ Ev1 : eval_e G E V ============================ public_equiv SG G ((N, V)::G)
< Sec: case Sec. Subgoal 9.1: Variables: SG SL G V N E Ty L IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N ============================ public_equiv SG G ((N, V)::G)
< unfold . Subgoal 9.1.1: Variables: SG SL G V N E Ty L IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N ============================ forall X V1, lookup SG X public -> lookup G X V1 -> lookup ((N, V)::G) X V1
< intros LkpSec LkpG. Subgoal 9.1.1: Variables: SG SL G V N E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup SG X public LkpG : lookup G X V1 ============================ lookup ((N, V)::G) X V1
< assert N = X -> false. Subgoal 9.1.1.1: Variables: SG SL G V N E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup SG X public LkpG : lookup G X V1 ============================ N = X -> false
< intros E. Subgoal 9.1.1.1: Variables: SG SL G V N E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup SG X public LkpG : lookup G X V1 E : N = X ============================ false
< case E. Subgoal 9.1.1.1: Variables: SG SL G V E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl X Ty private E) ((X, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG X LkpSec : lookup SG X public LkpG : lookup G X V1 ============================ false
< apply no_lookup to Sec1 LkpSec. Subgoal 9.1.1: Variables: SG SL G V N E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup SG X public LkpG : lookup G X V1 H1 : N = X -> false ============================ lookup ((N, V)::G) X V1
< search. Subgoal 9.1.2: Variables: SG SL G V N E Ty L IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N ============================ forall X V1, lookup SG X public -> lookup ((N, V)::G) X V1 -> lookup G X V1
< intros LkpSec LkpG+. Subgoal 9.1.2: Variables: SG SL G V N E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup SG X public LkpG+ : lookup ((N, V)::G) X V1 ============================ lookup G X V1
< Lkp: case LkpG+. Subgoal 9.1.2.1: Variables: SG SL G E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl X Ty private E) ((X, V1)::G) @ Ev1 : eval_e G E V1 Sec : level SG E L Sec1 : no_lookup SG X LkpSec : lookup SG X public ============================ lookup G X V1
< apply no_lookup to Sec1 LkpSec. Subgoal 9.1.2.2: Variables: SG SL G V N E Ty L X V1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G (secdecl N Ty private E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup SG X public Lkp : N = X -> false Lkp1 : lookup G X V1 ============================ lookup G X V1
< search. Subgoal 9.2: Variables: SG G V N E Ty IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : public = public -> false Ev : eval_s G (secdecl N Ty public E) ((N, V)::G) @ Ev1 : eval_e G E V Sec : level SG E public Sec1 : no_lookup SG N ============================ public_equiv SG G ((N, V)::G)
< apply NEq to _. Subgoal 10: Variables: SG SL SG1 G G1 T IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 Sec : secure SG SL <unknown K eval_s> SG1 NEq : SL = public -> false Ev : eval_s G <unknown K eval_s> G1 @ Ev1 : |{s}- <unknown K eval_s> ~~> T Ev2 : eval_s G T G1 * ============================ public_equiv SG G G1
< Sec: case Sec. Subgoal 10: Variables: SG SL SG1 G G1 T S1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G <unknown K eval_s> G1 @ Ev1 : |{s}- <unknown K eval_s> ~~> T Ev2 : eval_s G T G1 * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 ============================ public_equiv SG G G1
< apply proj_s_unique to Ev1 Sec. Subgoal 10: Variables: SG SL SG1 G G1 S1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G <unknown K eval_s> G1 @ Ev1 : |{s}- <unknown K eval_s> ~~> S1 Ev2 : eval_s G S1 G1 * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 ============================ public_equiv SG G G1
< apply IH to _ _ Ev2. Subgoal 10: Variables: SG SL SG1 G G1 S1 IH : forall S SG SL SG1 G G1, secure SG SL S SG1 -> (SL = public -> false) -> eval_s G S G1 * -> public_equiv SG G G1 NEq : SL = public -> false Ev : eval_s G <unknown K eval_s> G1 @ Ev1 : |{s}- <unknown K eval_s> ~~> S1 Ev2 : eval_s G S1 G1 * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 H1 : public_equiv SG G G1 ============================ public_equiv SG G G1
< search. Proof completed.
< Theorem while_no_public_change : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 -> public_equiv SG G G2. ============================ forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 -> public_equiv SG G G2
< induction on 4. IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 ============================ forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 @ -> public_equiv SG G G2
< intros Sec Lev NEq Ev. Variables: SG SL SG' Cond Body S G G2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Sec : secure SG SL (while Cond Body) SG' Lev : level SG Cond S NEq : S = public -> false Ev : eval_s G (while Cond Body) G2 @ ============================ public_equiv SG G G2
< Ev: case Ev. Subgoal 1: Variables: SG SL SG' Cond Body S G G2 G1 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Sec : secure SG SL (while Cond Body) SG' Lev : level SG Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * ============================ public_equiv SG G G2
< EqG1G2: apply IH to Sec Lev NEq Ev2. Subgoal 1: Variables: SG SL SG' Cond Body S G G2 G1 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Sec : secure SG SL (while Cond Body) SG' Lev : level SG Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG G1 G2 ============================ public_equiv SG G G2
< Sec: case Sec. Subgoal 1: Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond L Sec1 : join L SL Sl1 Sec2 : secure SG' Sl1 Body SG2 ============================ public_equiv SG' G G2
< EqGG1: apply stmt_not_public_no_public_change to Sec2 _ Ev1. Subgoal 1.1: Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond L Sec1 : join L SL Sl1 Sec2 : secure SG' Sl1 Body SG2 ============================ Sl1 = public -> false
< intros Eq. Subgoal 1.1: Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond L Sec1 : join L SL Sl1 Sec2 : secure SG' Sl1 Body SG2 Eq : Sl1 = public ============================ false
< case Eq. Subgoal 1.1: Variables: SL SG' Cond Body S G G2 G1 L SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond L Sec1 : join L SL public Sec2 : secure SG' public Body SG2 ============================ false
< apply join_public to Sec1. Subgoal 1.1: Variables: SG' Cond Body S G G2 G1 SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond public Sec1 : join public public public Sec2 : secure SG' public Body SG2 ============================ false
< apply level_unique to Lev Sec. Subgoal 1.1: Variables: SG' Cond Body G G2 G1 SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond public NEq : public = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond public Sec1 : join public public public Sec2 : secure SG' public Body SG2 ============================ false
< backchain NEq. Subgoal 1: Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond L Sec1 : join L SL Sl1 Sec2 : secure SG' Sl1 Body SG2 EqGG1 : public_equiv SG' G G1 ============================ public_equiv SG' G G2
< apply public_equiv_trans to EqGG1 EqG1G2. Subgoal 1: Variables: SL SG' Cond Body S G G2 G1 L Sl1 SG2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Lev : level SG' Cond S NEq : S = public -> false Ev : eval_e G Cond trueE Ev1 : eval_s G Body G1 * Ev2 : eval_s G1 (while Cond Body) G2 * EqG1G2 : public_equiv SG' G1 G2 Sec : level SG' Cond L Sec1 : join L SL Sl1 Sec2 : secure SG' Sl1 Body SG2 EqGG1 : public_equiv SG' G G1 H1 : public_equiv SG' G G2 ============================ public_equiv SG' G G2
< search. Subgoal 2: Variables: SG SL SG' Cond Body S G2 IH : forall SG SL SG' Cond Body S G G2, secure SG SL (while Cond Body) SG' -> level SG Cond S -> (S = public -> false) -> eval_s G (while Cond Body) G2 * -> public_equiv SG G G2 Sec : secure SG SL (while Cond Body) SG' Lev : level SG Cond S NEq : S = public -> false Ev : eval_e G2 Cond falseE ============================ public_equiv SG G2 G2
< backchain public_equiv_refl. Proof completed.
< Extensible_Theorem stmt_secure : forall S SG SL SG1 GA GA' GB GB', Is : is_s S -> Sec : secure SG SL S SG1 -> Rel : public_equiv SG GA GB -> EvA : eval_s GA S GA' -> EvB : eval_s GB S GB' -> public_equiv SG1 GA' GB' on EvA. Subgoal 1: Variables: SG SL SG1 GA' GB GB' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s skipS Sec : secure SG SL skipS SG1 Rel : public_equiv SG GA' GB EvA : eval_s GA' skipS GA' @ EvB : eval_s GB skipS GB' ============================ public_equiv SG1 GA' GB'
< case EvB. Subgoal 1: Variables: SG SL SG1 GA' GB' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s skipS Sec : secure SG SL skipS SG1 Rel : public_equiv SG GA' GB' EvA : eval_s GA' skipS GA' @ ============================ public_equiv SG1 GA' GB'
< case Sec. Subgoal 1: Variables: SL SG1 GA' GB' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s skipS Rel : public_equiv SG1 GA' GB' EvA : eval_s GA' skipS GA' @ ============================ public_equiv SG1 GA' GB'
< search. Subgoal 2: Variables: SG SL SG1 GA GB GB' V N E Ty IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (decl N Ty E) Sec : secure SG SL (decl N Ty E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @ EvB : eval_s GB (decl N Ty E) GB' EvA1 : eval_e GA E V ============================ public_equiv SG1 ((N, V)::GA) GB'
< EvB: case EvB. Subgoal 2: Variables: SG SL SG1 GA GB V N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (decl N Ty E) Sec : secure SG SL (decl N Ty E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 ============================ public_equiv SG1 ((N, V)::GA) ((N, V1)::GB)
< Sec: case Sec. Subgoal 2: Variables: SG GA GB V N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (decl N Ty E) Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N ============================ public_equiv ((N, public)::SG) ((N, V)::GA) ((N, V1)::GB)
< Is: case Is. Subgoal 2: Variables: SG GA GB V N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E ============================ public_equiv ((N, public)::SG) ((N, V)::GA) ((N, V1)::GB)
< apply level_secure to _ _ Rel EvA1 EvB. Subgoal 2: Variables: SG GA GB N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E ============================ public_equiv ((N, public)::SG) ((N, V1)::GA) ((N, V1)::GB)
< unfold . Subgoal 2.1: Variables: SG GA GB N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E ============================ forall X V, lookup ((N, public)::SG) X public -> lookup ((N, V1)::GA) X V -> lookup ((N, V1)::GB) X V
< intros LkpSec LkpA. Subgoal 2.1: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : lookup ((N, public)::SG) X public LkpA : lookup ((N, V1)::GA) X V2 ============================ lookup ((N, V1)::GB) X V2
< LkpSec: case LkpSec. Subgoal 2.1.1: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E LkpA : lookup ((X, V1)::GA) X V2 ============================ lookup ((X, V1)::GB) X V2
< LkpA: case LkpA. Subgoal 2.1.1.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E ============================ lookup ((X, V2)::GB) X V2
< search. Subgoal 2.1.1.2: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E LkpA : X = X -> false LkpA1 : lookup GA X V2 ============================ lookup ((X, V1)::GB) X V2
< apply LkpA to _. Subgoal 2.1.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpA : lookup ((N, V1)::GA) X V2 LkpSec : N = X -> false LkpSec1 : lookup SG X public ============================ lookup ((N, V1)::GB) X V2
< LkpA: case LkpA. Subgoal 2.1.2.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E LkpSec : X = X -> false LkpSec1 : lookup SG X public ============================ lookup ((X, V2)::GB) X V2
< apply LkpSec to _. Subgoal 2.1.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : N = X -> false LkpSec1 : lookup SG X public LkpA : N = X -> false LkpA1 : lookup GA X V2 ============================ lookup ((N, V1)::GB) X V2
< Rel: case Rel. Subgoal 2.1.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : N = X -> false LkpSec1 : lookup SG X public LkpA : N = X -> false LkpA1 : lookup GA X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::GB) X V2
< apply Rel to LkpSec1 LkpA1. Subgoal 2.1.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : N = X -> false LkpSec1 : lookup SG X public LkpA : N = X -> false LkpA1 : lookup GA X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V H1 : lookup GB X V2 ============================ lookup ((N, V1)::GB) X V2
< search. Subgoal 2.2: Variables: SG GA GB N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E ============================ forall X V, lookup ((N, public)::SG) X public -> lookup ((N, V1)::GB) X V -> lookup ((N, V1)::GA) X V
< intros LkpSec LkpB. Subgoal 2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : lookup ((N, public)::SG) X public LkpB : lookup ((N, V1)::GB) X V2 ============================ lookup ((N, V1)::GA) X V2
< LkpSec: case LkpSec. Subgoal 2.2.1: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E LkpB : lookup ((X, V1)::GB) X V2 ============================ lookup ((X, V1)::GA) X V2
< LkpB: case LkpB. Subgoal 2.2.1.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E ============================ lookup ((X, V2)::GA) X V2
< search. Subgoal 2.2.1.2: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E LkpB : X = X -> false LkpB1 : lookup GB X V2 ============================ lookup ((X, V1)::GA) X V2
< apply LkpB to _. Subgoal 2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpB : lookup ((N, V1)::GB) X V2 LkpSec : N = X -> false LkpSec1 : lookup SG X public ============================ lookup ((N, V1)::GA) X V2
< LkpB: case LkpB. Subgoal 2.2.2.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl X Ty E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Sec : level SG E public Sec1 : no_lookup SG X Is : is_string X Is1 : is_ty Ty Is2 : is_e E LkpSec : X = X -> false LkpSec1 : lookup SG X public ============================ lookup ((X, V2)::GA) X V2
< apply LkpSec to _. Subgoal 2.2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : N = X -> false LkpSec1 : lookup SG X public LkpB : N = X -> false LkpB1 : lookup GB X V2 ============================ lookup ((N, V1)::GA) X V2
< Rel: case Rel. Subgoal 2.2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : N = X -> false LkpSec1 : lookup SG X public LkpB : N = X -> false LkpB1 : lookup GB X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::GA) X V2
< apply Rel1 to LkpSec1 LkpB1. Subgoal 2.2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (decl N Ty E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Sec : level SG E public Sec1 : no_lookup SG N Is : is_string N Is1 : is_ty Ty Is2 : is_e E LkpSec : N = X -> false LkpSec1 : lookup SG X public LkpB : N = X -> false LkpB1 : lookup GB X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V H1 : lookup GA X V2 ============================ lookup ((N, V1)::GA) X V2
< search. Subgoal 3: Variables: SG SL SG1 GA GB GB' VOld NewG V N E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (assign N E) Sec : secure SG SL (assign N E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvB : eval_s GB (assign N E) GB' EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA ============================ public_equiv SG1 ((N, V)::NewG) GB'
< EvB: case EvB. Subgoal 3: Variables: SG SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (assign N E) Sec : secure SG SL (assign N E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB ============================ public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
< Is: case Is. Subgoal 3: Variables: SG SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Sec : secure SG SL (assign N E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E ============================ public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
< Sec: case Sec. Subgoal 3.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private ============================ public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
< unfold . Subgoal 3.1.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private ============================ forall X V2, lookup SG1 X public -> lookup ((N, V)::NewG) X V2 -> lookup ((N, V1)::NewG1) X V2
< intros LkpSec LkpA. Subgoal 3.1.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : lookup ((N, V)::NewG) X V2 ============================ lookup ((N, V1)::NewG1) X V2
< LkpA: case LkpA. Subgoal 3.1.1.1: Variables: SL SG1 GA GB VOld NewG E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign X E) ((X, V2)::NewG) @ EvA1 : eval_e GA E V2 EvA2 : select (X, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (X, VOld1) NewG1 GB Is : is_string X Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 X private LkpSec : lookup SG1 X public ============================ lookup ((X, V1)::NewG1) X V2
< apply lookup_unique to Sec1 LkpSec. Subgoal 3.1.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 ============================ lookup ((N, V1)::NewG1) X V2
< assert X = N -> false. Subgoal 3.1.1.2.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 ============================ X = N -> false
< intros E. Subgoal 3.1.1.2.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 E : X = N ============================ false
< case E. Subgoal 3.1.1.2.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 N public LkpA : N = N -> false LkpA1 : lookup NewG N V2 ============================ false
< backchain LkpA. Subgoal 3.1.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false ============================ lookup ((N, V1)::NewG1) X V2
< L: apply lookup_after_select_before to LkpA1 EvA2 _. Subgoal 3.1.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false L : lookup GA X V2 ============================ lookup ((N, V1)::NewG1) X V2
< R: case Rel. Subgoal 3.1.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false L : lookup GA X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::NewG1) X V2
< LB: apply R to _ L. Subgoal 3.1.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false L : lookup GA X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LB : lookup GB X V2 ============================ lookup ((N, V1)::NewG1) X V2
< apply select_lookup to LB EvB1 _. Subgoal 3.1.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false L : lookup GA X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LB : lookup GB X V2 H2 : lookup NewG1 X V2 ============================ lookup ((N, V1)::NewG1) X V2
< search. Subgoal 3.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private ============================ forall X V2, lookup SG1 X public -> lookup ((N, V1)::NewG1) X V2 -> lookup ((N, V)::NewG) X V2
< intros LkpSec LkpB. Subgoal 3.1.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : lookup ((N, V1)::NewG1) X V2 ============================ lookup ((N, V)::NewG) X V2
< LkpB: case LkpB. Subgoal 3.1.2.1: Variables: SL SG1 GA GB VOld NewG V E VOld1 NewG1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign X E) ((X, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (X, VOld) NewG GA EvB : eval_e GB E V2 EvB1 : select (X, VOld1) NewG1 GB Is : is_string X Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 X private LkpSec : lookup SG1 X public ============================ lookup ((X, V)::NewG) X V2
< apply lookup_unique to Sec1 LkpSec. Subgoal 3.1.2.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 ============================ lookup ((N, V)::NewG) X V2
< assert X = N -> false. Subgoal 3.1.2.2.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 ============================ X = N -> false
< intros E. Subgoal 3.1.2.2.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 E : X = N ============================ false
< case E. Subgoal 3.1.2.2.1: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 N public LkpB : N = N -> false LkpB1 : lookup NewG1 N V2 ============================ false
< backchain LkpB. Subgoal 3.1.2.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false ============================ lookup ((N, V)::NewG) X V2
< L: apply lookup_after_select_before to LkpB1 EvB1 _. Subgoal 3.1.2.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false L : lookup GB X V2 ============================ lookup ((N, V)::NewG) X V2
< R: case Rel. Subgoal 3.1.2.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false L : lookup GB X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V)::NewG) X V2
< LA: apply R1 to _ L. Subgoal 3.1.2.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false L : lookup GB X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LA : lookup GA X V2 ============================ lookup ((N, V)::NewG) X V2
< apply select_lookup to LA EvA2 _. Subgoal 3.1.2.2: Variables: SL SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E L Sec1 : lookup SG1 N private LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false L : lookup GB X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LA : lookup GA X V2 H2 : lookup NewG X V2 ============================ lookup ((N, V)::NewG) X V2
< search. Subgoal 3.2: Variables: SG1 GA GB VOld NewG V N E VOld1 NewG1 V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V)::NewG) @ EvA1 : eval_e GA E V EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public ============================ public_equiv SG1 ((N, V)::NewG) ((N, V1)::NewG1)
< apply level_secure to _ Sec Rel EvA1 EvB. Subgoal 3.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public ============================ public_equiv SG1 ((N, V1)::NewG) ((N, V1)::NewG1)
< unfold . Subgoal 3.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public ============================ forall X V, lookup SG1 X public -> lookup ((N, V1)::NewG) X V -> lookup ((N, V1)::NewG1) X V
< intros LkpSec LkpA. Subgoal 3.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : lookup ((N, V1)::NewG) X V2 ============================ lookup ((N, V1)::NewG1) X V2
< LkpA: case LkpA. Subgoal 3.2.1.1: Variables: SG1 GA GB VOld NewG E VOld1 NewG1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign X E) ((X, V2)::NewG) @ EvA1 : eval_e GA E V2 EvA2 : select (X, VOld) NewG GA EvB : eval_e GB E V2 EvB1 : select (X, VOld1) NewG1 GB Is : is_string X Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 X public LkpSec : lookup SG1 X public ============================ lookup ((X, V2)::NewG1) X V2
< search. Subgoal 3.2.1.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 ============================ lookup ((N, V1)::NewG1) X V2
< assert X = N -> false. Subgoal 3.2.1.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 ============================ X = N -> false
< intros E. Subgoal 3.2.1.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 E : X = N ============================ false
< case E. Subgoal 3.2.1.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 N public LkpA : N = N -> false LkpA1 : lookup NewG N V2 ============================ false
< backchain LkpA. Subgoal 3.2.1.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false ============================ lookup ((N, V1)::NewG1) X V2
< LGA: apply lookup_after_select_before to LkpA1 EvA2 _. Subgoal 3.2.1.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false LGA : lookup GA X V2 ============================ lookup ((N, V1)::NewG1) X V2
< R: case Rel. Subgoal 3.2.1.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false LGA : lookup GA X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::NewG1) X V2
< LGB: apply R to LkpSec LGA. Subgoal 3.2.1.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false LGA : lookup GA X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LGB : lookup GB X V2 ============================ lookup ((N, V1)::NewG1) X V2
< apply select_lookup to LGB EvB1 _. Subgoal 3.2.1.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpA : N = X -> false LkpA1 : lookup NewG X V2 H1 : X = N -> false LGA : lookup GA X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LGB : lookup GB X V2 H2 : lookup NewG1 X V2 ============================ lookup ((N, V1)::NewG1) X V2
< search. Subgoal 3.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public ============================ forall X V, lookup SG1 X public -> lookup ((N, V1)::NewG1) X V -> lookup ((N, V1)::NewG) X V
< intros LkpSec LkpB. Subgoal 3.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : lookup ((N, V1)::NewG1) X V2 ============================ lookup ((N, V1)::NewG) X V2
< LkpB: case LkpB. Subgoal 3.2.2.1: Variables: SG1 GA GB VOld NewG E VOld1 NewG1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign X E) ((X, V2)::NewG) @ EvA1 : eval_e GA E V2 EvA2 : select (X, VOld) NewG GA EvB : eval_e GB E V2 EvB1 : select (X, VOld1) NewG1 GB Is : is_string X Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 X public LkpSec : lookup SG1 X public ============================ lookup ((X, V2)::NewG) X V2
< search. Subgoal 3.2.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 ============================ lookup ((N, V1)::NewG) X V2
< assert X = N -> false. Subgoal 3.2.2.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 ============================ X = N -> false
< intros E. Subgoal 3.2.2.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 E : X = N ============================ false
< case E. Subgoal 3.2.2.2.1: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 N public LkpB : N = N -> false LkpB1 : lookup NewG1 N V2 ============================ false
< backchain LkpB. Subgoal 3.2.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false ============================ lookup ((N, V1)::NewG) X V2
< LGB: apply lookup_after_select_before to LkpB1 EvB1 _. Subgoal 3.2.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false LGB : lookup GB X V2 ============================ lookup ((N, V1)::NewG) X V2
< R: case Rel. Subgoal 3.2.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false LGB : lookup GB X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::NewG) X V2
< LGA: apply R1 to LkpSec LGB. Subgoal 3.2.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false LGB : lookup GB X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LGA : lookup GA X V2 ============================ lookup ((N, V1)::NewG) X V2
< apply select_lookup to LGA EvA2 _. Subgoal 3.2.2.2: Variables: SG1 GA GB VOld NewG N E VOld1 NewG1 V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (assign N E) ((N, V1)::NewG) @ EvA1 : eval_e GA E V1 EvA2 : select (N, VOld) NewG GA EvB : eval_e GB E V1 EvB1 : select (N, VOld1) NewG1 GB Is : is_string N Is1 : is_e E Sec : level SG1 E public Sec1 : lookup SG1 N public LkpSec : lookup SG1 X public LkpB : N = X -> false LkpB1 : lookup NewG1 X V2 H1 : X = N -> false LGB : lookup GB X V2 R : forall X V, lookup SG1 X public -> lookup GA X V -> lookup GB X V R1 : forall X V, lookup SG1 X public -> lookup GB X V -> lookup GA X V LGA : lookup GA X V2 H2 : lookup NewG X V2 ============================ lookup ((N, V1)::NewG) X V2
< search. Subgoal 4: Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (seq S1 S2) Sec : secure SG SL (seq S1 S2) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (seq S1 S2) GA' @ EvB : eval_s GB (seq S1 S2) GB' EvA1 : eval_s GA S1 G1 * EvA2 : eval_s G1 S2 GA' * ============================ public_equiv SG1 GA' GB'
< EvB: case EvB. Subgoal 4: Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (seq S1 S2) Sec : secure SG SL (seq S1 S2) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (seq S1 S2) GA' @ EvA1 : eval_s GA S1 G1 * EvA2 : eval_s G1 S2 GA' * EvB : eval_s GB S1 G2 EvB1 : eval_s G2 S2 GB' ============================ public_equiv SG1 GA' GB'
< Sec: case Sec. Subgoal 4: Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (seq S1 S2) Rel : public_equiv SG GA GB EvA : eval_s GA (seq S1 S2) GA' @ EvA1 : eval_s GA S1 G1 * EvA2 : eval_s G1 S2 GA' * EvB : eval_s GB S1 G2 EvB1 : eval_s G2 S2 GB' Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 ============================ public_equiv SG1 GA' GB'
< Is: case Is. Subgoal 4: Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (seq S1 S2) GA' @ EvA1 : eval_s GA S1 G1 * EvA2 : eval_s G1 S2 GA' * EvB : eval_s GB S1 G2 EvB1 : eval_s G2 S2 GB' Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 Is : is_s S1 Is1 : is_s S2 ============================ public_equiv SG1 GA' GB'
< apply IH to _ _ _ EvA1 EvB. Subgoal 4: Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (seq S1 S2) GA' @ EvA1 : eval_s GA S1 G1 * EvA2 : eval_s G1 S2 GA' * EvB : eval_s GB S1 G2 EvB1 : eval_s G2 S2 GB' Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 Is : is_s S1 Is1 : is_s S2 H1 : public_equiv SG2 G1 G2 ============================ public_equiv SG1 GA' GB'
< apply IH to _ _ _ EvA2 EvB1. Subgoal 4: Variables: SG SL SG1 GA GA' GB GB' G1 S2 S1 G2 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (seq S1 S2) GA' @ EvA1 : eval_s GA S1 G1 * EvA2 : eval_s G1 S2 GA' * EvB : eval_s GB S1 G2 EvB1 : eval_s G2 S2 GB' Sec : secure SG SL S1 SG2 Sec1 : secure SG2 SL S2 SG1 Is : is_s S1 Is1 : is_s S2 H1 : public_equiv SG2 G1 G2 H2 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 5: Variables: SG SL SG1 GA GA' GB GB' S2 S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (ifte E S1 S2) Sec : secure SG SL (ifte E S1 S2) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvB : eval_s GB (ifte E S1 S2) GB' EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * ============================ public_equiv SG1 GA' GB'
< Is: case Is. Subgoal 5: Variables: SG SL SG1 GA GA' GB GB' S2 S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Sec : secure SG SL (ifte E S1 S2) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvB : eval_s GB (ifte E S1 S2) GB' EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 ============================ public_equiv SG1 GA' GB'
< Sec: case Sec. Subgoal 5: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvB : eval_s GB (ifte E S1 S2) GB' EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 ============================ public_equiv SG1 GA' GB'
< EvB: case EvB. Subgoal 5.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' ============================ public_equiv SG1 GA' GB'
< EqGA'GB': apply IH to _ _ _ EvA2 EvB1. Subgoal 5.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' EqGA'GB' : public_equiv SG2 GA' GB' ============================ public_equiv SG1 GA' GB'
< LkpEq: assert forall X, lookup SG1 X public -> lookup SG2 X public. Subgoal 5.1.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' EqGA'GB' : public_equiv SG2 GA' GB' ============================ forall X, lookup SG1 X public -> lookup SG2 X public
< intros Lkp. Subgoal 5.1.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' EqGA'GB' : public_equiv SG2 GA' GB' Lkp : lookup SG1 X public ============================ lookup SG2 X public
< apply stmt_public_branch to Sec2 Lkp. Subgoal 5.1.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' EqGA'GB' : public_equiv SG2 GA' GB' Lkp : lookup SG1 X public H1 : lookup SG2 X public ============================ lookup SG2 X public
< search. Subgoal 5.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' EqGA'GB' : public_equiv SG2 GA' GB' LkpEq : forall X, lookup SG1 X public -> lookup SG2 X public ============================ public_equiv SG1 GA' GB'
< apply public_equiv_swap to LkpEq EqGA'GB'. Subgoal 5.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' EqGA'GB' : public_equiv SG2 GA' GB' LkpEq : forall X, lookup SG1 X public -> lookup SG2 X public H1 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' ============================ public_equiv SG1 GA' GB'
< NEq: assert L = public -> false. Subgoal 5.2.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' ============================ L = public -> false
< intros E. Subgoal 5.2.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' E : L = public ============================ false
< case E. Subgoal 5.2.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E public Sec1 : join public SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' ============================ false
< apply level_not_public to Is _ Sec EvA1 EvB _. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false ============================ public_equiv SG1 GA' GB'
< EqGAGA': apply stmt_not_public_no_public_change to Sec2 _ EvA2. Subgoal 5.2.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false E : Sl1 = public ============================ false
< case E. Subgoal 5.2.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false ============================ false
< apply join_public to Sec1. Subgoal 5.2.2: Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E public Sec1 : join public public public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : public = public -> false ============================ false
< backchain NEq. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ public_equiv SG1 GA' GB'
< EqGBGB': apply stmt_not_public_no_public_change to Sec3 _ EvB1. Subgoal 5.2.3: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ Sl1 = public -> false
< intros E. Subgoal 5.2.3: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' E : Sl1 = public ============================ false
< case E. Subgoal 5.2.3: Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ false
< apply join_public to Sec1. Subgoal 5.2.3: Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E public Sec1 : join public public public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : public = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ false
< backchain NEq. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' ============================ public_equiv SG1 GA' GB'
< EqGAGB': apply public_equiv_trans to Rel EqGBGB'. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' ============================ public_equiv SG1 GA' GB'
< EqGA'GA: apply public_equiv_symm to EqGAGA'. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' EqGA'GA : public_equiv SG1 GA' GA ============================ public_equiv SG1 GA' GB'
< EqGA'GB: apply public_equiv_trans to EqGA'GA Rel. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' EqGA'GA : public_equiv SG1 GA' GA EqGA'GB : public_equiv SG1 GA' GB ============================ public_equiv SG1 GA' GB'
< apply public_equiv_trans to EqGA'GB EqGBGB'. Subgoal 5.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' EqGA'GA : public_equiv SG1 GA' GA EqGA'GB : public_equiv SG1 GA' GB H1 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 6: Variables: SG SL SG1 GA GA' GB GB' S2 S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (ifte E S1 S2) Sec : secure SG SL (ifte E S1 S2) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvB : eval_s GB (ifte E S1 S2) GB' EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * ============================ public_equiv SG1 GA' GB'
< Is: case Is. Subgoal 6: Variables: SG SL SG1 GA GA' GB GB' S2 S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Sec : secure SG SL (ifte E S1 S2) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvB : eval_s GB (ifte E S1 S2) GB' EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 ============================ public_equiv SG1 GA' GB'
< Sec: case Sec. Subgoal 6: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvB : eval_s GB (ifte E S1 S2) GB' EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 ============================ public_equiv SG1 GA' GB'
< EvB: case EvB. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' ============================ public_equiv SG1 GA' GB'
< NEq: assert L = public -> false. Subgoal 6.1.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' ============================ L = public -> false
< intros E. Subgoal 6.1.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' E : L = public ============================ false
< case E. Subgoal 6.1.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E public Sec1 : join public SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' ============================ false
< apply level_not_public to Is _ _ EvA1 EvB _. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false ============================ public_equiv SG1 GA' GB'
< EqGAGA': apply stmt_not_public_no_public_change to Sec3 _ EvA2. Subgoal 6.1.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false ============================ Sl1 = public -> false
< intros E. Subgoal 6.1.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false E : Sl1 = public ============================ false
< case E. Subgoal 6.1.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false ============================ false
< apply join_public to Sec1. Subgoal 6.1.2: Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E public Sec1 : join public public public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : public = public -> false ============================ false
< backchain NEq. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ public_equiv SG1 GA' GB'
< EqGBGB': apply stmt_not_public_no_public_change to Sec2 _ EvB1. Subgoal 6.1.3: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ Sl1 = public -> false
< intros E. Subgoal 6.1.3: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' E : Sl1 = public ============================ false
< case E. Subgoal 6.1.3: Variables: SL SG1 GA GA' GB GB' S2 S1 E L SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ false
< apply join_public to Sec1. Subgoal 6.1.3: Variables: SG1 GA GA' GB GB' S2 S1 E SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E public Sec1 : join public public public Sec2 : secure SG1 public S1 SG2 Sec3 : secure SG1 public S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : public = public -> false EqGAGA' : public_equiv SG1 GA GA' ============================ false
< backchain NEq. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' ============================ public_equiv SG1 GA' GB'
< EqGAGB': apply public_equiv_trans to Rel EqGBGB'. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' ============================ public_equiv SG1 GA' GB'
< EqGA'GA: apply public_equiv_symm to EqGAGA'. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' EqGA'GA : public_equiv SG1 GA' GA ============================ public_equiv SG1 GA' GB'
< EqGA'GB: apply public_equiv_trans to EqGA'GA Rel. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' EqGA'GA : public_equiv SG1 GA' GA EqGA'GB : public_equiv SG1 GA' GB ============================ public_equiv SG1 GA' GB'
< apply public_equiv_trans to EqGA'GB EqGBGB'. Subgoal 6.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 GB' NEq : L = public -> false EqGAGA' : public_equiv SG1 GA GA' EqGBGB' : public_equiv SG1 GB GB' EqGAGB' : public_equiv SG1 GA GB' EqGA'GA : public_equiv SG1 GA' GA EqGA'GB : public_equiv SG1 GA' GB H1 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 6.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' ============================ public_equiv SG1 GA' GB'
< EqGA'GB': apply IH to _ _ _ EvA2 EvB1. Subgoal 6.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' EqGA'GB' : public_equiv SG3 GA' GB' ============================ public_equiv SG1 GA' GB'
< LkpEq: assert forall X, lookup SG1 X public -> lookup SG3 X public. Subgoal 6.2.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' EqGA'GB' : public_equiv SG3 GA' GB' ============================ forall X, lookup SG1 X public -> lookup SG3 X public
< intros Lkp. Subgoal 6.2.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' EqGA'GB' : public_equiv SG3 GA' GB' Lkp : lookup SG1 X public ============================ lookup SG3 X public
< apply stmt_public_branch to Sec3 Lkp. Subgoal 6.2.1: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 X IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' EqGA'GB' : public_equiv SG3 GA' GB' Lkp : lookup SG1 X public H1 : lookup SG3 X public ============================ lookup SG3 X public
< search. Subgoal 6.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' EqGA'GB' : public_equiv SG3 GA' GB' LkpEq : forall X, lookup SG1 X public -> lookup SG3 X public ============================ public_equiv SG1 GA' GB'
< apply public_equiv_swap to LkpEq EqGA'GB'. Subgoal 6.2: Variables: SL SG1 GA GA' GB GB' S2 S1 E L Sl1 SG2 SG3 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG1 GA GB EvA : eval_s GA (ifte E S1 S2) GA' @ EvA1 : eval_e GA E falseE EvA2 : eval_s GA S2 GA' * Is : is_e E Is1 : is_s S1 Is2 : is_s S2 Sec : level SG1 E L Sec1 : join L SL Sl1 Sec2 : secure SG1 Sl1 S1 SG2 Sec3 : secure SG1 Sl1 S2 SG3 EvB : eval_e GB E falseE EvB1 : eval_s GB S2 GB' EqGA'GB' : public_equiv SG3 GA' GB' LkpEq : forall X, lookup SG1 X public -> lookup SG3 X public H1 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 7: Variables: SG SL SG1 GA GA' GB GB' G1 S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG SL (while E S1) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (while E S1) GA' @ EvB : eval_s GB (while E S1) GB' EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * ============================ public_equiv SG1 GA' GB'
< Is: case Is (keep). Subgoal 7: Variables: SG SL SG1 GA GA' GB GB' G1 S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG SL (while E S1) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (while E S1) GA' @ EvB : eval_s GB (while E S1) GB' EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 ============================ public_equiv SG1 GA' GB'
< Sec: case Sec (keep). Subgoal 7: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvB : eval_s GB (while E S1) GB' EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 ============================ public_equiv SG1 GA' GB'
< EvB: case EvB. Subgoal 7.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' ============================ public_equiv SG1 GA' GB'
< EqG1G3: apply IH to _ _ _ EvA2 EvB1. Subgoal 7.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' EqG1G3 : public_equiv SG2 G1 G2 ============================ public_equiv SG1 GA' GB'
< LEq: assert forall X, lookup SG1 X public -> lookup SG2 X public. Subgoal 7.1.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' EqG1G3 : public_equiv SG2 G1 G2 ============================ forall X, lookup SG1 X public -> lookup SG2 X public
< intros Lkp. Subgoal 7.1.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 X IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' EqG1G3 : public_equiv SG2 G1 G2 Lkp : lookup SG1 X public ============================ lookup SG2 X public
< apply stmt_public_branch to Sec3 Lkp. Subgoal 7.1.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 X IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' EqG1G3 : public_equiv SG2 G1 G2 Lkp : lookup SG1 X public H1 : lookup SG2 X public ============================ lookup SG2 X public
< search. Subgoal 7.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' EqG1G3 : public_equiv SG2 G1 G2 LEq : forall X, lookup SG1 X public -> lookup SG2 X public ============================ public_equiv SG1 GA' GB'
< apply public_equiv_swap to LEq EqG1G3. Subgoal 7.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' EqG1G3 : public_equiv SG2 G1 G2 LEq : forall X, lookup SG1 X public -> lookup SG2 X public H1 : public_equiv SG1 G1 G2 ============================ public_equiv SG1 GA' GB'
< EqG1GA': apply IH to Is Sec _ EvA3 EvB2. Subgoal 7.1: Variables: SL SG1 GA GA' GB GB' G1 S1 E L Sl1 SG2 G2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G2 EvB2 : eval_s G2 (while E S1) GB' EqG1G3 : public_equiv SG2 G1 G2 LEq : forall X, lookup SG1 X public -> lookup SG2 X public H1 : public_equiv SG1 G1 G2 EqG1GA' : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 7.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE ============================ public_equiv SG1 GA' GB'
< SNEq: assert L = public -> false. Subgoal 7.2.1: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE ============================ L = public -> false
< intros E. Subgoal 7.2.1: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE E : L = public ============================ false
< case E. Subgoal 7.2.1: Variables: SL SG1 GA GA' GB' G1 S1 E Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E public Sec2 : join public SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE ============================ false
< apply level_not_public to Is1 _ _ EvA1 EvB _. Subgoal 7.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false ============================ public_equiv SG1 GA' GB'
< EqGAG1: apply stmt_not_public_no_public_change to Sec3 _ EvA2. Subgoal 7.2.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false ============================ Sl1 = public -> false
< intros E. Subgoal 7.2.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false E : Sl1 = public ============================ false
< case E. Subgoal 7.2.2: Variables: SL SG1 GA GA' GB' G1 S1 E L SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL public Sec3 : secure SG1 public S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false ============================ false
< apply join_public to Sec2. Subgoal 7.2.2: Variables: SG1 GA GA' GB' G1 S1 E SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 public (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E public Sec2 : join public public public Sec3 : secure SG1 public S1 SG2 EvB : eval_e GB' E falseE SNEq : public = public -> false ============================ false
< backchain SNEq. Subgoal 7.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false EqGAG1 : public_equiv SG1 GA G1 ============================ public_equiv SG1 GA' GB'
< EqG1GA': apply while_no_public_change to Sec Sec1 _ EvA3. Subgoal 7.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false EqGAG1 : public_equiv SG1 GA G1 EqG1GA' : public_equiv SG1 G1 GA' ============================ public_equiv SG1 GA' GB'
< EqGAGA': apply public_equiv_trans to EqGAG1 EqG1GA'. Subgoal 7.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false EqGAG1 : public_equiv SG1 GA G1 EqG1GA' : public_equiv SG1 G1 GA' EqGAGA' : public_equiv SG1 GA GA' ============================ public_equiv SG1 GA' GB'
< EqGA'GA: apply public_equiv_symm to EqGAGA'. Subgoal 7.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false EqGAG1 : public_equiv SG1 GA G1 EqG1GA' : public_equiv SG1 G1 GA' EqGAGA' : public_equiv SG1 GA GA' EqGA'GA : public_equiv SG1 GA' GA ============================ public_equiv SG1 GA' GB'
< apply public_equiv_trans to EqGA'GA Rel. Subgoal 7.2: Variables: SL SG1 GA GA' GB' G1 S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA GB' EvA : eval_s GA (while E S1) GA' @ EvA1 : eval_e GA E trueE EvA2 : eval_s GA S1 G1 * EvA3 : eval_s G1 (while E S1) GA' * Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE SNEq : L = public -> false EqGAG1 : public_equiv SG1 GA G1 EqG1GA' : public_equiv SG1 G1 GA' EqGAGA' : public_equiv SG1 GA GA' EqGA'GA : public_equiv SG1 GA' GA H1 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 8: Variables: SG SL SG1 GA' GB GB' S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG SL (while E S1) SG1 Rel : public_equiv SG GA' GB EvA : eval_s GA' (while E S1) GA' @ EvB : eval_s GB (while E S1) GB' EvA1 : eval_e GA' E falseE ============================ public_equiv SG1 GA' GB'
< Is: case Is (keep). Subgoal 8: Variables: SG SL SG1 GA' GB GB' S1 E IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG SL (while E S1) SG1 Rel : public_equiv SG GA' GB EvA : eval_s GA' (while E S1) GA' @ EvB : eval_s GB (while E S1) GB' EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 ============================ public_equiv SG1 GA' GB'
< Sec: case Sec (keep). Subgoal 8: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvB : eval_s GB (while E S1) GB' EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 ============================ public_equiv SG1 GA' GB'
< EvB: case EvB. Subgoal 8.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' ============================ public_equiv SG1 GA' GB'
< SNEq: assert L = public -> false. Subgoal 8.1.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' ============================ L = public -> false
< intros E. Subgoal 8.1.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' E : L = public ============================ false
< case E. Subgoal 8.1.1: Variables: SL SG1 GA' GB GB' S1 E Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E public Sec2 : join public SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' ============================ false
< apply level_not_public to Is1 _ _ EvA1 EvB _. Subgoal 8.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false ============================ public_equiv SG1 GA' GB'
< EqGBG2: apply stmt_not_public_no_public_change to Sec3 _ EvB1. Subgoal 8.1.2: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false ============================ Sl1 = public -> false
< intros E. Subgoal 8.1.2: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false E : Sl1 = public ============================ false
< case E. Subgoal 8.1.2: Variables: SL SG1 GA' GB GB' S1 E L SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL public Sec3 : secure SG1 public S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false ============================ false
< apply join_public to Sec2. Subgoal 8.1.2: Variables: SG1 GA' GB GB' S1 E SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 public (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E public Sec2 : join public public public Sec3 : secure SG1 public S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : public = public -> false ============================ false
< backchain SNEq. Subgoal 8.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false EqGBG2 : public_equiv SG1 GB G1 ============================ public_equiv SG1 GA' GB'
< EqGA'G2: apply public_equiv_trans to Rel EqGBG2. Subgoal 8.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false EqGBG2 : public_equiv SG1 GB G1 EqGA'G2 : public_equiv SG1 GA' G1 ============================ public_equiv SG1 GA' GB'
< EqG2GB': apply while_no_public_change to Sec Sec1 _ EvB2. Subgoal 8.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false EqGBG2 : public_equiv SG1 GB G1 EqGA'G2 : public_equiv SG1 GA' G1 EqG2GB' : public_equiv SG1 G1 GB' ============================ public_equiv SG1 GA' GB'
< apply public_equiv_trans to EqGA'G2 EqG2GB'. Subgoal 8.1: Variables: SL SG1 GA' GB GB' S1 E L Sl1 SG2 G1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB E trueE EvB1 : eval_s GB S1 G1 EvB2 : eval_s G1 (while E S1) GB' SNEq : L = public -> false EqGBG2 : public_equiv SG1 GB G1 EqGA'G2 : public_equiv SG1 GA' G1 EqG2GB' : public_equiv SG1 G1 GB' H1 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Subgoal 8.2: Variables: SL SG1 GA' GB' S1 E L Sl1 SG2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (while E S1) Sec : secure SG1 SL (while E S1) SG1 Rel : public_equiv SG1 GA' GB' EvA : eval_s GA' (while E S1) GA' @ EvA1 : eval_e GA' E falseE Is1 : is_e E Is2 : is_s S1 Sec1 : level SG1 E L Sec2 : join L SL Sl1 Sec3 : secure SG1 Sl1 S1 SG2 EvB : eval_e GB' E falseE ============================ public_equiv SG1 GA' GB'
< search. Subgoal 9: Variables: SG SL SG1 GA GB GB' V N E Sl Ty IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (secdecl N Ty Sl E) Sec : secure SG SL (secdecl N Ty Sl E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty Sl E) ((N, V)::GA) @ EvB : eval_s GB (secdecl N Ty Sl E) GB' EvA1 : eval_e GA E V ============================ public_equiv SG1 ((N, V)::GA) GB'
< EvB: case EvB. Subgoal 9: Variables: SG SL SG1 GA GB V N E Sl Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s (secdecl N Ty Sl E) Sec : secure SG SL (secdecl N Ty Sl E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty Sl E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 ============================ public_equiv SG1 ((N, V)::GA) ((N, V1)::GB)
< Is: case Is. Subgoal 9: Variables: SG SL SG1 GA GB V N E Sl Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Sec : secure SG SL (secdecl N Ty Sl E) SG1 Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty Sl E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl Sl Is3 : is_e E ============================ public_equiv SG1 ((N, V)::GA) ((N, V1)::GB)
< Sec: case Sec. Subgoal 9.1: Variables: SG SL GA GB V N E Ty V1 L IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N ============================ public_equiv ((N, private)::SG) ((N, V)::GA) ((N, V1)::GB)
< unfold . Subgoal 9.1.1: Variables: SG SL GA GB V N E Ty V1 L IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N ============================ forall X V2, lookup ((N, private)::SG) X public -> lookup ((N, V)::GA) X V2 -> lookup ((N, V1)::GB) X V2
< intros LkpSec Lkp. Subgoal 9.1.1: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup ((N, private)::SG) X public Lkp : lookup ((N, V)::GA) X V2 ============================ lookup ((N, V1)::GB) X V2
< LkpSec: case LkpSec. Subgoal 9.1.1: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N Lkp : lookup ((N, V)::GA) X V2 LkpSec : N = X -> false LkpSec1 : lookup SG X public ============================ lookup ((N, V1)::GB) X V2
< Lkp: case Lkp. Subgoal 9.1.1.1: Variables: SG SL GA GB E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty private E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V1 Is : is_string X Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG X LkpSec : X = X -> false LkpSec1 : lookup SG X public ============================ lookup ((X, V1)::GB) X V2
< apply LkpSec to _. Subgoal 9.1.1.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GA X V2 ============================ lookup ((N, V1)::GB) X V2
< Rel: case Rel. Subgoal 9.1.1.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GA X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::GB) X V2
< apply Rel to LkpSec1 Lkp1. Subgoal 9.1.1.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GA X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V H1 : lookup GB X V2 ============================ lookup ((N, V1)::GB) X V2
< search. Subgoal 9.1.2: Variables: SG SL GA GB V N E Ty V1 L IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N ============================ forall X V2, lookup ((N, private)::SG) X public -> lookup ((N, V1)::GB) X V2 -> lookup ((N, V)::GA) X V2
< intros LkpSec Lkp. Subgoal 9.1.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : lookup ((N, private)::SG) X public Lkp : lookup ((N, V1)::GB) X V2 ============================ lookup ((N, V)::GA) X V2
< LkpSec: case LkpSec. Subgoal 9.1.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N Lkp : lookup ((N, V1)::GB) X V2 LkpSec : N = X -> false LkpSec1 : lookup SG X public ============================ lookup ((N, V)::GA) X V2
< Lkp: case Lkp. Subgoal 9.1.2.1: Variables: SG SL GA GB V E Ty L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty private E) ((X, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V2 Is : is_string X Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG X LkpSec : X = X -> false LkpSec1 : lookup SG X public ============================ lookup ((X, V)::GA) X V2
< apply LkpSec to _. Subgoal 9.1.2.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GB X V2 ============================ lookup ((N, V)::GA) X V2
< Rel: case Rel. Subgoal 9.1.2.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GB X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V)::GA) X V2
< apply Rel1 to LkpSec1 Lkp1. Subgoal 9.1.2.2: Variables: SG SL GA GB V N E Ty V1 L X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty private E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl private Is3 : is_e E Sec : level SG E L Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GB X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V H1 : lookup GA X V2 ============================ lookup ((N, V)::GA) X V2
< search. Subgoal 9.2: Variables: SG GA GB V N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V)::GA) @ EvA1 : eval_e GA E V EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N ============================ public_equiv ((N, public)::SG) ((N, V)::GA) ((N, V1)::GB)
< apply level_secure to _ Sec Rel EvA1 EvB. Subgoal 9.2: Variables: SG GA GB N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N ============================ public_equiv ((N, public)::SG) ((N, V1)::GA) ((N, V1)::GB)
< unfold . Subgoal 9.2.1: Variables: SG GA GB N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N ============================ forall X V, lookup ((N, public)::SG) X public -> lookup ((N, V1)::GA) X V -> lookup ((N, V1)::GB) X V
< intros LkpSec Lkp. Subgoal 9.2.1: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : lookup ((N, public)::SG) X public Lkp : lookup ((N, V1)::GA) X V2 ============================ lookup ((N, V1)::GB) X V2
< LkpSec: case LkpSec. Subgoal 9.2.1.1: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X Lkp : lookup ((X, V1)::GA) X V2 ============================ lookup ((X, V1)::GB) X V2
< Lkp: case Lkp. Subgoal 9.2.1.1.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X ============================ lookup ((X, V2)::GB) X V2
< search. Subgoal 9.2.1.1.2: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X Lkp : X = X -> false Lkp1 : lookup GA X V2 ============================ lookup ((X, V1)::GB) X V2
< apply Lkp to _. Subgoal 9.2.1.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N Lkp : lookup ((N, V1)::GA) X V2 LkpSec : N = X -> false LkpSec1 : lookup SG X public ============================ lookup ((N, V1)::GB) X V2
< Lkp: case Lkp. Subgoal 9.2.1.2.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X LkpSec : X = X -> false LkpSec1 : lookup SG X public ============================ lookup ((X, V2)::GB) X V2
< apply LkpSec to _. Subgoal 9.2.1.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GA X V2 ============================ lookup ((N, V1)::GB) X V2
< Rel: case Rel. Subgoal 9.2.1.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GA X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::GB) X V2
< apply Rel to LkpSec1 Lkp1. Subgoal 9.2.1.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GA X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V H1 : lookup GB X V2 ============================ lookup ((N, V1)::GB) X V2
< search. Subgoal 9.2.2: Variables: SG GA GB N E Ty V1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N ============================ forall X V, lookup ((N, public)::SG) X public -> lookup ((N, V1)::GB) X V -> lookup ((N, V1)::GA) X V
< intros LkpSec Lkp. Subgoal 9.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : lookup ((N, public)::SG) X public Lkp : lookup ((N, V1)::GB) X V2 ============================ lookup ((N, V1)::GA) X V2
< LkpSec: case LkpSec. Subgoal 9.2.2.1: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X Lkp : lookup ((X, V1)::GB) X V2 ============================ lookup ((X, V1)::GA) X V2
< Lkp: case Lkp. Subgoal 9.2.2.1.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X ============================ lookup ((X, V2)::GA) X V2
< search. Subgoal 9.2.2.1.2: Variables: SG GA GB E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X Lkp : X = X -> false Lkp1 : lookup GB X V2 ============================ lookup ((X, V1)::GA) X V2
< apply Lkp to _. Subgoal 9.2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N Lkp : lookup ((N, V1)::GB) X V2 LkpSec : N = X -> false LkpSec1 : lookup SG X public ============================ lookup ((N, V1)::GA) X V2
< Lkp: case Lkp. Subgoal 9.2.2.2.1: Variables: SG GA GB E Ty X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl X Ty public E) ((X, V2)::GA) @ EvA1 : eval_e GA E V2 EvB : eval_e GB E V2 Is : is_string X Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG X LkpSec : X = X -> false LkpSec1 : lookup SG X public ============================ lookup ((X, V2)::GA) X V2
< apply LkpSec to _. Subgoal 9.2.2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Rel : public_equiv SG GA GB EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GB X V2 ============================ lookup ((N, V1)::GA) X V2
< Rel: case Rel. Subgoal 9.2.2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GB X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V ============================ lookup ((N, V1)::GA) X V2
< apply Rel1 to LkpSec1 Lkp1. Subgoal 9.2.2.2.2: Variables: SG GA GB N E Ty V1 X V2 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' EvA : eval_s GA (secdecl N Ty public E) ((N, V1)::GA) @ EvA1 : eval_e GA E V1 EvB : eval_e GB E V1 Is : is_string N Is1 : is_ty Ty Is2 : is_sl public Is3 : is_e E Sec : level SG E public Sec1 : no_lookup SG N LkpSec : N = X -> false LkpSec1 : lookup SG X public Lkp : N = X -> false Lkp1 : lookup GB X V2 Rel : forall X V, lookup SG X public -> lookup GA X V -> lookup GB X V Rel1 : forall X V, lookup SG X public -> lookup GB X V -> lookup GA X V H1 : lookup GA X V2 ============================ lookup ((N, V1)::GA) X V2
< search. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' T IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Sec : secure SG SL <unknown K eval_s> SG1 Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> T EvA2 : eval_s GA T GA' * ============================ public_equiv SG1 GA' GB'
< Sec: case Sec. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' T S1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> T EvA2 : eval_s GA T GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 ============================ public_equiv SG1 GA' GB'
< apply proj_s_unique to EvA1 Sec. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' S1 IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 ============================ public_equiv SG1 GA' GB'
< EvBProj: apply proj_s_eval to EvA1 EvB. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' ============================ public_equiv SG1 GA' GB'
< IsCT: apply proj_s_is to Sec Is. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 ============================ public_equiv SG1 GA' GB'
< Equiv: apply IH to _ Sec1 Rel EvA2 EvBProj. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' ============================ public_equiv SG1 GA' GB'
< LkpGB'G': assert forall X V, lookup GB' X V -> lookup G' X V. Subgoal 10.1: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' ============================ forall X V, lookup GB' X V -> lookup G' X V
< intros L. Subgoal 10.1: Variables: SG SL SG1 GA GA' GB GB' S1 G' X V IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' L : lookup GB' X V ============================ lookup G' X V
< apply proj_s_eval_results to EvA1 EvB EvBProj L. Subgoal 10.1: Variables: SG SL SG1 GA GA' GB GB' S1 G' X V IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' L : lookup GB' X V H1 : lookup G' X V ============================ lookup G' X V
< search. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V ============================ public_equiv SG1 GA' GB'
< EqG'GB': assert public_equiv SG1 G' GB'. Subgoal 10.2: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V ============================ public_equiv SG1 G' GB'
< unfold . Subgoal 10.2.1: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V ============================ forall X V, lookup SG1 X public -> lookup G' X V -> lookup GB' X V
< intros LkpSec LkpG'. Subgoal 10.2.1: Variables: SG SL SG1 GA GA' GB GB' S1 G' X V IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V LkpSec : lookup SG1 X public LkpG' : lookup G' X V ============================ lookup GB' X V
< apply proj_s_eval_results_back to Sec EvB EvBProj LkpG'. Subgoal 10.2.1: Variables: SG SL SG1 GA GA' GB GB' S1 G' X V IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V LkpSec : lookup SG1 X public LkpG' : lookup G' X V H1 : lookup GB' X V ============================ lookup GB' X V
< search. Subgoal 10.2.2: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V ============================ forall X V, lookup SG1 X public -> lookup GB' X V -> lookup G' X V
< intros LkpSec LkpGB'. Subgoal 10.2.2: Variables: SG SL SG1 GA GA' GB GB' S1 G' X V IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V LkpSec : lookup SG1 X public LkpGB' : lookup GB' X V ============================ lookup G' X V
< backchain LkpGB'G'. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V EqG'GB' : public_equiv SG1 G' GB' ============================ public_equiv SG1 GA' GB'
< apply public_equiv_trans to Equiv EqG'GB'. Subgoal 10: Variables: SG SL SG1 GA GA' GB GB' S1 G' IH : forall S SG SL SG1 GA GA' GB GB', is_s S -> secure SG SL S SG1 -> public_equiv SG GA GB -> eval_s GA S GA' * -> eval_s GB S GB' -> public_equiv SG1 GA' GB' Is : is_s <unknown K eval_s> Rel : public_equiv SG GA GB EvA : eval_s GA <unknown K eval_s> GA' @ EvB : eval_s GB <unknown K eval_s> GB' EvA1 : |{s}- <unknown K eval_s> ~~> S1 EvA2 : eval_s GA S1 GA' * Sec : |{s}- <unknown K eval_s> ~~> S1 Sec1 : secure SG SL S1 SG1 EvBProj : eval_s GB S1 G' IsCT : is_s S1 Equiv : public_equiv SG1 GA' G' LkpGB'G' : forall X V, lookup GB' X V -> lookup G' X V EqG'GB' : public_equiv SG1 G' GB' H1 : public_equiv SG1 GA' GB' ============================ public_equiv SG1 GA' GB'
< search. Proof completed.