[STATEMENT]
lemma Tgs_authenticates_A:
  "\<lbrakk>  Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (spies evs);
      Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>
           \<in> parts (spies evs);
      Key authK \<notin> analz (spies evs); A \<notin> bad; evs \<in> kerbIV_gets \<rbrakk>
 \<Longrightarrow> \<exists> B. Says A Tgs \<lbrace>
          Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>,
          Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B \<rbrace> \<in> set evs"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<lbrakk>Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs); Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> \<in> parts (knows Spy evs); Key authK \<notin> analz (knows Spy evs); A \<notin> bad; evs \<in> kerbIV_gets\<rbrakk> \<Longrightarrow> \<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs
[PROOF STEP]
apply (drule authTicket_authentic, assumption, rotate_tac 4)
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<lbrakk>Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs; Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs); Key authK \<notin> analz (knows Spy evs); A \<notin> bad; evs \<in> kerbIV_gets\<rbrakk> \<Longrightarrow> \<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs
[PROOF STEP]
apply (erule rev_mp, erule rev_mp, erule rev_mp)
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<lbrakk>A \<notin> bad; evs \<in> kerbIV_gets\<rbrakk> \<Longrightarrow> Key authK \<notin> analz (knows Spy evs) \<longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs)
[PROOF STEP]
apply (erule kerbIV_gets.induct, analz_mono_contra)
[PROOF STATE]
proof (prove)
goal (11 subgoals):
 1. A \<notin> bad \<Longrightarrow> Key authK \<notin> analz (knows Spy []) \<longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy []) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set [] \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set [])
 2. \<And>evsf X B. \<lbrakk>A \<notin> bad; evsf \<in> kerbIV_gets; X \<in> synth (analz (knows Spy evsf)); Key authK \<notin> analz (knows Spy evsf); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsf) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsf \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsf)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Spy B X # evsf)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Spy B X # evsf) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Spy B X # evsf))
 3. \<And>evsr Aa B X. \<lbrakk>A \<notin> bad; evsr \<in> kerbIV_gets; Says Aa B X \<in> set evsr; Key authK \<notin> analz (knows Spy evsr); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsr) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsr \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsr)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Gets B X # evsr)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Gets B X # evsr) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Gets B X # evsr))
 4. \<And>evs1 Aa. \<lbrakk>A \<notin> bad; evs1 \<in> kerbIV_gets; Key authK \<notin> analz (knows Spy evs1); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs1) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs1 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs1)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1) \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1))
 5. \<And>evs2 authKa Aa T1. \<lbrakk>A \<notin> bad; evs2 \<in> kerbIV_gets; Key authKa \<notin> used evs2; authKa \<in> symKeys; Gets Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs2; Key authK \<notin> analz (knows Spy evs2); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs2 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2) \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2))
 6. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3))
 7. \<And>evs4 servK B authKa Aa Taa T2a. \<lbrakk>A \<notin> bad; evs4 \<in> kerbIV_gets; Key servK \<notin> used evs4; servK \<in> symKeys; B \<noteq> Tgs; authKa \<in> symKeys; Gets Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Taa\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs4; \<not> expiredAK Taa evs4; \<not> expiredA T2a evs4; servKlife + CT evs4 \<le> authKlife + Taa; Key authK \<notin> analz (knows Spy evs4); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs4) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs4 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs4)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4))
 8. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5))
 9. \<And>evs6 B Aa servK Ts T3. \<lbrakk>A \<notin> bad; evs6 \<in> kerbIV_gets; Gets B \<lbrace>Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number Ts\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number T3\<rbrace>\<rbrace> \<in> set evs6; \<not> expiredSK Ts evs6; \<not> expiredA T3 evs6; Key authK \<notin> analz (knows Spy evs6); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs6) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs6 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs6)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says B Aa (Crypt servK (Number T3)) # evs6)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says B Aa (Crypt servK (Number T3)) # evs6) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says B Aa (Crypt servK (Number T3)) # evs6))
 10. \<And>evsO1 Aa authKa Taa authTicket. \<lbrakk>A \<notin> bad; evsO1 \<in> kerbIV_gets; Aa \<noteq> Spy; Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evsO1; expiredAK Taa evsO1; Key authK \<notin> analz (knows Spy evsO1); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsO1) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsO1 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsO1)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa Spy \<lbrace>Agent Aa, Agent Tgs, Number Taa, Key authKa\<rbrace> # evsO1)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa Spy \<lbrace>Agent Aa, Agent Tgs, Number Taa, Key authKa\<rbrace> # evsO1) \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set (Says Aa Spy \<lbrace>Agent Aa, Agent Tgs, Number Taa, Key authKa\<rbrace> # evsO1))
A total of 11 subgoals...
[PROOF STEP]
apply (frule_tac [6] Gets_ticket_parts)
[PROOF STATE]
proof (prove)
goal (12 subgoals):
 1. A \<notin> bad \<Longrightarrow> Key authK \<notin> analz (knows Spy []) \<longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy []) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set [] \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set [])
 2. \<And>evsf X B. \<lbrakk>A \<notin> bad; evsf \<in> kerbIV_gets; X \<in> synth (analz (knows Spy evsf)); Key authK \<notin> analz (knows Spy evsf); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsf) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsf \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsf)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Spy B X # evsf)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Spy B X # evsf) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Spy B X # evsf))
 3. \<And>evsr Aa B X. \<lbrakk>A \<notin> bad; evsr \<in> kerbIV_gets; Says Aa B X \<in> set evsr; Key authK \<notin> analz (knows Spy evsr); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsr) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsr \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsr)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Gets B X # evsr)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Gets B X # evsr) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Gets B X # evsr))
 4. \<And>evs1 Aa. \<lbrakk>A \<notin> bad; evs1 \<in> kerbIV_gets; Key authK \<notin> analz (knows Spy evs1); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs1) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs1 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs1)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1) \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1))
 5. \<And>evs2 authKa Aa T1. \<lbrakk>A \<notin> bad; evs2 \<in> kerbIV_gets; Key authKa \<notin> used evs2; authKa \<in> symKeys; Gets Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs2; Key authK \<notin> analz (knows Spy evs2); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs2 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2) \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2))
 6. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3)\<rbrakk> \<Longrightarrow> evs3 \<in> kerbIV_gets
 7. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3))
 8. \<And>evs4 servK B authKa Aa Taa T2a. \<lbrakk>A \<notin> bad; evs4 \<in> kerbIV_gets; Key servK \<notin> used evs4; servK \<in> symKeys; B \<noteq> Tgs; authKa \<in> symKeys; Gets Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Taa\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs4; \<not> expiredAK Taa evs4; \<not> expiredA T2a evs4; servKlife + CT evs4 \<le> authKlife + Taa; Key authK \<notin> analz (knows Spy evs4); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs4) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs4 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs4)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4))
 9. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5))
 10. \<And>evs6 B Aa servK Ts T3. \<lbrakk>A \<notin> bad; evs6 \<in> kerbIV_gets; Gets B \<lbrace>Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number Ts\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number T3\<rbrace>\<rbrace> \<in> set evs6; \<not> expiredSK Ts evs6; \<not> expiredA T3 evs6; Key authK \<notin> analz (knows Spy evs6); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs6) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs6 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs6)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says B Aa (Crypt servK (Number T3)) # evs6)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says B Aa (Crypt servK (Number T3)) # evs6) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says B Aa (Crypt servK (Number T3)) # evs6))
A total of 12 subgoals...
[PROOF STEP]
apply (frule_tac [9] Gets_ticket_parts)
[PROOF STATE]
proof (prove)
goal (13 subgoals):
 1. A \<notin> bad \<Longrightarrow> Key authK \<notin> analz (knows Spy []) \<longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy []) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set [] \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set [])
 2. \<And>evsf X B. \<lbrakk>A \<notin> bad; evsf \<in> kerbIV_gets; X \<in> synth (analz (knows Spy evsf)); Key authK \<notin> analz (knows Spy evsf); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsf) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsf \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsf)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Spy B X # evsf)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Spy B X # evsf) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Spy B X # evsf))
 3. \<And>evsr Aa B X. \<lbrakk>A \<notin> bad; evsr \<in> kerbIV_gets; Says Aa B X \<in> set evsr; Key authK \<notin> analz (knows Spy evsr); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsr) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsr \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsr)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Gets B X # evsr)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Gets B X # evsr) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Gets B X # evsr))
 4. \<And>evs1 Aa. \<lbrakk>A \<notin> bad; evs1 \<in> kerbIV_gets; Key authK \<notin> analz (knows Spy evs1); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs1) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs1 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs1)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1) \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set (Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number (CT evs1)\<rbrace> # evs1))
 5. \<And>evs2 authKa Aa T1. \<lbrakk>A \<notin> bad; evs2 \<in> kerbIV_gets; Key authKa \<notin> used evs2; authKa \<in> symKeys; Gets Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs2; Key authK \<notin> analz (knows Spy evs2); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs2 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2) \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set (Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number (CT evs2), Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>\<rbrace>) # evs2))
 6. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3)\<rbrakk> \<Longrightarrow> evs3 \<in> kerbIV_gets
 7. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent B\<rbrace> # evs3))
 8. \<And>evs4 servK B authKa Aa Taa T2a. \<lbrakk>A \<notin> bad; evs4 \<in> kerbIV_gets; Key servK \<notin> used evs4; servK \<in> symKeys; B \<noteq> Tgs; authKa \<in> symKeys; Gets Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Taa\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs4; \<not> expiredAK Taa evs4; \<not> expiredA T2a evs4; servKlife + CT evs4 \<le> authKlife + Taa; Key authK \<notin> analz (knows Spy evs4); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs4) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs4 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs4)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Tgs Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number (CT evs4), Crypt (shrK B) \<lbrace>Agent Aa, Agent B, Key servK, Number (CT evs4)\<rbrace>\<rbrace>) # evs4))
 9. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5)\<rbrakk> \<Longrightarrow> evs5 \<in> kerbIV_gets
 10. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5) \<longrightarrow> (\<exists>Ba. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set (Says Aa B \<lbrace>servTicket, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>\<rbrace> # evs5))
A total of 13 subgoals...
[PROOF STEP]
apply (simp_all (no_asm_simp) add: all_conj_distrib)
[PROOF STATE]
proof (prove)
goal (4 subgoals):
 1. \<And>evsf X B. \<lbrakk>A \<notin> bad; evsf \<in> kerbIV_gets; X \<in> synth (analz (knows Spy evsf)); Key authK \<notin> analz (knows Spy evsf); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsf) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsf \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsf)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (insert X (knows Spy evsf)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsf \<longrightarrow> (\<exists>Ba. A = Spy \<and> Tgs = B \<and> \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> = X \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evsf)
 2. \<And>evs2 authKa Aa T1. \<lbrakk>A \<notin> bad; evs2 \<in> kerbIV_gets; Key authKa \<notin> used evs2; authKa \<in> symKeys; Gets Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs2; Key authK \<notin> analz (knows Spy evs2); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs2 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<and> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)
 3. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> (authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace> = authTicket \<and> Ba = B \<or> Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent Ba\<rbrace> \<in> set evs3)) \<and> (Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. A = Aa \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = authTicket \<and> authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<and> Ba = B \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evs3))
 4. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
txt\<open>Fake\<close>
[PROOF STATE]
proof (prove)
goal (4 subgoals):
 1. \<And>evsf X B. \<lbrakk>A \<notin> bad; evsf \<in> kerbIV_gets; X \<in> synth (analz (knows Spy evsf)); Key authK \<notin> analz (knows Spy evsf); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evsf) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsf \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evsf)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (insert X (knows Spy evsf)) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evsf \<longrightarrow> (\<exists>Ba. A = Spy \<and> Tgs = B \<and> \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> = X \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evsf)
 2. \<And>evs2 authKa Aa T1. \<lbrakk>A \<notin> bad; evs2 \<in> kerbIV_gets; Key authKa \<notin> used evs2; authKa \<in> symKeys; Gets Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs2; Key authK \<notin> analz (knows Spy evs2); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs2 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<and> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)
 3. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> (authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace> = authTicket \<and> Ba = B \<or> Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent Ba\<rbrace> \<in> set evs3)) \<and> (Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. A = Aa \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = authTicket \<and> authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<and> Ba = B \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evs3))
 4. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
apply blast
[PROOF STATE]
proof (prove)
goal (3 subgoals):
 1. \<And>evs2 authKa Aa T1. \<lbrakk>A \<notin> bad; evs2 \<in> kerbIV_gets; Key authKa \<notin> used evs2; authKa \<in> symKeys; Gets Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs2; Key authK \<notin> analz (knows Spy evs2); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs2 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<and> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)
 2. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> (authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace> = authTicket \<and> Ba = B \<or> Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent Ba\<rbrace> \<in> set evs3)) \<and> (Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. A = Aa \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = authTicket \<and> authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<and> Ba = B \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evs3))
 3. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
txt\<open>K2\<close>
[PROOF STATE]
proof (prove)
goal (3 subgoals):
 1. \<And>evs2 authKa Aa T1. \<lbrakk>A \<notin> bad; evs2 \<in> kerbIV_gets; Key authKa \<notin> used evs2; authKa \<in> symKeys; Gets Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs2; Key authK \<notin> analz (knows Spy evs2); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs2 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)\<rbrakk> \<Longrightarrow> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs2) \<longrightarrow> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<and> A = Aa \<and> authK = authKa \<and> Ta = CT evs2 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number (CT evs2)\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs2)
 2. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> (authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace> = authTicket \<and> Ba = B \<or> Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent Ba\<rbrace> \<in> set evs3)) \<and> (Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. A = Aa \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = authTicket \<and> authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<and> Ba = B \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evs3))
 3. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
apply (force dest!: Crypt_imp_keysFor)
[PROOF STATE]
proof (prove)
goal (2 subgoals):
 1. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> (authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace> = authTicket \<and> Ba = B \<or> Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent Ba\<rbrace> \<in> set evs3)) \<and> (Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. A = Aa \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = authTicket \<and> authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<and> Ba = B \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evs3))
 2. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
txt\<open>K3\<close>
[PROOF STATE]
proof (prove)
goal (2 subgoals):
 1. \<And>evs3 Aa T1 authKa Taa authTicket B. \<lbrakk>A \<notin> bad; evs3 \<in> kerbIV_gets; Says Aa Kas \<lbrace>Agent Aa, Agent Tgs, Number T1\<rbrace> \<in> set evs3; Gets Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs3; valid Taa wrt T1; Key authK \<notin> analz (knows Spy evs3); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs3); authTicket \<in> parts (knows Spy evs3)\<rbrakk> \<Longrightarrow> (authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key authKa, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace> = authTicket \<and> Ba = B \<or> Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key authKa, Number Ta\<rbrace>, Crypt authKa \<lbrace>Agent Aa, Number (CT evs3)\<rbrace>, Agent Ba\<rbrace> \<in> set evs3)) \<and> (Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs3) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs3 \<longrightarrow> (\<exists>Ba. A = Aa \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = authTicket \<and> authK = authKa \<and> A = Aa \<and> T2 = CT evs3 \<and> Ba = B \<or> Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent Ba\<rbrace> \<in> set evs3))
 2. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
apply (blast dest: Key_unique_SesKey)
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
txt\<open>K5\<close>
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
txt\<open>If authKa were compromised, so would be authK\<close>
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
apply (case_tac "Key authKa \<in> analz (spies evs5)")
[PROOF STATE]
proof (prove)
goal (2 subgoals):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5); Key authKa \<in> analz (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
 2. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5); Key authKa \<notin> analz (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
apply (force dest!: Gets_imp_knows_Spy [THEN analz.Inj, THEN analz.Decrypt, THEN analz.Fst])
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5); Key authKa \<notin> analz (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
txt\<open>Besides, since authKa originated with Kas anyway...\<close>
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; servK \<in> symKeys; Says Aa Tgs \<lbrace>authTicket, Crypt authKa \<lbrace>Agent Aa, Number T2a\<rbrace>, Agent B\<rbrace> \<in> set evs5; Gets Aa (Crypt authKa \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5); Key authKa \<notin> analz (knows Spy evs5)\<rbrakk> \<Longrightarrow> authK = servK \<and> A = Aa \<and> T2 = CT evs5 \<longrightarrow> Says Kas Aa (Crypt (shrK Aa) \<lbrace>Key servK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says Aa Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent Aa, Agent Tgs, Key servK, Number Ta\<rbrace>, Crypt servK \<lbrace>Agent Aa, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5)
[PROOF STEP]
apply (clarify, drule K3_imp_K2, assumption, assumption)
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; authK \<in> symKeys; Gets A (Crypt authKa \<lbrace>Key authK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5); Key authKa \<notin> analz (knows Spy evs5); T2 = CT evs5; Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5; \<exists>Ta. Says Kas A (Crypt (shrK A) \<lbrace>Key authKa, Agent Tgs, Number Ta, authTicket\<rbrace>) \<in> set evs5\<rbrakk> \<Longrightarrow> \<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5
[PROOF STEP]
apply (clarify, drule Says_Kas_message_form, assumption)
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket Taa. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; authK \<in> symKeys; Gets A (Crypt authKa \<lbrace>Key authK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5); Key authKa \<notin> analz (knows Spy evs5); T2 = CT evs5; Says Kas A (Crypt (shrK A) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs5; shrK A = shrK A \<and> Tgs = Tgs \<and> authK \<notin> range shrK \<and> authK \<in> authKeys evs5 \<and> authK \<in> symKeys \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrakk> \<Longrightarrow> \<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5
[PROOF STEP]
txt\<open>...it cannot be a shared key*. Therefore \<^term>\<open>servK_authentic\<close> applies.
     Contradition: Tgs used authK as a servkey,
     while Kas used it as an authkey\<close>
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>evs5 authKa servK Aa authTicket T2a B Ts servTicket Taa. \<lbrakk>A \<notin> bad; evs5 \<in> kerbIV_gets; authKa \<in> symKeys; authK \<in> symKeys; Gets A (Crypt authKa \<lbrace>Key authK, Agent B, Number Ts, servTicket\<rbrace>) \<in> set evs5; valid Ts wrt T2a; Key authK \<notin> analz (knows Spy evs5); Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace> \<in> parts (knows Spy evs5) \<longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) \<in> set evs5 \<longrightarrow> (\<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5); servTicket \<in> parts (knows Spy evs5); Key authKa \<notin> analz (knows Spy evs5); T2 = CT evs5; Says Kas A (Crypt (shrK A) \<lbrace>Key authKa, Agent Tgs, Number Taa, authTicket\<rbrace>) \<in> set evs5; shrK A = shrK A \<and> Tgs = Tgs \<and> authK \<notin> range shrK \<and> authK \<in> authKeys evs5 \<and> authK \<in> symKeys \<and> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> = Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrakk> \<Longrightarrow> \<exists>B. Says A Tgs \<lbrace>Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, Crypt authK \<lbrace>Agent A, Number (CT evs5)\<rbrace>, Agent B\<rbrace> \<in> set evs5
[PROOF STEP]
apply (blast dest: servK_authentic Says_Tgs_message_form)
[PROOF STATE]
proof (prove)
goal:
No subgoals!
[PROOF STEP]
done


[STATEMENT]
lemma "LCons x xs = LCons x xs"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. LCons x xs = LCons x xs
[PROOF STEP]
quickcheck[narrowing, expect=no_counterexample]
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. LCons x xs = LCons x xs
[PROOF STEP]
oops


[STATEMENT]
lemma "P (x::'a T2)"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. P x
[PROOF STEP]
refute [expect = genuine]
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. P x
[PROOF STEP]
oops


[STATEMENT]
lemma "\<forall>x. P (x :: nat) \<Longrightarrow> Q (x :: nat)"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<forall>x. P x \<Longrightarrow> Q x
[PROOF STEP]
apply my_spec_guess
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. P x \<Longrightarrow> Q x
[PROOF STEP]
oops


[STATEMENT]
lemma store_tval_disjoint_2_content:
  assumes "store_tval obj off val = obj'"
    and "val \<noteq> Undef"
    and "off + |memval_type val|\<^sub>\<tau> \<le> off'"
  shows "Mapping.lookup (content obj) off' = Mapping.lookup (content obj') off'"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. Mapping.lookup (content obj) off' = Mapping.lookup (content obj') off'
[PROOF STEP]
using assms
[PROOF STATE]
proof (prove)
using this:
store_tval obj off val = obj'
val \<noteq> Undef
off + |memval_type val|\<^sub>\<tau> \<le> off'

goal (1 subgoal):
 1. Mapping.lookup (content obj) off' = Mapping.lookup (content obj') off'
[PROOF STEP]
proof (clarsimp simp add: store_tval_def split: ccval.split_asm)
[PROOF STATE]
proof (state)
goal (10 subgoals):
 1. \<And>x1. \<lbrakk>off + |Uint8|\<^sub>\<tau> \<le> off'; val = Uint8_v x1; obj' = obj\<lparr>content := Mapping.update off (Byte x1) (content obj), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (Mapping.update off (Byte x1) (content obj)) off'
 2. \<And>x2. \<lbrakk>off + |Sint8|\<^sub>\<tau> \<le> off'; val = Sint8_v x2; obj' = obj\<lparr>content := Mapping.update off (Byte (SCAST(8 signed \<rightarrow> 8) x2)) (content obj), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (Mapping.update off (Byte (SCAST(8 signed \<rightarrow> 8) x2)) (content obj)) off'
 3. \<And>x3. \<lbrakk>off + |Uint16|\<^sub>\<tau> \<le> off'; val = Uint16_v x3; obj' = obj\<lparr>content := store_bytes (content obj) off (u16_split x3), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (u16_split x3)) off'
 4. \<And>x4. \<lbrakk>off + |Sint16|\<^sub>\<tau> \<le> off'; val = Sint16_v x4; obj' = obj\<lparr>content := store_bytes (content obj) off (s16_split x4), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (s16_split x4)) off'
 5. \<And>x5. \<lbrakk>off + |Uint32|\<^sub>\<tau> \<le> off'; val = Uint32_v x5; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_u32 x5), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_u32 x5)) off'
 6. \<And>x6. \<lbrakk>off + |Sint32|\<^sub>\<tau> \<le> off'; val = Sint32_v x6; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_s32 x6), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_s32 x6)) off'
 7. \<And>x7. \<lbrakk>off + |Uint64|\<^sub>\<tau> \<le> off'; val = Uint64_v x7; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_u64 x7), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_u64 x7)) off'
 8. \<And>x8. \<lbrakk>off + |Sint64|\<^sub>\<tau> \<le> off'; val = Sint64_v x8; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_s64 x8), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_s64 x8)) off'
 9. \<And>x9. \<lbrakk>off + |Cap|\<^sub>\<tau> \<le> off'; val = Cap_v x9; obj' = obj\<lparr>content := store_cap (content obj) off x9 |Cap|\<^sub>\<tau>, tags := store_tag (tags obj) (cap_offset off) (tag x9)\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_cap (content obj) off x9 |Cap|\<^sub>\<tau>) off'
 10. \<And>x101 x102. \<lbrakk>off + |Uint8|\<^sub>\<tau> \<le> off'; val = Cap_v_frag x101 x102; obj' = obj\<lparr>content := Mapping.update off (ACap (mem_capability.truncate x101) x102) (content obj), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (Mapping.update off (ACap (mem_capability.truncate x101) x102) (content obj)) off'
[PROOF STEP]
show "\<And>x. \<lbrakk>off + |Cap|\<^sub>\<tau> \<le> off'; val = Cap_v x; obj' = obj\<lparr>content := store_cap (content obj) off x |Cap|\<^sub>\<tau>, tags := store_tag (tags obj) (cap_offset off) (tag x)\<rparr>\<rbrakk>
          \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_cap (content obj) off x |Cap|\<^sub>\<tau>) off'"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>x. \<lbrakk>off + |Cap|\<^sub>\<tau> \<le> off'; val = Cap_v x; obj' = obj\<lparr>content := store_cap (content obj) off x |Cap|\<^sub>\<tau>, tags := store_tag (tags obj) (cap_offset off) (tag x)\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_cap (content obj) off x |Cap|\<^sub>\<tau>) off'
[PROOF STEP]
by (presburger add: store_cap_domain_2)
[PROOF STATE]
proof (state)
this:
\<lbrakk>off + |Cap|\<^sub>\<tau> \<le> off'; val = Cap_v ?x; obj' = obj\<lparr>content := store_cap (content obj) off ?x |Cap|\<^sub>\<tau>, tags := store_tag (tags obj) (cap_offset off) (tag ?x)\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_cap (content obj) off ?x |Cap|\<^sub>\<tau>) off'

goal (9 subgoals):
 1. \<And>x1. \<lbrakk>off + |Uint8|\<^sub>\<tau> \<le> off'; val = Uint8_v x1; obj' = obj\<lparr>content := Mapping.update off (Byte x1) (content obj), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (Mapping.update off (Byte x1) (content obj)) off'
 2. \<And>x2. \<lbrakk>off + |Sint8|\<^sub>\<tau> \<le> off'; val = Sint8_v x2; obj' = obj\<lparr>content := Mapping.update off (Byte (SCAST(8 signed \<rightarrow> 8) x2)) (content obj), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (Mapping.update off (Byte (SCAST(8 signed \<rightarrow> 8) x2)) (content obj)) off'
 3. \<And>x3. \<lbrakk>off + |Uint16|\<^sub>\<tau> \<le> off'; val = Uint16_v x3; obj' = obj\<lparr>content := store_bytes (content obj) off (u16_split x3), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (u16_split x3)) off'
 4. \<And>x4. \<lbrakk>off + |Sint16|\<^sub>\<tau> \<le> off'; val = Sint16_v x4; obj' = obj\<lparr>content := store_bytes (content obj) off (s16_split x4), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (s16_split x4)) off'
 5. \<And>x5. \<lbrakk>off + |Uint32|\<^sub>\<tau> \<le> off'; val = Uint32_v x5; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_u32 x5), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_u32 x5)) off'
 6. \<And>x6. \<lbrakk>off + |Sint32|\<^sub>\<tau> \<le> off'; val = Sint32_v x6; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_s32 x6), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_s32 x6)) off'
 7. \<And>x7. \<lbrakk>off + |Uint64|\<^sub>\<tau> \<le> off'; val = Uint64_v x7; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_u64 x7), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_u64 x7)) off'
 8. \<And>x8. \<lbrakk>off + |Sint64|\<^sub>\<tau> \<le> off'; val = Sint64_v x8; obj' = obj\<lparr>content := store_bytes (content obj) off (flatten_s64 x8), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (store_bytes (content obj) off (flatten_s64 x8)) off'
 9. \<And>x101 x102. \<lbrakk>off + |Uint8|\<^sub>\<tau> \<le> off'; val = Cap_v_frag x101 x102; obj' = obj\<lparr>content := Mapping.update off (ACap (mem_capability.truncate x101) x102) (content obj), tags := store_tag (tags obj) (cap_offset off) False\<rparr>\<rbrakk> \<Longrightarrow> Mapping.lookup (content obj) off' = Mapping.lookup (Mapping.update off (ACap (mem_capability.truncate x101) x102) (content obj)) off'
[PROOF STEP]
qed (force simp add: sizeof_def | metis assms(3) store_bytes_domain_2 flatten_types_length memval_size_types)+