1(* Title: HOL/Auth/KerberosIV.thy 2 Author: Giampaolo Bella, Cambridge University Computer Laboratory 3 Copyright 1998 University of Cambridge 4*) 5 6section\<open>The Kerberos Protocol, Version IV\<close> 7 8theory KerberosIV imports Public begin 9 10text\<open>The "u" prefix indicates theorems referring to an updated version of the protocol. The "r" suffix indicates theorems where the confidentiality assumptions are relaxed by the corresponding arguments.\<close> 11 12abbreviation 13 Kas :: agent where "Kas == Server" 14 15abbreviation 16 Tgs :: agent where "Tgs == Friend 0" 17 18 19axiomatization where 20 Tgs_not_bad [iff]: "Tgs \<notin> bad" 21 \<comment> \<open>Tgs is secure --- we already know that Kas is secure\<close> 22 23definition 24 (* authKeys are those contained in an authTicket *) 25 authKeys :: "event list \<Rightarrow> key set" where 26 "authKeys evs = {authK. \<exists>A Peer Ta. Says Kas A 27 (Crypt (shrK A) \<lbrace>Key authK, Agent Peer, Number Ta, 28 (Crypt (shrK Peer) \<lbrace>Agent A, Agent Peer, Key authK, Number Ta\<rbrace>) 29 \<rbrace>) \<in> set evs}" 30 31definition 32 (* A is the true creator of X if she has sent X and X never appeared on 33 the trace before this event. Recall that traces grow from head. *) 34 Issues :: "[agent, agent, msg, event list] \<Rightarrow> bool" 35 ("_ Issues _ with _ on _" [50, 0, 0, 50] 50) where 36 "(A Issues B with X on evs) = 37 (\<exists>Y. Says A B Y \<in> set evs \<and> X \<in> parts {Y} \<and> 38 X \<notin> parts (spies (takeWhile (\<lambda>z. z \<noteq> Says A B Y) (rev evs))))" 39 40definition 41 (* Yields the subtrace of a given trace from its beginning to a given event *) 42 before :: "[event, event list] \<Rightarrow> event list" ("before _ on _" [0, 50] 50) 43 where "(before ev on evs) = takeWhile (\<lambda>z. z \<noteq> ev) (rev evs)" 44 45definition 46 (* States than an event really appears only once on a trace *) 47 Unique :: "[event, event list] \<Rightarrow> bool" ("Unique _ on _" [0, 50] 50) 48 where "(Unique ev on evs) = (ev \<notin> set (tl (dropWhile (\<lambda>z. z \<noteq> ev) evs)))" 49 50 51consts 52 (*Duration of the authentication key*) 53 authKlife :: nat 54 55 (*Duration of the service key*) 56 servKlife :: nat 57 58 (*Duration of an authenticator*) 59 authlife :: nat 60 61 (*Upper bound on the time of reaction of a server*) 62 replylife :: nat 63 64specification (authKlife) 65 authKlife_LB [iff]: "2 \<le> authKlife" 66 by blast 67 68specification (servKlife) 69 servKlife_LB [iff]: "2 + authKlife \<le> servKlife" 70 by blast 71 72specification (authlife) 73 authlife_LB [iff]: "Suc 0 \<le> authlife" 74 by blast 75 76specification (replylife) 77 replylife_LB [iff]: "Suc 0 \<le> replylife" 78 by blast 79 80abbreviation 81 (*The current time is the length of the trace*) 82 CT :: "event list \<Rightarrow> nat" where 83 "CT == length" 84 85abbreviation 86 expiredAK :: "[nat, event list] \<Rightarrow> bool" where 87 "expiredAK Ta evs == authKlife + Ta < CT evs" 88 89abbreviation 90 expiredSK :: "[nat, event list] \<Rightarrow> bool" where 91 "expiredSK Ts evs == servKlife + Ts < CT evs" 92 93abbreviation 94 expiredA :: "[nat, event list] \<Rightarrow> bool" where 95 "expiredA T evs == authlife + T < CT evs" 96 97abbreviation 98 valid :: "[nat, nat] \<Rightarrow> bool" ("valid _ wrt _" [0, 50] 50) where 99 "valid T1 wrt T2 == T1 \<le> replylife + T2" 100 101(*---------------------------------------------------------------------*) 102 103 104(* Predicate formalising the association between authKeys and servKeys *) 105definition AKcryptSK :: "[key, key, event list] \<Rightarrow> bool" where 106 "AKcryptSK authK servK evs == 107 \<exists>A B Ts. 108 Says Tgs A (Crypt authK 109 \<lbrace>Key servK, Agent B, Number Ts, 110 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> \<rbrace>) 111 \<in> set evs" 112 113inductive_set kerbIV :: "event list set" 114 where 115 116 Nil: "[] \<in> kerbIV" 117 118 | Fake: "\<lbrakk> evsf \<in> kerbIV; X \<in> synth (analz (spies evsf)) \<rbrakk> 119 \<Longrightarrow> Says Spy B X # evsf \<in> kerbIV" 120 121(* FROM the initiator *) 122 | K1: "\<lbrakk> evs1 \<in> kerbIV \<rbrakk> 123 \<Longrightarrow> Says A Kas \<lbrace>Agent A, Agent Tgs, Number (CT evs1)\<rbrace> # evs1 124 \<in> kerbIV" 125 126(* Adding the timestamp serves to A in K3 to check that 127 she doesn't get a reply too late. This kind of timeouts are ordinary. 128 If a server's reply is late, then it is likely to be fake. *) 129 130(*---------------------------------------------------------------------*) 131 132(*FROM Kas *) 133 | K2: "\<lbrakk> evs2 \<in> kerbIV; Key authK \<notin> used evs2; authK \<in> symKeys; 134 Says A' Kas \<lbrace>Agent A, Agent Tgs, Number T1\<rbrace> \<in> set evs2 \<rbrakk> 135 \<Longrightarrow> Says Kas A 136 (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number (CT evs2), 137 (Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, 138 Number (CT evs2)\<rbrace>)\<rbrace>) # evs2 \<in> kerbIV" 139(* 140 The internal encryption builds the authTicket. 141 The timestamp doesn't change inside the two encryptions: the external copy 142 will be used by the initiator in K3; the one inside the 143 authTicket by Tgs in K4. 144*) 145 146(*---------------------------------------------------------------------*) 147 148(* FROM the initiator *) 149 | K3: "\<lbrakk> evs3 \<in> kerbIV; 150 Says A Kas \<lbrace>Agent A, Agent Tgs, Number T1\<rbrace> \<in> set evs3; 151 Says Kas' A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 152 authTicket\<rbrace>) \<in> set evs3; 153 valid Ta wrt T1 154 \<rbrakk> 155 \<Longrightarrow> Says A Tgs \<lbrace>authTicket, 156 (Crypt authK \<lbrace>Agent A, Number (CT evs3)\<rbrace>), 157 Agent B\<rbrace> # evs3 \<in> kerbIV" 158(*The two events amongst the premises allow A to accept only those authKeys 159 that are not issued late. *) 160 161(*---------------------------------------------------------------------*) 162 163(* FROM Tgs *) 164(* Note that the last temporal check is not mentioned in the original MIT 165 specification. Adding it makes many goals "available" to the peers. 166 Theorems that exploit it have the suffix `_u', which stands for updated 167 protocol. 168*) 169 | K4: "\<lbrakk> evs4 \<in> kerbIV; Key servK \<notin> used evs4; servK \<in> symKeys; 170 B \<noteq> Tgs; authK \<in> symKeys; 171 Says A' Tgs \<lbrace> 172 (Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, 173 Number Ta\<rbrace>), 174 (Crypt authK \<lbrace>Agent A, Number T2\<rbrace>), Agent B\<rbrace> 175 \<in> set evs4; 176 \<not> expiredAK Ta evs4; 177 \<not> expiredA T2 evs4; 178 servKlife + (CT evs4) \<le> authKlife + Ta 179 \<rbrakk> 180 \<Longrightarrow> Says Tgs A 181 (Crypt authK \<lbrace>Key servK, Agent B, Number (CT evs4), 182 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, 183 Number (CT evs4)\<rbrace> \<rbrace>) 184 # evs4 \<in> kerbIV" 185(* Tgs creates a new session key per each request for a service, without 186 checking if there is still a fresh one for that service. 187 The cipher under Tgs' key is the authTicket, the cipher under B's key 188 is the servTicket, which is built now. 189 NOTE that the last temporal check is not present in the MIT specification. 190 191*) 192 193(*---------------------------------------------------------------------*) 194 195(* FROM the initiator *) 196 | K5: "\<lbrakk> evs5 \<in> kerbIV; authK \<in> symKeys; servK \<in> symKeys; 197 Says A Tgs 198 \<lbrace>authTicket, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, 199 Agent B\<rbrace> 200 \<in> set evs5; 201 Says Tgs' A 202 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 203 \<in> set evs5; 204 valid Ts wrt T2 \<rbrakk> 205 \<Longrightarrow> Says A B \<lbrace>servTicket, 206 Crypt servK \<lbrace>Agent A, Number (CT evs5)\<rbrace> \<rbrace> 207 # evs5 \<in> kerbIV" 208(* Checks similar to those in K3. *) 209 210(*---------------------------------------------------------------------*) 211 212(* FROM the responder*) 213 | K6: "\<lbrakk> evs6 \<in> kerbIV; 214 Says A' B \<lbrace> 215 (Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>), 216 (Crypt servK \<lbrace>Agent A, Number T3\<rbrace>)\<rbrace> 217 \<in> set evs6; 218 \<not> expiredSK Ts evs6; 219 \<not> expiredA T3 evs6 220 \<rbrakk> 221 \<Longrightarrow> Says B A (Crypt servK (Number T3)) 222 # evs6 \<in> kerbIV" 223(* Checks similar to those in K4. *) 224 225(*---------------------------------------------------------------------*) 226 227(* Leaking an authK... *) 228 | Oops1: "\<lbrakk> evsO1 \<in> kerbIV; A \<noteq> Spy; 229 Says Kas A 230 (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 231 authTicket\<rbrace>) \<in> set evsO1; 232 expiredAK Ta evsO1 \<rbrakk> 233 \<Longrightarrow> Says A Spy \<lbrace>Agent A, Agent Tgs, Number Ta, Key authK\<rbrace> 234 # evsO1 \<in> kerbIV" 235 236(*---------------------------------------------------------------------*) 237 238(*Leaking a servK... *) 239 | Oops2: "\<lbrakk> evsO2 \<in> kerbIV; A \<noteq> Spy; 240 Says Tgs A 241 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 242 \<in> set evsO2; 243 expiredSK Ts evsO2 \<rbrakk> 244 \<Longrightarrow> Says A Spy \<lbrace>Agent A, Agent B, Number Ts, Key servK\<rbrace> 245 # evsO2 \<in> kerbIV" 246 247(*---------------------------------------------------------------------*) 248 249declare Says_imp_knows_Spy [THEN parts.Inj, dest] 250declare parts.Body [dest] 251declare analz_into_parts [dest] 252declare Fake_parts_insert_in_Un [dest] 253 254 255subsection\<open>Lemmas about lists, for reasoning about Issues\<close> 256 257lemma spies_Says_rev: "spies (evs @ [Says A B X]) = insert X (spies evs)" 258apply (induct_tac "evs") 259apply (rename_tac [2] a b) 260apply (induct_tac [2] a, auto) 261done 262 263lemma spies_Gets_rev: "spies (evs @ [Gets A X]) = spies evs" 264apply (induct_tac "evs") 265apply (rename_tac [2] a b) 266apply (induct_tac [2] a, auto) 267done 268 269lemma spies_Notes_rev: "spies (evs @ [Notes A X]) = 270 (if A\<in>bad then insert X (spies evs) else spies evs)" 271apply (induct_tac "evs") 272apply (rename_tac [2] a b) 273apply (induct_tac [2] a, auto) 274done 275 276lemma spies_evs_rev: "spies evs = spies (rev evs)" 277apply (induct_tac "evs") 278apply (rename_tac [2] a b) 279apply (induct_tac [2] a) 280apply (simp_all (no_asm_simp) add: spies_Says_rev spies_Gets_rev spies_Notes_rev) 281done 282 283lemmas parts_spies_evs_revD2 = spies_evs_rev [THEN equalityD2, THEN parts_mono] 284 285lemma spies_takeWhile: "spies (takeWhile P evs) \<subseteq> spies evs" 286apply (induct_tac "evs") 287apply (rename_tac [2] a b) 288apply (induct_tac [2] "a", auto) 289txt\<open>Resembles \<open>used_subset_append\<close> in theory Event.\<close> 290done 291 292lemmas parts_spies_takeWhile_mono = spies_takeWhile [THEN parts_mono] 293 294 295subsection\<open>Lemmas about \<^term>\<open>authKeys\<close>\<close> 296 297lemma authKeys_empty: "authKeys [] = {}" 298apply (unfold authKeys_def) 299apply (simp (no_asm)) 300done 301 302lemma authKeys_not_insert: 303 "(\<forall>A Ta akey Peer. 304 ev \<noteq> Says Kas A (Crypt (shrK A) \<lbrace>akey, Agent Peer, Ta, 305 (Crypt (shrK Peer) \<lbrace>Agent A, Agent Peer, akey, Ta\<rbrace>)\<rbrace>)) 306 \<Longrightarrow> authKeys (ev # evs) = authKeys evs" 307by (unfold authKeys_def, auto) 308 309lemma authKeys_insert: 310 "authKeys 311 (Says Kas A (Crypt (shrK A) \<lbrace>Key K, Agent Peer, Number Ta, 312 (Crypt (shrK Peer) \<lbrace>Agent A, Agent Peer, Key K, Number Ta\<rbrace>)\<rbrace>) # evs) 313 = insert K (authKeys evs)" 314by (unfold authKeys_def, auto) 315 316lemma authKeys_simp: 317 "K \<in> authKeys 318 (Says Kas A (Crypt (shrK A) \<lbrace>Key K', Agent Peer, Number Ta, 319 (Crypt (shrK Peer) \<lbrace>Agent A, Agent Peer, Key K', Number Ta\<rbrace>)\<rbrace>) # evs) 320 \<Longrightarrow> K = K' | K \<in> authKeys evs" 321by (unfold authKeys_def, auto) 322 323lemma authKeysI: 324 "Says Kas A (Crypt (shrK A) \<lbrace>Key K, Agent Tgs, Number Ta, 325 (Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key K, Number Ta\<rbrace>)\<rbrace>) \<in> set evs 326 \<Longrightarrow> K \<in> authKeys evs" 327by (unfold authKeys_def, auto) 328 329lemma authKeys_used: "K \<in> authKeys evs \<Longrightarrow> Key K \<in> used evs" 330by (simp add: authKeys_def, blast) 331 332 333subsection\<open>Forwarding Lemmas\<close> 334 335text\<open>--For reasoning about the encrypted portion of message K3--\<close> 336lemma K3_msg_in_parts_spies: 337 "Says Kas' A (Crypt KeyA \<lbrace>authK, Peer, Ta, authTicket\<rbrace>) 338 \<in> set evs \<Longrightarrow> authTicket \<in> parts (spies evs)" 339by blast 340 341lemma Oops_range_spies1: 342 "\<lbrakk> Says Kas A (Crypt KeyA \<lbrace>Key authK, Peer, Ta, authTicket\<rbrace>) 343 \<in> set evs ; 344 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> authK \<notin> range shrK \<and> authK \<in> symKeys" 345apply (erule rev_mp) 346apply (erule kerbIV.induct, auto) 347done 348 349text\<open>--For reasoning about the encrypted portion of message K5--\<close> 350lemma K5_msg_in_parts_spies: 351 "Says Tgs' A (Crypt authK \<lbrace>servK, Agent B, Ts, servTicket\<rbrace>) 352 \<in> set evs \<Longrightarrow> servTicket \<in> parts (spies evs)" 353by blast 354 355lemma Oops_range_spies2: 356 "\<lbrakk> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Ts, servTicket\<rbrace>) 357 \<in> set evs ; 358 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> servK \<notin> range shrK \<and> servK \<in> symKeys" 359apply (erule rev_mp) 360apply (erule kerbIV.induct, auto) 361done 362 363lemma Says_ticket_parts: 364 "Says S A (Crypt K \<lbrace>SesKey, B, TimeStamp, Ticket\<rbrace>) \<in> set evs 365 \<Longrightarrow> Ticket \<in> parts (spies evs)" 366by blast 367 368(*Spy never sees another agent's shared key! (unless it's lost at start)*) 369lemma Spy_see_shrK [simp]: 370 "evs \<in> kerbIV \<Longrightarrow> (Key (shrK A) \<in> parts (spies evs)) = (A \<in> bad)" 371apply (erule kerbIV.induct) 372apply (frule_tac [7] K5_msg_in_parts_spies) 373apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 374apply (blast+) 375done 376 377lemma Spy_analz_shrK [simp]: 378 "evs \<in> kerbIV \<Longrightarrow> (Key (shrK A) \<in> analz (spies evs)) = (A \<in> bad)" 379by auto 380 381lemma Spy_see_shrK_D [dest!]: 382 "\<lbrakk> Key (shrK A) \<in> parts (spies evs); evs \<in> kerbIV \<rbrakk> \<Longrightarrow> A\<in>bad" 383by (blast dest: Spy_see_shrK) 384 385lemmas Spy_analz_shrK_D = analz_subset_parts [THEN subsetD, THEN Spy_see_shrK_D, dest!] 386 387text\<open>Nobody can have used non-existent keys!\<close> 388lemma new_keys_not_used [simp]: 389 "\<lbrakk>Key K \<notin> used evs; K \<in> symKeys; evs \<in> kerbIV\<rbrakk> 390 \<Longrightarrow> K \<notin> keysFor (parts (spies evs))" 391apply (erule rev_mp) 392apply (erule kerbIV.induct) 393apply (frule_tac [7] K5_msg_in_parts_spies) 394apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 395txt\<open>Fake\<close> 396apply (force dest!: keysFor_parts_insert) 397txt\<open>Others\<close> 398apply (force dest!: analz_shrK_Decrypt)+ 399done 400 401(*Earlier, all protocol proofs declared this theorem. 402 But few of them actually need it! (Another is Yahalom) *) 403lemma new_keys_not_analzd: 404 "\<lbrakk>evs \<in> kerbIV; K \<in> symKeys; Key K \<notin> used evs\<rbrakk> 405 \<Longrightarrow> K \<notin> keysFor (analz (spies evs))" 406by (blast dest: new_keys_not_used intro: keysFor_mono [THEN subsetD]) 407 408 409 410subsection\<open>Lemmas for reasoning about predicate "before"\<close> 411 412lemma used_Says_rev: "used (evs @ [Says A B X]) = parts {X} \<union> (used evs)" 413apply (induct_tac "evs") 414apply simp 415apply (rename_tac a b) 416apply (induct_tac "a") 417apply auto 418done 419 420lemma used_Notes_rev: "used (evs @ [Notes A X]) = parts {X} \<union> (used evs)" 421apply (induct_tac "evs") 422apply simp 423apply (rename_tac a b) 424apply (induct_tac "a") 425apply auto 426done 427 428lemma used_Gets_rev: "used (evs @ [Gets B X]) = used evs" 429apply (induct_tac "evs") 430apply simp 431apply (rename_tac a b) 432apply (induct_tac "a") 433apply auto 434done 435 436lemma used_evs_rev: "used evs = used (rev evs)" 437apply (induct_tac "evs") 438apply simp 439apply (rename_tac a b) 440apply (induct_tac "a") 441apply (simp add: used_Says_rev) 442apply (simp add: used_Gets_rev) 443apply (simp add: used_Notes_rev) 444done 445 446lemma used_takeWhile_used [rule_format]: 447 "x \<in> used (takeWhile P X) \<longrightarrow> x \<in> used X" 448apply (induct_tac "X") 449apply simp 450apply (rename_tac a b) 451apply (induct_tac "a") 452apply (simp_all add: used_Nil) 453apply (blast dest!: initState_into_used)+ 454done 455 456lemma set_evs_rev: "set evs = set (rev evs)" 457by auto 458 459lemma takeWhile_void [rule_format]: 460 "x \<notin> set evs \<longrightarrow> takeWhile (\<lambda>z. z \<noteq> x) evs = evs" 461by auto 462 463 464subsection\<open>Regularity Lemmas\<close> 465text\<open>These concern the form of items passed in messages\<close> 466 467text\<open>Describes the form of all components sent by Kas\<close> 468lemma Says_Kas_message_form: 469 "\<lbrakk> Says Kas A (Crypt K \<lbrace>Key authK, Agent Peer, Number Ta, authTicket\<rbrace>) 470 \<in> set evs; 471 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> 472 K = shrK A \<and> Peer = Tgs \<and> 473 authK \<notin> range shrK \<and> authK \<in> authKeys evs \<and> authK \<in> symKeys \<and> 474 authTicket = (Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>) \<and> 475 Key authK \<notin> used(before 476 Says Kas A (Crypt K \<lbrace>Key authK, Agent Peer, Number Ta, authTicket\<rbrace>) 477 on evs) \<and> 478 Ta = CT (before 479 Says Kas A (Crypt K \<lbrace>Key authK, Agent Peer, Number Ta, authTicket\<rbrace>) 480 on evs)" 481apply (unfold before_def) 482apply (erule rev_mp) 483apply (erule kerbIV.induct) 484apply (simp_all (no_asm) add: authKeys_def authKeys_insert, blast, blast) 485txt\<open>K2\<close> 486apply (simp (no_asm) add: takeWhile_tail) 487apply (rule conjI) 488apply (metis Key_not_used authKeys_used length_rev set_rev takeWhile_void used_evs_rev) 489apply blast+ 490done 491 492 493 494(*This lemma is essential for proving Says_Tgs_message_form: 495 496 the session key authK 497 supplied by Kas in the authentication ticket 498 cannot be a long-term key! 499 500 Generalised to any session keys (both authK and servK). 501*) 502lemma SesKey_is_session_key: 503 "\<lbrakk> Crypt (shrK Tgs_B) \<lbrace>Agent A, Agent Tgs_B, Key SesKey, Number T\<rbrace> 504 \<in> parts (spies evs); Tgs_B \<notin> bad; 505 evs \<in> kerbIV \<rbrakk> 506 \<Longrightarrow> SesKey \<notin> range shrK" 507apply (erule rev_mp) 508apply (erule kerbIV.induct) 509apply (frule_tac [7] K5_msg_in_parts_spies) 510apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, blast) 511done 512 513lemma authTicket_authentic: 514 "\<lbrakk> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> 515 \<in> parts (spies evs); 516 evs \<in> kerbIV \<rbrakk> 517 \<Longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 518 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 519 \<in> set evs" 520apply (erule rev_mp) 521apply (erule kerbIV.induct) 522apply (frule_tac [7] K5_msg_in_parts_spies) 523apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 524txt\<open>Fake, K4\<close> 525apply (blast+) 526done 527 528lemma authTicket_crypt_authK: 529 "\<lbrakk> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> 530 \<in> parts (spies evs); 531 evs \<in> kerbIV \<rbrakk> 532 \<Longrightarrow> authK \<in> authKeys evs" 533apply (frule authTicket_authentic, assumption) 534apply (simp (no_asm) add: authKeys_def) 535apply blast 536done 537 538text\<open>Describes the form of servK, servTicket and authK sent by Tgs\<close> 539lemma Says_Tgs_message_form: 540 "\<lbrakk> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 541 \<in> set evs; 542 evs \<in> kerbIV \<rbrakk> 543 \<Longrightarrow> B \<noteq> Tgs \<and> 544 authK \<notin> range shrK \<and> authK \<in> authKeys evs \<and> authK \<in> symKeys \<and> 545 servK \<notin> range shrK \<and> servK \<notin> authKeys evs \<and> servK \<in> symKeys \<and> 546 servTicket = (Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>) \<and> 547 Key servK \<notin> used (before 548 Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 549 on evs) \<and> 550 Ts = CT(before 551 Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 552 on evs) " 553apply (unfold before_def) 554apply (erule rev_mp) 555apply (erule kerbIV.induct) 556apply (simp_all add: authKeys_insert authKeys_not_insert authKeys_empty authKeys_simp, blast) 557txt\<open>We need this simplification only for Message 4\<close> 558apply (simp (no_asm) add: takeWhile_tail) 559apply auto 560txt\<open>Five subcases of Message 4\<close> 561apply (blast dest!: SesKey_is_session_key) 562apply (blast dest: authTicket_crypt_authK) 563apply (blast dest!: authKeys_used Says_Kas_message_form) 564txt\<open>subcase: used before\<close> 565apply (metis used_evs_rev used_takeWhile_used) 566txt\<open>subcase: CT before\<close> 567apply (metis length_rev set_evs_rev takeWhile_void) 568done 569 570lemma authTicket_form: 571 "\<lbrakk> Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Ta, authTicket\<rbrace> 572 \<in> parts (spies evs); 573 A \<notin> bad; 574 evs \<in> kerbIV \<rbrakk> 575 \<Longrightarrow> authK \<notin> range shrK \<and> authK \<in> symKeys \<and> 576 authTicket = Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Ta\<rbrace>" 577apply (erule rev_mp) 578apply (erule kerbIV.induct) 579apply (frule_tac [7] K5_msg_in_parts_spies) 580apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 581apply (blast+) 582done 583 584text\<open>This form holds also over an authTicket, but is not needed below.\<close> 585lemma servTicket_form: 586 "\<lbrakk> Crypt authK \<lbrace>Key servK, Agent B, Ts, servTicket\<rbrace> 587 \<in> parts (spies evs); 588 Key authK \<notin> analz (spies evs); 589 evs \<in> kerbIV \<rbrakk> 590 \<Longrightarrow> servK \<notin> range shrK \<and> servK \<in> symKeys \<and> 591 (\<exists>A. servTicket = Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Ts\<rbrace>)" 592apply (erule rev_mp) 593apply (erule rev_mp) 594apply (erule kerbIV.induct, analz_mono_contra) 595apply (frule_tac [7] K5_msg_in_parts_spies) 596apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, blast) 597done 598 599text\<open>Essentially the same as \<open>authTicket_form\<close>\<close> 600lemma Says_kas_message_form: 601 "\<lbrakk> Says Kas' A (Crypt (shrK A) 602 \<lbrace>Key authK, Agent Tgs, Ta, authTicket\<rbrace>) \<in> set evs; 603 evs \<in> kerbIV \<rbrakk> 604 \<Longrightarrow> authK \<notin> range shrK \<and> authK \<in> symKeys \<and> 605 authTicket = 606 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Ta\<rbrace> 607 | authTicket \<in> analz (spies evs)" 608by (blast dest: analz_shrK_Decrypt authTicket_form 609 Says_imp_spies [THEN analz.Inj]) 610 611lemma Says_tgs_message_form: 612 "\<lbrakk> Says Tgs' A (Crypt authK \<lbrace>Key servK, Agent B, Ts, servTicket\<rbrace>) 613 \<in> set evs; authK \<in> symKeys; 614 evs \<in> kerbIV \<rbrakk> 615 \<Longrightarrow> servK \<notin> range shrK \<and> 616 (\<exists>A. servTicket = 617 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Ts\<rbrace>) 618 | servTicket \<in> analz (spies evs)" 619by (metis Says_imp_analz_Spy Says_imp_parts_knows_Spy analz.Decrypt analz.Snd invKey_K servTicket_form) 620 621 622subsection\<open>Authenticity theorems: confirm origin of sensitive messages\<close> 623 624lemma authK_authentic: 625 "\<lbrakk> Crypt (shrK A) \<lbrace>Key authK, Peer, Ta, authTicket\<rbrace> 626 \<in> parts (spies evs); 627 A \<notin> bad; evs \<in> kerbIV \<rbrakk> 628 \<Longrightarrow> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Peer, Ta, authTicket\<rbrace>) 629 \<in> set evs" 630apply (erule rev_mp) 631apply (erule kerbIV.induct) 632apply (frule_tac [7] K5_msg_in_parts_spies) 633apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 634txt\<open>Fake\<close> 635apply blast 636txt\<open>K4\<close> 637apply (blast dest!: authTicket_authentic [THEN Says_Kas_message_form]) 638done 639 640text\<open>If a certain encrypted message appears then it originated with Tgs\<close> 641lemma servK_authentic: 642 "\<lbrakk> Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 643 \<in> parts (spies evs); 644 Key authK \<notin> analz (spies evs); 645 authK \<notin> range shrK; 646 evs \<in> kerbIV \<rbrakk> 647 \<Longrightarrow> \<exists>A. Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 648 \<in> set evs" 649apply (erule rev_mp) 650apply (erule rev_mp) 651apply (erule kerbIV.induct, analz_mono_contra) 652apply (frule_tac [7] K5_msg_in_parts_spies) 653apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 654txt\<open>Fake\<close> 655apply blast 656txt\<open>K2\<close> 657apply blast 658txt\<open>K4\<close> 659apply auto 660done 661 662lemma servK_authentic_bis: 663 "\<lbrakk> Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 664 \<in> parts (spies evs); 665 Key authK \<notin> analz (spies evs); 666 B \<noteq> Tgs; 667 evs \<in> kerbIV \<rbrakk> 668 \<Longrightarrow> \<exists>A. Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 669 \<in> set evs" 670apply (erule rev_mp) 671apply (erule rev_mp) 672apply (erule kerbIV.induct, analz_mono_contra) 673apply (frule_tac [7] K5_msg_in_parts_spies) 674apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 675txt\<open>Fake\<close> 676apply blast 677txt\<open>K4\<close> 678apply blast 679done 680 681text\<open>Authenticity of servK for B\<close> 682lemma servTicket_authentic_Tgs: 683 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 684 \<in> parts (spies evs); B \<noteq> Tgs; B \<notin> bad; 685 evs \<in> kerbIV \<rbrakk> 686 \<Longrightarrow> \<exists>authK. 687 Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, 688 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>\<rbrace>) 689 \<in> set evs" 690apply (erule rev_mp) 691apply (erule rev_mp) 692apply (erule kerbIV.induct) 693apply (frule_tac [7] K5_msg_in_parts_spies) 694apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 695apply blast+ 696done 697 698text\<open>Anticipated here from next subsection\<close> 699lemma K4_imp_K2: 700"\<lbrakk> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 701 \<in> set evs; evs \<in> kerbIV\<rbrakk> 702 \<Longrightarrow> \<exists>Ta. Says Kas A 703 (Crypt (shrK A) 704 \<lbrace>Key authK, Agent Tgs, Number Ta, 705 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 706 \<in> set evs" 707apply (erule rev_mp) 708apply (erule kerbIV.induct) 709apply (frule_tac [7] K5_msg_in_parts_spies) 710apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, auto) 711apply (blast dest!: Says_imp_spies [THEN parts.Inj, THEN parts.Fst, THEN authTicket_authentic]) 712done 713 714text\<open>Anticipated here from next subsection\<close> 715lemma u_K4_imp_K2: 716"\<lbrakk> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 717 \<in> set evs; evs \<in> kerbIV\<rbrakk> 718 \<Longrightarrow> \<exists>Ta. (Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 719 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 720 \<in> set evs 721 \<and> servKlife + Ts \<le> authKlife + Ta)" 722apply (erule rev_mp) 723apply (erule kerbIV.induct) 724apply (frule_tac [7] K5_msg_in_parts_spies) 725apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, auto) 726apply (blast dest!: Says_imp_spies [THEN parts.Inj, THEN parts.Fst, THEN authTicket_authentic]) 727done 728 729lemma servTicket_authentic_Kas: 730 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 731 \<in> parts (spies evs); B \<noteq> Tgs; B \<notin> bad; 732 evs \<in> kerbIV \<rbrakk> 733 \<Longrightarrow> \<exists>authK Ta. 734 Says Kas A 735 (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 736 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 737 \<in> set evs" 738by (blast dest!: servTicket_authentic_Tgs K4_imp_K2) 739 740lemma u_servTicket_authentic_Kas: 741 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 742 \<in> parts (spies evs); B \<noteq> Tgs; B \<notin> bad; 743 evs \<in> kerbIV \<rbrakk> 744 \<Longrightarrow> \<exists>authK Ta. Says Kas A (Crypt(shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 745 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 746 \<in> set evs 747 \<and> servKlife + Ts \<le> authKlife + Ta" 748by (blast dest!: servTicket_authentic_Tgs u_K4_imp_K2) 749 750lemma servTicket_authentic: 751 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 752 \<in> parts (spies evs); B \<noteq> Tgs; B \<notin> bad; 753 evs \<in> kerbIV \<rbrakk> 754 \<Longrightarrow> \<exists>Ta authK. 755 Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 756 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 757 \<in> set evs 758 \<and> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, 759 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>\<rbrace>) 760 \<in> set evs" 761by (blast dest: servTicket_authentic_Tgs K4_imp_K2) 762 763lemma u_servTicket_authentic: 764 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 765 \<in> parts (spies evs); B \<noteq> Tgs; B \<notin> bad; 766 evs \<in> kerbIV \<rbrakk> 767 \<Longrightarrow> \<exists>Ta authK. 768 (Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, 769 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 770 \<in> set evs 771 \<and> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, 772 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>\<rbrace>) 773 \<in> set evs 774 \<and> servKlife + Ts \<le> authKlife + Ta)" 775by (blast dest: servTicket_authentic_Tgs u_K4_imp_K2) 776 777lemma u_NotexpiredSK_NotexpiredAK: 778 "\<lbrakk> \<not> expiredSK Ts evs; servKlife + Ts \<le> authKlife + Ta \<rbrakk> 779 \<Longrightarrow> \<not> expiredAK Ta evs" 780 by (metis le_less_trans) 781 782 783subsection\<open>Reliability: friendly agents send something if something else happened\<close> 784 785lemma K3_imp_K2: 786 "\<lbrakk> Says A Tgs 787 \<lbrace>authTicket, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> 788 \<in> set evs; 789 A \<notin> bad; evs \<in> kerbIV \<rbrakk> 790 \<Longrightarrow> \<exists>Ta. Says Kas A (Crypt (shrK A) 791 \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace>) 792 \<in> set evs" 793apply (erule rev_mp) 794apply (erule kerbIV.induct) 795apply (frule_tac [7] K5_msg_in_parts_spies) 796apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, blast, blast) 797apply (blast dest: Says_imp_spies [THEN parts.Inj, THEN authK_authentic]) 798done 799 800text\<open>Anticipated here from next subsection. An authK is encrypted by one and only one Shared key. A servK is encrypted by one and only one authK.\<close> 801lemma Key_unique_SesKey: 802 "\<lbrakk> Crypt K \<lbrace>Key SesKey, Agent B, T, Ticket\<rbrace> 803 \<in> parts (spies evs); 804 Crypt K' \<lbrace>Key SesKey, Agent B', T', Ticket'\<rbrace> 805 \<in> parts (spies evs); Key SesKey \<notin> analz (spies evs); 806 evs \<in> kerbIV \<rbrakk> 807 \<Longrightarrow> K=K' \<and> B=B' \<and> T=T' \<and> Ticket=Ticket'" 808apply (erule rev_mp) 809apply (erule rev_mp) 810apply (erule rev_mp) 811apply (erule kerbIV.induct, analz_mono_contra) 812apply (frule_tac [7] K5_msg_in_parts_spies) 813apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 814txt\<open>Fake, K2, K4\<close> 815apply (blast+) 816done 817 818lemma Tgs_authenticates_A: 819 "\<lbrakk> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (spies evs); 820 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> 821 \<in> parts (spies evs); 822 Key authK \<notin> analz (spies evs); A \<notin> bad; evs \<in> kerbIV \<rbrakk> 823 \<Longrightarrow> \<exists> B. Says A Tgs \<lbrace> 824 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>, 825 Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B \<rbrace> \<in> set evs" 826apply (drule authTicket_authentic, assumption, rotate_tac 4) 827apply (erule rev_mp, erule rev_mp, erule rev_mp) 828apply (erule kerbIV.induct, analz_mono_contra) 829apply (frule_tac [5] Says_ticket_parts) 830apply (frule_tac [7] Says_ticket_parts) 831apply (simp_all (no_asm_simp) add: all_conj_distrib) 832txt\<open>Fake\<close> 833apply blast 834txt\<open>K2\<close> 835apply (force dest!: Crypt_imp_keysFor) 836txt\<open>K3\<close> 837apply (blast dest: Key_unique_SesKey) 838txt\<open>K5\<close> 839apply (metis K3_imp_K2 Key_unique_SesKey Spy_see_shrK parts.Body parts.Fst 840 Says_imp_knows_Spy [THEN parts.Inj]) 841done 842 843lemma Says_K5: 844 "\<lbrakk> Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<in> parts (spies evs); 845 Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, 846 servTicket\<rbrace>) \<in> set evs; 847 Key servK \<notin> analz (spies evs); 848 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 849 \<Longrightarrow> Says A B \<lbrace>servTicket, Crypt servK \<lbrace>Agent A, Number T3\<rbrace>\<rbrace> \<in> set evs" 850apply (erule rev_mp) 851apply (erule rev_mp) 852apply (erule rev_mp) 853apply (erule kerbIV.induct, analz_mono_contra) 854apply (frule_tac [5] Says_ticket_parts) 855apply (frule_tac [7] Says_ticket_parts) 856apply (simp_all (no_asm_simp) add: all_conj_distrib) 857apply blast 858txt\<open>K3\<close> 859apply (blast dest: authK_authentic Says_Kas_message_form Says_Tgs_message_form) 860txt\<open>K4\<close> 861apply (force dest!: Crypt_imp_keysFor) 862txt\<open>K5\<close> 863apply (blast dest: Key_unique_SesKey) 864done 865 866text\<open>Anticipated here from next subsection\<close> 867lemma unique_CryptKey: 868 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key SesKey, T\<rbrace> 869 \<in> parts (spies evs); 870 Crypt (shrK B') \<lbrace>Agent A', Agent B', Key SesKey, T'\<rbrace> 871 \<in> parts (spies evs); Key SesKey \<notin> analz (spies evs); 872 evs \<in> kerbIV \<rbrakk> 873 \<Longrightarrow> A=A' \<and> B=B' \<and> T=T'" 874apply (erule rev_mp) 875apply (erule rev_mp) 876apply (erule rev_mp) 877apply (erule kerbIV.induct, analz_mono_contra) 878apply (frule_tac [7] K5_msg_in_parts_spies) 879apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 880txt\<open>Fake, K2, K4\<close> 881apply (blast+) 882done 883 884lemma Says_K6: 885 "\<lbrakk> Crypt servK (Number T3) \<in> parts (spies evs); 886 Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, 887 servTicket\<rbrace>) \<in> set evs; 888 Key servK \<notin> analz (spies evs); 889 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 890 \<Longrightarrow> Says B A (Crypt servK (Number T3)) \<in> set evs" 891apply (erule rev_mp) 892apply (erule rev_mp) 893apply (erule rev_mp) 894apply (erule kerbIV.induct, analz_mono_contra) 895apply (frule_tac [5] Says_ticket_parts) 896apply (frule_tac [7] Says_ticket_parts) 897apply (simp_all (no_asm_simp)) 898apply blast 899apply (metis Crypt_imp_invKey_keysFor invKey_K new_keys_not_used) 900apply (clarify) 901apply (frule Says_Tgs_message_form, assumption) 902apply (metis K3_msg_in_parts_spies parts.Fst Says_imp_knows_Spy [THEN parts.Inj] 903 unique_CryptKey) 904done 905 906text\<open>Needs a unicity theorem, hence moved here\<close> 907lemma servK_authentic_ter: 908 "\<lbrakk> Says Kas A 909 (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace>) \<in> set evs; 910 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 911 \<in> parts (spies evs); 912 Key authK \<notin> analz (spies evs); 913 evs \<in> kerbIV \<rbrakk> 914 \<Longrightarrow> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 915 \<in> set evs" 916apply (frule Says_Kas_message_form, assumption) 917apply (erule rev_mp) 918apply (erule rev_mp) 919apply (erule rev_mp) 920apply (erule kerbIV.induct, analz_mono_contra) 921apply (frule_tac [7] K5_msg_in_parts_spies) 922apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, blast) 923txt\<open>K2\<close> 924apply (blast dest!: servK_authentic Says_Tgs_message_form authKeys_used) 925txt\<open>K4 remain\<close> 926apply (blast dest!: unique_CryptKey) 927done 928 929 930subsection\<open>Unicity Theorems\<close> 931 932text\<open>The session key, if secure, uniquely identifies the Ticket 933 whether authTicket or servTicket. As a matter of fact, one can read 934 also Tgs in the place of B.\<close> 935 936 937(* 938 At reception of any message mentioning A, Kas associates shrK A with 939 a new authK. Realistic, as the user gets a new authK at each login. 940 Similarly, at reception of any message mentioning an authK 941 (a legitimate user could make several requests to Tgs - by K3), Tgs 942 associates it with a new servK. 943 944 Therefore, a goal like 945 946 "evs \<in> kerbIV 947 \<Longrightarrow> Key Kc \<notin> analz (spies evs) \<longrightarrow> 948 (\<exists>K' B' T' Ticket'. \<forall>K B T Ticket. 949 Crypt Kc \<lbrace>Key K, Agent B, T, Ticket\<rbrace> 950 \<in> parts (spies evs) \<longrightarrow> K=K' \<and> B=B' \<and> T=T' \<and> Ticket=Ticket')" 951 952 would fail on the K2 and K4 cases. 953*) 954 955lemma unique_authKeys: 956 "\<lbrakk> Says Kas A 957 (Crypt Ka \<lbrace>Key authK, Agent Tgs, Ta, X\<rbrace>) \<in> set evs; 958 Says Kas A' 959 (Crypt Ka' \<lbrace>Key authK, Agent Tgs, Ta', X'\<rbrace>) \<in> set evs; 960 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> A=A' \<and> Ka=Ka' \<and> Ta=Ta' \<and> X=X'" 961apply (erule rev_mp) 962apply (erule rev_mp) 963apply (erule kerbIV.induct) 964apply (frule_tac [7] K5_msg_in_parts_spies) 965apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 966txt\<open>K2\<close> 967apply blast 968done 969 970text\<open>servK uniquely identifies the message from Tgs\<close> 971lemma unique_servKeys: 972 "\<lbrakk> Says Tgs A 973 (Crypt K \<lbrace>Key servK, Agent B, Ts, X\<rbrace>) \<in> set evs; 974 Says Tgs A' 975 (Crypt K' \<lbrace>Key servK, Agent B', Ts', X'\<rbrace>) \<in> set evs; 976 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> A=A' \<and> B=B' \<and> K=K' \<and> Ts=Ts' \<and> X=X'" 977apply (erule rev_mp) 978apply (erule rev_mp) 979apply (erule kerbIV.induct) 980apply (frule_tac [7] K5_msg_in_parts_spies) 981apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 982txt\<open>K4\<close> 983apply blast 984done 985 986text\<open>Revised unicity theorems\<close> 987 988lemma Kas_Unique: 989 "\<lbrakk> Says Kas A 990 (Crypt Ka \<lbrace>Key authK, Agent Tgs, Ta, authTicket\<rbrace>) \<in> set evs; 991 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> 992 Unique (Says Kas A (Crypt Ka \<lbrace>Key authK, Agent Tgs, Ta, authTicket\<rbrace>)) 993 on evs" 994apply (erule rev_mp, erule kerbIV.induct, simp_all add: Unique_def) 995apply blast 996done 997 998lemma Tgs_Unique: 999 "\<lbrakk> Says Tgs A 1000 (Crypt authK \<lbrace>Key servK, Agent B, Ts, servTicket\<rbrace>) \<in> set evs; 1001 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> 1002 Unique (Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Ts, servTicket\<rbrace>)) 1003 on evs" 1004apply (erule rev_mp, erule kerbIV.induct, simp_all add: Unique_def) 1005apply blast 1006done 1007 1008 1009subsection\<open>Lemmas About the Predicate \<^term>\<open>AKcryptSK\<close>\<close> 1010 1011lemma not_AKcryptSK_Nil [iff]: "\<not> AKcryptSK authK servK []" 1012by (simp add: AKcryptSK_def) 1013 1014lemma AKcryptSKI: 1015 "\<lbrakk> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, X \<rbrace>) \<in> set evs; 1016 evs \<in> kerbIV \<rbrakk> \<Longrightarrow> AKcryptSK authK servK evs" 1017apply (unfold AKcryptSK_def) 1018apply (blast dest: Says_Tgs_message_form) 1019done 1020 1021lemma AKcryptSK_Says [simp]: 1022 "AKcryptSK authK servK (Says S A X # evs) = 1023 (Tgs = S \<and> 1024 (\<exists>B Ts. X = Crypt authK 1025 \<lbrace>Key servK, Agent B, Number Ts, 1026 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> \<rbrace>) 1027 | AKcryptSK authK servK evs)" 1028by (auto simp add: AKcryptSK_def) 1029 1030 1031(*A fresh authK cannot be associated with any other 1032 (with respect to a given trace). *) 1033lemma Auth_fresh_not_AKcryptSK: 1034 "\<lbrakk> Key authK \<notin> used evs; evs \<in> kerbIV \<rbrakk> 1035 \<Longrightarrow> \<not> AKcryptSK authK servK evs" 1036apply (unfold AKcryptSK_def) 1037apply (erule rev_mp) 1038apply (erule kerbIV.induct) 1039apply (frule_tac [7] K5_msg_in_parts_spies) 1040apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, blast) 1041done 1042 1043(*A fresh servK cannot be associated with any other 1044 (with respect to a given trace). *) 1045lemma Serv_fresh_not_AKcryptSK: 1046 "Key servK \<notin> used evs \<Longrightarrow> \<not> AKcryptSK authK servK evs" 1047by (unfold AKcryptSK_def, blast) 1048 1049lemma authK_not_AKcryptSK: 1050 "\<lbrakk> Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, tk\<rbrace> 1051 \<in> parts (spies evs); evs \<in> kerbIV \<rbrakk> 1052 \<Longrightarrow> \<not> AKcryptSK K authK evs" 1053apply (erule rev_mp) 1054apply (erule kerbIV.induct) 1055apply (frule_tac [7] K5_msg_in_parts_spies) 1056apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 1057txt\<open>Fake\<close> 1058apply blast 1059txt\<open>K2: by freshness\<close> 1060apply (simp add: AKcryptSK_def) 1061txt\<open>K4\<close> 1062apply (blast+) 1063done 1064 1065text\<open>A secure serverkey cannot have been used to encrypt others\<close> 1066lemma servK_not_AKcryptSK: 1067 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key SK, Number Ts\<rbrace> \<in> parts (spies evs); 1068 Key SK \<notin> analz (spies evs); SK \<in> symKeys; 1069 B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1070 \<Longrightarrow> \<not> AKcryptSK SK K evs" 1071apply (erule rev_mp) 1072apply (erule rev_mp) 1073apply (erule kerbIV.induct, analz_mono_contra) 1074apply (frule_tac [7] K5_msg_in_parts_spies) 1075apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, blast) 1076txt\<open>K4\<close> 1077apply (metis Auth_fresh_not_AKcryptSK Crypt_imp_keysFor new_keys_not_used parts.Fst parts.Snd Says_imp_knows_Spy [THEN parts.Inj] unique_CryptKey) 1078done 1079 1080text\<open>Long term keys are not issued as servKeys\<close> 1081lemma shrK_not_AKcryptSK: 1082 "evs \<in> kerbIV \<Longrightarrow> \<not> AKcryptSK K (shrK A) evs" 1083apply (unfold AKcryptSK_def) 1084apply (erule kerbIV.induct) 1085apply (frule_tac [7] K5_msg_in_parts_spies) 1086apply (frule_tac [5] K3_msg_in_parts_spies, auto) 1087done 1088 1089text\<open>The Tgs message associates servK with authK and therefore not with any 1090 other key authK.\<close> 1091lemma Says_Tgs_AKcryptSK: 1092 "\<lbrakk> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, X \<rbrace>) 1093 \<in> set evs; 1094 authK' \<noteq> authK; evs \<in> kerbIV \<rbrakk> 1095 \<Longrightarrow> \<not> AKcryptSK authK' servK evs" 1096apply (unfold AKcryptSK_def) 1097apply (blast dest: unique_servKeys) 1098done 1099 1100text\<open>Equivalently\<close> 1101lemma not_different_AKcryptSK: 1102 "\<lbrakk> AKcryptSK authK servK evs; 1103 authK' \<noteq> authK; evs \<in> kerbIV \<rbrakk> 1104 \<Longrightarrow> \<not> AKcryptSK authK' servK evs \<and> servK \<in> symKeys" 1105apply (simp add: AKcryptSK_def) 1106apply (blast dest: unique_servKeys Says_Tgs_message_form) 1107done 1108 1109lemma AKcryptSK_not_AKcryptSK: 1110 "\<lbrakk> AKcryptSK authK servK evs; evs \<in> kerbIV \<rbrakk> 1111 \<Longrightarrow> \<not> AKcryptSK servK K evs" 1112apply (erule rev_mp) 1113apply (erule kerbIV.induct) 1114apply (frule_tac [7] K5_msg_in_parts_spies) 1115apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 1116apply (metis Auth_fresh_not_AKcryptSK Says_imp_spies authK_not_AKcryptSK 1117 authKeys_used authTicket_crypt_authK parts.Fst parts.Inj) 1118done 1119 1120text\<open>The only session keys that can be found with the help of session keys are 1121 those sent by Tgs in step K4.\<close> 1122 1123text\<open>We take some pains to express the property 1124 as a logical equivalence so that the simplifier can apply it.\<close> 1125lemma Key_analz_image_Key_lemma: 1126 "P \<longrightarrow> (Key K \<in> analz (Key`KK \<union> H)) \<longrightarrow> (K\<in>KK | Key K \<in> analz H) 1127 \<Longrightarrow> 1128 P \<longrightarrow> (Key K \<in> analz (Key`KK \<union> H)) = (K\<in>KK | Key K \<in> analz H)" 1129by (blast intro: analz_mono [THEN subsetD]) 1130 1131 1132lemma AKcryptSK_analz_insert: 1133 "\<lbrakk> AKcryptSK K K' evs; K \<in> symKeys; evs \<in> kerbIV \<rbrakk> 1134 \<Longrightarrow> Key K' \<in> analz (insert (Key K) (spies evs))" 1135apply (simp add: AKcryptSK_def, clarify) 1136apply (drule Says_imp_spies [THEN analz.Inj, THEN analz_insertI], auto) 1137done 1138 1139lemma authKeys_are_not_AKcryptSK: 1140 "\<lbrakk> K \<in> authKeys evs \<union> range shrK; evs \<in> kerbIV \<rbrakk> 1141 \<Longrightarrow> \<forall>SK. \<not> AKcryptSK SK K evs \<and> K \<in> symKeys" 1142apply (simp add: authKeys_def AKcryptSK_def) 1143apply (blast dest: Says_Kas_message_form Says_Tgs_message_form) 1144done 1145 1146lemma not_authKeys_not_AKcryptSK: 1147 "\<lbrakk> K \<notin> authKeys evs; 1148 K \<notin> range shrK; evs \<in> kerbIV \<rbrakk> 1149 \<Longrightarrow> \<forall>SK. \<not> AKcryptSK K SK evs" 1150apply (simp add: AKcryptSK_def) 1151apply (blast dest: Says_Tgs_message_form) 1152done 1153 1154 1155subsection\<open>Secrecy Theorems\<close> 1156 1157text\<open>For the Oops2 case of the next theorem\<close> 1158lemma Oops2_not_AKcryptSK: 1159 "\<lbrakk> evs \<in> kerbIV; 1160 Says Tgs A (Crypt authK 1161 \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 1162 \<in> set evs \<rbrakk> 1163 \<Longrightarrow> \<not> AKcryptSK servK SK evs" 1164by (blast dest: AKcryptSKI AKcryptSK_not_AKcryptSK) 1165 1166text\<open>Big simplification law for keys SK that are not crypted by keys in KK 1167 It helps prove three, otherwise hard, facts about keys. These facts are 1168 exploited as simplification laws for analz, and also "limit the damage" 1169 in case of loss of a key to the spy. See ESORICS98. 1170 [simplified by LCP]\<close> 1171lemma Key_analz_image_Key [rule_format (no_asm)]: 1172 "evs \<in> kerbIV \<Longrightarrow> 1173 (\<forall>SK KK. SK \<in> symKeys \<and> KK \<subseteq> -(range shrK) \<longrightarrow> 1174 (\<forall>K \<in> KK. \<not> AKcryptSK K SK evs) \<longrightarrow> 1175 (Key SK \<in> analz (Key`KK \<union> (spies evs))) = 1176 (SK \<in> KK | Key SK \<in> analz (spies evs)))" 1177apply (erule kerbIV.induct) 1178apply (frule_tac [10] Oops_range_spies2) 1179apply (frule_tac [9] Oops_range_spies1) 1180apply (frule_tac [7] Says_tgs_message_form) 1181apply (frule_tac [5] Says_kas_message_form) 1182apply (safe del: impI intro!: Key_analz_image_Key_lemma [THEN impI]) 1183txt\<open>Case-splits for Oops1 and message 5: the negated case simplifies using 1184 the induction hypothesis\<close> 1185apply (case_tac [11] "AKcryptSK authK SK evsO1") 1186apply (case_tac [8] "AKcryptSK servK SK evs5") 1187apply (simp_all del: image_insert 1188 add: analz_image_freshK_simps AKcryptSK_Says shrK_not_AKcryptSK 1189 Oops2_not_AKcryptSK Auth_fresh_not_AKcryptSK 1190 Serv_fresh_not_AKcryptSK Says_Tgs_AKcryptSK Spy_analz_shrK) 1191txt\<open>Fake\<close> 1192apply spy_analz 1193txt\<open>K2\<close> 1194apply blast 1195txt\<open>K3\<close> 1196apply blast 1197txt\<open>K4\<close> 1198apply (blast dest!: authK_not_AKcryptSK) 1199txt\<open>K5\<close> 1200apply (case_tac "Key servK \<in> analz (spies evs5) ") 1201txt\<open>If servK is compromised then the result follows directly...\<close> 1202apply (simp (no_asm_simp) add: analz_insert_eq Un_upper2 [THEN analz_mono, THEN subsetD]) 1203txt\<open>...therefore servK is uncompromised.\<close> 1204txt\<open>The AKcryptSK servK SK evs5 case leads to a contradiction.\<close> 1205apply (blast elim!: servK_not_AKcryptSK [THEN [2] rev_notE] del: allE ballE) 1206txt\<open>Another K5 case\<close> 1207apply blast 1208txt\<open>Oops1\<close> 1209apply simp 1210apply (blast dest!: AKcryptSK_analz_insert) 1211done 1212 1213text\<open>First simplification law for analz: no session keys encrypt 1214authentication keys or shared keys.\<close> 1215lemma analz_insert_freshK1: 1216 "\<lbrakk> evs \<in> kerbIV; K \<in> authKeys evs \<union> range shrK; 1217 SesKey \<notin> range shrK \<rbrakk> 1218 \<Longrightarrow> (Key K \<in> analz (insert (Key SesKey) (spies evs))) = 1219 (K = SesKey | Key K \<in> analz (spies evs))" 1220apply (frule authKeys_are_not_AKcryptSK, assumption) 1221apply (simp del: image_insert 1222 add: analz_image_freshK_simps add: Key_analz_image_Key) 1223done 1224 1225 1226text\<open>Second simplification law for analz: no service keys encrypt any other keys.\<close> 1227lemma analz_insert_freshK2: 1228 "\<lbrakk> evs \<in> kerbIV; servK \<notin> (authKeys evs); servK \<notin> range shrK; 1229 K \<in> symKeys \<rbrakk> 1230 \<Longrightarrow> (Key K \<in> analz (insert (Key servK) (spies evs))) = 1231 (K = servK | Key K \<in> analz (spies evs))" 1232apply (frule not_authKeys_not_AKcryptSK, assumption, assumption) 1233apply (simp del: image_insert 1234 add: analz_image_freshK_simps add: Key_analz_image_Key) 1235done 1236 1237 1238text\<open>Third simplification law for analz: only one authentication key encrypts a certain service key.\<close> 1239 1240lemma analz_insert_freshK3: 1241 "\<lbrakk> AKcryptSK authK servK evs; 1242 authK' \<noteq> authK; authK' \<notin> range shrK; evs \<in> kerbIV \<rbrakk> 1243 \<Longrightarrow> (Key servK \<in> analz (insert (Key authK') (spies evs))) = 1244 (servK = authK' | Key servK \<in> analz (spies evs))" 1245apply (drule_tac authK' = authK' in not_different_AKcryptSK, blast, assumption) 1246apply (simp del: image_insert 1247 add: analz_image_freshK_simps add: Key_analz_image_Key) 1248done 1249 1250lemma analz_insert_freshK3_bis: 1251 "\<lbrakk> Says Tgs A 1252 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 1253 \<in> set evs; 1254 authK \<noteq> authK'; authK' \<notin> range shrK; evs \<in> kerbIV \<rbrakk> 1255 \<Longrightarrow> (Key servK \<in> analz (insert (Key authK') (spies evs))) = 1256 (servK = authK' | Key servK \<in> analz (spies evs))" 1257apply (frule AKcryptSKI, assumption) 1258apply (simp add: analz_insert_freshK3) 1259done 1260 1261text\<open>a weakness of the protocol\<close> 1262lemma authK_compromises_servK: 1263 "\<lbrakk> Says Tgs A 1264 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 1265 \<in> set evs; authK \<in> symKeys; 1266 Key authK \<in> analz (spies evs); evs \<in> kerbIV \<rbrakk> 1267 \<Longrightarrow> Key servK \<in> analz (spies evs)" 1268 by (metis Says_imp_analz_Spy analz.Fst analz_Decrypt') 1269 1270lemma servK_notin_authKeysD: 1271 "\<lbrakk> Crypt authK \<lbrace>Key servK, Agent B, Ts, 1272 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Ts\<rbrace>\<rbrace> 1273 \<in> parts (spies evs); 1274 Key servK \<notin> analz (spies evs); 1275 B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1276 \<Longrightarrow> servK \<notin> authKeys evs" 1277apply (erule rev_mp) 1278apply (erule rev_mp) 1279apply (simp add: authKeys_def) 1280apply (erule kerbIV.induct, analz_mono_contra) 1281apply (frule_tac [7] K5_msg_in_parts_spies) 1282apply (frule_tac [5] K3_msg_in_parts_spies, simp_all) 1283apply (blast+) 1284done 1285 1286 1287text\<open>If Spy sees the Authentication Key sent in msg K2, then 1288 the Key has expired.\<close> 1289lemma Confidentiality_Kas_lemma [rule_format]: 1290 "\<lbrakk> authK \<in> symKeys; A \<notin> bad; evs \<in> kerbIV \<rbrakk> 1291 \<Longrightarrow> Says Kas A 1292 (Crypt (shrK A) 1293 \<lbrace>Key authK, Agent Tgs, Number Ta, 1294 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace>\<rbrace>) 1295 \<in> set evs \<longrightarrow> 1296 Key authK \<in> analz (spies evs) \<longrightarrow> 1297 expiredAK Ta evs" 1298apply (erule kerbIV.induct) 1299apply (frule_tac [10] Oops_range_spies2) 1300apply (frule_tac [9] Oops_range_spies1) 1301apply (frule_tac [7] Says_tgs_message_form) 1302apply (frule_tac [5] Says_kas_message_form) 1303apply (safe del: impI conjI impCE) 1304apply (simp_all (no_asm_simp) add: Says_Kas_message_form less_SucI analz_insert_eq not_parts_not_analz analz_insert_freshK1 pushes) 1305txt\<open>Fake\<close> 1306apply spy_analz 1307txt\<open>K2\<close> 1308apply blast 1309txt\<open>K4\<close> 1310apply blast 1311txt\<open>Level 8: K5\<close> 1312apply (blast dest: servK_notin_authKeysD Says_Kas_message_form intro: less_SucI) 1313txt\<open>Oops1\<close> 1314apply (blast dest!: unique_authKeys intro: less_SucI) 1315txt\<open>Oops2\<close> 1316apply (blast dest: Says_Tgs_message_form Says_Kas_message_form) 1317done 1318 1319lemma Confidentiality_Kas: 1320 "\<lbrakk> Says Kas A 1321 (Crypt Ka \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace>) 1322 \<in> set evs; 1323 \<not> expiredAK Ta evs; 1324 A \<notin> bad; evs \<in> kerbIV \<rbrakk> 1325 \<Longrightarrow> Key authK \<notin> analz (spies evs)" 1326by (blast dest: Says_Kas_message_form Confidentiality_Kas_lemma) 1327 1328text\<open>If Spy sees the Service Key sent in msg K4, then 1329 the Key has expired.\<close> 1330 1331lemma Confidentiality_lemma [rule_format]: 1332 "\<lbrakk> Says Tgs A 1333 (Crypt authK 1334 \<lbrace>Key servK, Agent B, Number Ts, 1335 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>\<rbrace>) 1336 \<in> set evs; 1337 Key authK \<notin> analz (spies evs); 1338 servK \<in> symKeys; 1339 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1340 \<Longrightarrow> Key servK \<in> analz (spies evs) \<longrightarrow> 1341 expiredSK Ts evs" 1342apply (erule rev_mp) 1343apply (erule rev_mp) 1344apply (erule kerbIV.induct) 1345apply (rule_tac [9] impI)+ 1346 \<comment> \<open>The Oops1 case is unusual: must simplify 1347 \<^term>\<open>Authkey \<notin> analz (spies (ev#evs))\<close>, not letting 1348 \<open>analz_mono_contra\<close> weaken it to 1349 \<^term>\<open>Authkey \<notin> analz (spies evs)\<close>, 1350 for we then conclude \<^term>\<open>authK \<noteq> authKa\<close>.\<close> 1351apply analz_mono_contra 1352apply (frule_tac [10] Oops_range_spies2) 1353apply (frule_tac [9] Oops_range_spies1) 1354apply (frule_tac [7] Says_tgs_message_form) 1355apply (frule_tac [5] Says_kas_message_form) 1356apply (safe del: impI conjI impCE) 1357apply (simp_all add: less_SucI new_keys_not_analzd Says_Kas_message_form Says_Tgs_message_form analz_insert_eq not_parts_not_analz analz_insert_freshK1 analz_insert_freshK2 analz_insert_freshK3_bis pushes) 1358txt\<open>Fake\<close> 1359 apply spy_analz 1360txt\<open>K2\<close> 1361 apply (blast intro: parts_insertI less_SucI) 1362txt\<open>K4\<close> 1363 apply (blast dest: authTicket_authentic Confidentiality_Kas) 1364txt\<open>K5\<close> 1365 apply (metis Says_imp_spies Says_ticket_parts Tgs_not_bad analz_insert_freshK2 1366 less_SucI parts.Inj servK_notin_authKeysD unique_CryptKey) 1367txt\<open>Oops1\<close> 1368 apply (blast dest: Says_Kas_message_form Says_Tgs_message_form intro: less_SucI) 1369txt\<open>Oops2\<close> 1370apply (blast dest: Says_imp_spies [THEN parts.Inj] Key_unique_SesKey intro: less_SucI) 1371done 1372 1373 1374text\<open>In the real world Tgs can't check wheter authK is secure!\<close> 1375lemma Confidentiality_Tgs: 1376 "\<lbrakk> Says Tgs A 1377 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 1378 \<in> set evs; 1379 Key authK \<notin> analz (spies evs); 1380 \<not> expiredSK Ts evs; 1381 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1382 \<Longrightarrow> Key servK \<notin> analz (spies evs)" 1383by (blast dest: Says_Tgs_message_form Confidentiality_lemma) 1384 1385text\<open>In the real world Tgs CAN check what Kas sends!\<close> 1386lemma Confidentiality_Tgs_bis: 1387 "\<lbrakk> Says Kas A 1388 (Crypt Ka \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace>) 1389 \<in> set evs; 1390 Says Tgs A 1391 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 1392 \<in> set evs; 1393 \<not> expiredAK Ta evs; \<not> expiredSK Ts evs; 1394 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1395 \<Longrightarrow> Key servK \<notin> analz (spies evs)" 1396by (blast dest!: Confidentiality_Kas Confidentiality_Tgs) 1397 1398text\<open>Most general form\<close> 1399lemmas Confidentiality_Tgs_ter = authTicket_authentic [THEN Confidentiality_Tgs_bis] 1400 1401lemmas Confidentiality_Auth_A = authK_authentic [THEN Confidentiality_Kas] 1402 1403text\<open>Needs a confidentiality guarantee, hence moved here. 1404 Authenticity of servK for A\<close> 1405lemma servK_authentic_bis_r: 1406 "\<lbrakk> Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1407 \<in> parts (spies evs); 1408 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1409 \<in> parts (spies evs); 1410 \<not> expiredAK Ta evs; A \<notin> bad; evs \<in> kerbIV \<rbrakk> 1411 \<Longrightarrow>Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 1412 \<in> set evs" 1413by (blast dest: authK_authentic Confidentiality_Auth_A servK_authentic_ter) 1414 1415lemma Confidentiality_Serv_A: 1416 "\<lbrakk> Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1417 \<in> parts (spies evs); 1418 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1419 \<in> parts (spies evs); 1420 \<not> expiredAK Ta evs; \<not> expiredSK Ts evs; 1421 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1422 \<Longrightarrow> Key servK \<notin> analz (spies evs)" 1423apply (drule authK_authentic, assumption, assumption) 1424apply (blast dest: Confidentiality_Kas Says_Kas_message_form servK_authentic_ter Confidentiality_Tgs_bis) 1425done 1426 1427lemma Confidentiality_B: 1428 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1429 \<in> parts (spies evs); 1430 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1431 \<in> parts (spies evs); 1432 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1433 \<in> parts (spies evs); 1434 \<not> expiredSK Ts evs; \<not> expiredAK Ta evs; 1435 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1436 \<Longrightarrow> Key servK \<notin> analz (spies evs)" 1437apply (frule authK_authentic) 1438apply (frule_tac [3] Confidentiality_Kas) 1439apply (frule_tac [6] servTicket_authentic, auto) 1440apply (blast dest!: Confidentiality_Tgs_bis dest: Says_Kas_message_form servK_authentic unique_servKeys unique_authKeys) 1441done 1442(* 1443The proof above is fast. It can be done in one command in 17 secs: 1444apply (blast dest: authK_authentic servK_authentic 1445 Says_Kas_message_form servTicket_authentic 1446 unique_servKeys unique_authKeys 1447 Confidentiality_Kas 1448 Confidentiality_Tgs_bis) 1449It is very brittle: we can't use this command partway 1450through the script above. 1451*) 1452 1453lemma u_Confidentiality_B: 1454 "\<lbrakk> Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1455 \<in> parts (spies evs); 1456 \<not> expiredSK Ts evs; 1457 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1458 \<Longrightarrow> Key servK \<notin> analz (spies evs)" 1459by (blast dest: u_servTicket_authentic u_NotexpiredSK_NotexpiredAK Confidentiality_Tgs_bis) 1460 1461 1462 1463subsection\<open>Parties authentication: each party verifies "the identity of 1464 another party who generated some data" (quoted from Neuman and Ts'o).\<close> 1465 1466text\<open>These guarantees don't assess whether two parties agree on 1467 the same session key: sending a message containing a key 1468 doesn't a priori state knowledge of the key.\<close> 1469 1470 1471text\<open>\<open>Tgs_authenticates_A\<close> can be found above\<close> 1472 1473lemma A_authenticates_Tgs: 1474 "\<lbrakk> Says Kas A 1475 (Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace>) \<in> set evs; 1476 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1477 \<in> parts (spies evs); 1478 Key authK \<notin> analz (spies evs); 1479 evs \<in> kerbIV \<rbrakk> 1480 \<Longrightarrow> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace>) 1481 \<in> set evs" 1482apply (frule Says_Kas_message_form, assumption) 1483apply (erule rev_mp) 1484apply (erule rev_mp) 1485apply (erule rev_mp) 1486apply (erule kerbIV.induct, analz_mono_contra) 1487apply (frule_tac [7] K5_msg_in_parts_spies) 1488apply (frule_tac [5] K3_msg_in_parts_spies, simp_all, blast) 1489txt\<open>K2\<close> 1490apply (blast dest!: servK_authentic Says_Tgs_message_form authKeys_used) 1491txt\<open>K4\<close> 1492apply (blast dest!: unique_CryptKey) 1493done 1494 1495 1496lemma B_authenticates_A: 1497 "\<lbrakk> Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<in> parts (spies evs); 1498 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1499 \<in> parts (spies evs); 1500 Key servK \<notin> analz (spies evs); 1501 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1502 \<Longrightarrow> Says A B \<lbrace>Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>, 1503 Crypt servK \<lbrace>Agent A, Number T3\<rbrace>\<rbrace> \<in> set evs" 1504by (blast dest: servTicket_authentic_Tgs intro: Says_K5) 1505 1506text\<open>The second assumption tells B what kind of key servK is.\<close> 1507lemma B_authenticates_A_r: 1508 "\<lbrakk> Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<in> parts (spies evs); 1509 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1510 \<in> parts (spies evs); 1511 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1512 \<in> parts (spies evs); 1513 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1514 \<in> parts (spies evs); 1515 \<not> expiredSK Ts evs; \<not> expiredAK Ta evs; 1516 B \<noteq> Tgs; A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1517 \<Longrightarrow> Says A B \<lbrace>Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>, 1518 Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<rbrace> \<in> set evs" 1519by (blast intro: Says_K5 dest: Confidentiality_B servTicket_authentic_Tgs) 1520 1521text\<open>\<open>u_B_authenticates_A\<close> would be the same as \<open>B_authenticates_A\<close> because the servK confidentiality assumption is yet unrelaxed\<close> 1522 1523lemma u_B_authenticates_A_r: 1524 "\<lbrakk> Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<in> parts (spies evs); 1525 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1526 \<in> parts (spies evs); 1527 \<not> expiredSK Ts evs; 1528 B \<noteq> Tgs; A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1529 \<Longrightarrow> Says A B \<lbrace>Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace>, 1530 Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<rbrace> \<in> set evs" 1531by (blast intro: Says_K5 dest: u_Confidentiality_B servTicket_authentic_Tgs) 1532 1533lemma A_authenticates_B: 1534 "\<lbrakk> Crypt servK (Number T3) \<in> parts (spies evs); 1535 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1536 \<in> parts (spies evs); 1537 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1538 \<in> parts (spies evs); 1539 Key authK \<notin> analz (spies evs); Key servK \<notin> analz (spies evs); 1540 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1541 \<Longrightarrow> Says B A (Crypt servK (Number T3)) \<in> set evs" 1542by (blast dest: authK_authentic servK_authentic Says_Kas_message_form Key_unique_SesKey K4_imp_K2 intro: Says_K6) 1543 1544lemma A_authenticates_B_r: 1545 "\<lbrakk> Crypt servK (Number T3) \<in> parts (spies evs); 1546 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1547 \<in> parts (spies evs); 1548 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1549 \<in> parts (spies evs); 1550 \<not> expiredAK Ta evs; \<not> expiredSK Ts evs; 1551 A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1552 \<Longrightarrow> Says B A (Crypt servK (Number T3)) \<in> set evs" 1553apply (frule authK_authentic) 1554apply (frule_tac [3] Says_Kas_message_form) 1555apply (frule_tac [4] Confidentiality_Kas) 1556apply (frule_tac [7] servK_authentic) 1557prefer 8 apply blast 1558apply (erule_tac [9] exE) 1559apply (frule_tac [9] K4_imp_K2) 1560apply assumption+ 1561apply (blast dest: Key_unique_SesKey intro!: Says_K6 dest: Confidentiality_Tgs 1562) 1563done 1564 1565 1566subsection\<open>Key distribution guarantees 1567 An agent knows a session key if he used it to issue a cipher. 1568 These guarantees also convey a stronger form of 1569 authentication - non-injective agreement on the session key\<close> 1570 1571 1572lemma Kas_Issues_A: 1573 "\<lbrakk> Says Kas A (Crypt (shrK A) \<lbrace>Key authK, Peer, Ta, authTicket\<rbrace>) \<in> set evs; 1574 evs \<in> kerbIV \<rbrakk> 1575 \<Longrightarrow> Kas Issues A with (Crypt (shrK A) \<lbrace>Key authK, Peer, Ta, authTicket\<rbrace>) 1576 on evs" 1577apply (simp (no_asm) add: Issues_def) 1578apply (rule exI) 1579apply (rule conjI, assumption) 1580apply (simp (no_asm)) 1581apply (erule rev_mp) 1582apply (erule kerbIV.induct) 1583apply (frule_tac [5] Says_ticket_parts) 1584apply (frule_tac [7] Says_ticket_parts) 1585apply (simp_all (no_asm_simp) add: all_conj_distrib) 1586txt\<open>K2\<close> 1587apply (simp add: takeWhile_tail) 1588apply (blast dest: authK_authentic parts_spies_takeWhile_mono [THEN subsetD] parts_spies_evs_revD2 [THEN subsetD]) 1589done 1590 1591lemma A_authenticates_and_keydist_to_Kas: 1592 "\<lbrakk> Crypt (shrK A) \<lbrace>Key authK, Peer, Ta, authTicket\<rbrace> \<in> parts (spies evs); 1593 A \<notin> bad; evs \<in> kerbIV \<rbrakk> 1594 \<Longrightarrow> Kas Issues A with (Crypt (shrK A) \<lbrace>Key authK, Peer, Ta, authTicket\<rbrace>) 1595 on evs" 1596by (blast dest: authK_authentic Kas_Issues_A) 1597 1598lemma honest_never_says_newer_timestamp_in_auth: 1599 "\<lbrakk> (CT evs) \<le> T; A \<notin> bad; Number T \<in> parts {X}; evs \<in> kerbIV \<rbrakk> 1600 \<Longrightarrow> \<forall> B Y. Says A B \<lbrace>Y, X\<rbrace> \<notin> set evs" 1601apply (erule rev_mp) 1602apply (erule kerbIV.induct) 1603apply force+ 1604done 1605 1606lemma honest_never_says_current_timestamp_in_auth: 1607 "\<lbrakk> (CT evs) = T; Number T \<in> parts {X}; evs \<in> kerbIV \<rbrakk> 1608 \<Longrightarrow> \<forall> A B Y. A \<notin> bad \<longrightarrow> Says A B \<lbrace>Y, X\<rbrace> \<notin> set evs" 1609 by (metis eq_imp_le honest_never_says_newer_timestamp_in_auth) 1610 1611lemma A_trusts_secure_authenticator: 1612 "\<lbrakk> Crypt K \<lbrace>Agent A, Number T\<rbrace> \<in> parts (spies evs); 1613 Key K \<notin> analz (spies evs); evs \<in> kerbIV \<rbrakk> 1614\<Longrightarrow> \<exists> B X. Says A Tgs \<lbrace>X, Crypt K \<lbrace>Agent A, Number T\<rbrace>, Agent B\<rbrace> \<in> set evs \<or> 1615 Says A B \<lbrace>X, Crypt K \<lbrace>Agent A, Number T\<rbrace>\<rbrace> \<in> set evs" 1616apply (erule rev_mp) 1617apply (erule rev_mp) 1618apply (erule kerbIV.induct, analz_mono_contra) 1619apply (frule_tac [5] Says_ticket_parts) 1620apply (frule_tac [7] Says_ticket_parts) 1621apply (simp_all add: all_conj_distrib) 1622apply blast+ 1623done 1624 1625lemma A_Issues_Tgs: 1626 "\<lbrakk> Says A Tgs \<lbrace>authTicket, Crypt authK \<lbrace>Agent A, Number T2\<rbrace>, Agent B\<rbrace> 1627 \<in> set evs; 1628 Key authK \<notin> analz (spies evs); 1629 A \<notin> bad; evs \<in> kerbIV \<rbrakk> 1630 \<Longrightarrow> A Issues Tgs with (Crypt authK \<lbrace>Agent A, Number T2\<rbrace>) on evs" 1631apply (simp (no_asm) add: Issues_def) 1632apply (rule exI) 1633apply (rule conjI, assumption) 1634apply (simp (no_asm)) 1635apply (erule rev_mp) 1636apply (erule rev_mp) 1637apply (erule kerbIV.induct, analz_mono_contra) 1638apply (frule_tac [5] Says_ticket_parts) 1639apply (frule_tac [7] Says_ticket_parts) 1640apply (simp_all (no_asm_simp) add: all_conj_distrib) 1641txt\<open>fake\<close> 1642apply blast 1643txt\<open>K3\<close> 1644(* 1645apply clarify 1646apply (drule Says_imp_knows_Spy [THEN parts.Inj, THEN authK_authentic, THEN Says_Kas_message_form], assumption, assumption, assumption) 1647*) 1648apply (simp add: takeWhile_tail) 1649apply auto 1650apply (force dest!: authK_authentic Says_Kas_message_form) 1651apply (drule parts_spies_takeWhile_mono [THEN subsetD, THEN parts_spies_evs_revD2 [THEN subsetD]]) 1652apply (drule A_trusts_secure_authenticator, assumption, assumption) 1653apply (simp add: honest_never_says_current_timestamp_in_auth) 1654done 1655 1656lemma Tgs_authenticates_and_keydist_to_A: 1657 "\<lbrakk> Crypt authK \<lbrace>Agent A, Number T2\<rbrace> \<in> parts (spies evs); 1658 Crypt (shrK Tgs) \<lbrace>Agent A, Agent Tgs, Key authK, Number Ta\<rbrace> 1659 \<in> parts (spies evs); 1660 Key authK \<notin> analz (spies evs); 1661 A \<notin> bad; evs \<in> kerbIV \<rbrakk> 1662 \<Longrightarrow> A Issues Tgs with (Crypt authK \<lbrace>Agent A, Number T2\<rbrace>) on evs" 1663by (blast dest: A_Issues_Tgs Tgs_authenticates_A) 1664 1665lemma Tgs_Issues_A: 1666 "\<lbrakk> Says Tgs A (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket \<rbrace>) 1667 \<in> set evs; 1668 Key authK \<notin> analz (spies evs); evs \<in> kerbIV \<rbrakk> 1669 \<Longrightarrow> Tgs Issues A with 1670 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket \<rbrace>) on evs" 1671apply (simp (no_asm) add: Issues_def) 1672apply (rule exI) 1673apply (rule conjI, assumption) 1674apply (simp (no_asm)) 1675apply (erule rev_mp) 1676apply (erule rev_mp) 1677apply (erule kerbIV.induct, analz_mono_contra) 1678apply (frule_tac [5] Says_ticket_parts) 1679apply (frule_tac [7] Says_ticket_parts) 1680apply (simp_all (no_asm_simp) add: all_conj_distrib) 1681txt\<open>K4\<close> 1682apply (simp add: takeWhile_tail) 1683(*Last two thms installed only to derive authK \<notin> range shrK*) 1684apply (metis knows_Spy_partsEs(2) parts.Fst usedI used_evs_rev used_takeWhile_used) 1685done 1686 1687lemma A_authenticates_and_keydist_to_Tgs: 1688"\<lbrakk>Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> \<in> parts (spies evs); 1689 Key authK \<notin> analz (spies evs); B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1690 \<Longrightarrow> \<exists>A. Tgs Issues A with 1691 (Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket \<rbrace>) on evs" 1692by (blast dest: Tgs_Issues_A servK_authentic_bis) 1693 1694 1695 1696lemma B_Issues_A: 1697 "\<lbrakk> Says B A (Crypt servK (Number T3)) \<in> set evs; 1698 Key servK \<notin> analz (spies evs); 1699 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1700 \<Longrightarrow> B Issues A with (Crypt servK (Number T3)) on evs" 1701apply (simp (no_asm) add: Issues_def) 1702apply (rule exI) 1703apply (rule conjI, assumption) 1704apply (simp (no_asm)) 1705apply (erule rev_mp) 1706apply (erule rev_mp) 1707apply (erule kerbIV.induct, analz_mono_contra) 1708apply (frule_tac [5] Says_ticket_parts) 1709apply (frule_tac [7] Says_ticket_parts) 1710apply (simp_all (no_asm_simp) add: all_conj_distrib) 1711apply blast 1712txt\<open>K6 requires numerous lemmas\<close> 1713apply (simp add: takeWhile_tail) 1714apply (blast dest: servTicket_authentic parts_spies_takeWhile_mono [THEN subsetD] parts_spies_evs_revD2 [THEN subsetD] intro: Says_K6) 1715done 1716 1717lemma B_Issues_A_r: 1718 "\<lbrakk> Says B A (Crypt servK (Number T3)) \<in> set evs; 1719 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1720 \<in> parts (spies evs); 1721 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1722 \<in> parts (spies evs); 1723 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1724 \<in> parts (spies evs); 1725 \<not> expiredSK Ts evs; \<not> expiredAK Ta evs; 1726 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1727 \<Longrightarrow> B Issues A with (Crypt servK (Number T3)) on evs" 1728by (blast dest!: Confidentiality_B B_Issues_A) 1729 1730lemma u_B_Issues_A_r: 1731 "\<lbrakk> Says B A (Crypt servK (Number T3)) \<in> set evs; 1732 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1733 \<in> parts (spies evs); 1734 \<not> expiredSK Ts evs; 1735 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1736 \<Longrightarrow> B Issues A with (Crypt servK (Number T3)) on evs" 1737by (blast dest!: u_Confidentiality_B B_Issues_A) 1738 1739lemma A_authenticates_and_keydist_to_B: 1740 "\<lbrakk> Crypt servK (Number T3) \<in> parts (spies evs); 1741 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1742 \<in> parts (spies evs); 1743 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1744 \<in> parts (spies evs); 1745 Key authK \<notin> analz (spies evs); Key servK \<notin> analz (spies evs); 1746 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1747 \<Longrightarrow> B Issues A with (Crypt servK (Number T3)) on evs" 1748by (blast dest!: A_authenticates_B B_Issues_A) 1749 1750lemma A_authenticates_and_keydist_to_B_r: 1751 "\<lbrakk> Crypt servK (Number T3) \<in> parts (spies evs); 1752 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1753 \<in> parts (spies evs); 1754 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1755 \<in> parts (spies evs); 1756 \<not> expiredAK Ta evs; \<not> expiredSK Ts evs; 1757 A \<notin> bad; B \<notin> bad; B \<noteq> Tgs; evs \<in> kerbIV \<rbrakk> 1758 \<Longrightarrow> B Issues A with (Crypt servK (Number T3)) on evs" 1759by (blast dest!: A_authenticates_B_r Confidentiality_Serv_A B_Issues_A) 1760 1761 1762lemma A_Issues_B: 1763 "\<lbrakk> Says A B \<lbrace>servTicket, Crypt servK \<lbrace>Agent A, Number T3\<rbrace>\<rbrace> 1764 \<in> set evs; 1765 Key servK \<notin> analz (spies evs); 1766 B \<noteq> Tgs; A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1767 \<Longrightarrow> A Issues B with (Crypt servK \<lbrace>Agent A, Number T3\<rbrace>) on evs" 1768apply (simp (no_asm) add: Issues_def) 1769apply (rule exI) 1770apply (rule conjI, assumption) 1771apply (simp (no_asm)) 1772apply (erule rev_mp) 1773apply (erule rev_mp) 1774apply (erule kerbIV.induct, analz_mono_contra) 1775apply (frule_tac [5] Says_ticket_parts) 1776apply (frule_tac [7] Says_ticket_parts) 1777apply (simp_all (no_asm_simp)) 1778apply clarify 1779txt\<open>K5\<close> 1780apply auto 1781apply (simp add: takeWhile_tail) 1782txt\<open>Level 15: case analysis necessary because the assumption doesn't state 1783 the form of servTicket. The guarantee becomes stronger.\<close> 1784apply (blast dest: Says_imp_spies [THEN analz.Inj, THEN analz_Decrypt'] 1785 K3_imp_K2 servK_authentic_ter 1786 parts_spies_takeWhile_mono [THEN subsetD] 1787 parts_spies_evs_revD2 [THEN subsetD] 1788 intro: Says_K5) 1789apply (simp add: takeWhile_tail) 1790done 1791 1792lemma A_Issues_B_r: 1793 "\<lbrakk> Says A B \<lbrace>servTicket, Crypt servK \<lbrace>Agent A, Number T3\<rbrace>\<rbrace> 1794 \<in> set evs; 1795 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1796 \<in> parts (spies evs); 1797 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1798 \<in> parts (spies evs); 1799 \<not> expiredAK Ta evs; \<not> expiredSK Ts evs; 1800 B \<noteq> Tgs; A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1801 \<Longrightarrow> A Issues B with (Crypt servK \<lbrace>Agent A, Number T3\<rbrace>) on evs" 1802by (blast dest!: Confidentiality_Serv_A A_Issues_B) 1803 1804lemma B_authenticates_and_keydist_to_A: 1805 "\<lbrakk> Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<in> parts (spies evs); 1806 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1807 \<in> parts (spies evs); 1808 Key servK \<notin> analz (spies evs); 1809 B \<noteq> Tgs; A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1810 \<Longrightarrow> A Issues B with (Crypt servK \<lbrace>Agent A, Number T3\<rbrace>) on evs" 1811by (blast dest: B_authenticates_A A_Issues_B) 1812 1813lemma B_authenticates_and_keydist_to_A_r: 1814 "\<lbrakk> Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<in> parts (spies evs); 1815 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1816 \<in> parts (spies evs); 1817 Crypt authK \<lbrace>Key servK, Agent B, Number Ts, servTicket\<rbrace> 1818 \<in> parts (spies evs); 1819 Crypt (shrK A) \<lbrace>Key authK, Agent Tgs, Number Ta, authTicket\<rbrace> 1820 \<in> parts (spies evs); 1821 \<not> expiredSK Ts evs; \<not> expiredAK Ta evs; 1822 B \<noteq> Tgs; A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1823 \<Longrightarrow> A Issues B with (Crypt servK \<lbrace>Agent A, Number T3\<rbrace>) on evs" 1824by (blast dest: B_authenticates_A Confidentiality_B A_Issues_B) 1825 1826text\<open>\<open>u_B_authenticates_and_keydist_to_A\<close> would be the same as \<open>B_authenticates_and_keydist_to_A\<close> because the 1827 servK confidentiality assumption is yet unrelaxed\<close> 1828 1829lemma u_B_authenticates_and_keydist_to_A_r: 1830 "\<lbrakk> Crypt servK \<lbrace>Agent A, Number T3\<rbrace> \<in> parts (spies evs); 1831 Crypt (shrK B) \<lbrace>Agent A, Agent B, Key servK, Number Ts\<rbrace> 1832 \<in> parts (spies evs); 1833 \<not> expiredSK Ts evs; 1834 B \<noteq> Tgs; A \<notin> bad; B \<notin> bad; evs \<in> kerbIV \<rbrakk> 1835 \<Longrightarrow> A Issues B with (Crypt servK \<lbrace>Agent A, Number T3\<rbrace>) on evs" 1836by (blast dest: u_B_authenticates_A_r u_Confidentiality_B A_Issues_B) 1837 1838end 1839