definition broken :: "agent set"where
― ‹the compromised honest agents; TTP is included as it's not allowed to
use the protocol› "broken == bad - {Spy}"
declare broken_def [simp]
inductive_set zg :: "event list set" where
Nil: "[] ∈ zg"
| Fake: "[evsf ∈ zg; X ∈ synth (analz (spies evsf))] ==> Says Spy B X # evsf ∈ zg"
| Reception: "[evsr ∈ zg; Says A B X ∈ set evsr]==> Gets B X # evsr ∈ zg"
(*L is fresh for honest agents. Wedon'trequireKtobefreshbecausewedon'tbothertoprovesecrecy! Wejustassumethattheprotocol'sobjectiveistodeliverKfairly,
rather than to keep M secret.*)
| ZG1: "[evs1 ∈ zg; Nonce L ∉ used evs1; C = Crypt K (Number m); K ∈ symKeys; NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, C}] ==> Says A B {Number f_nro, Agent B, Nonce L, C, NRO} # evs1 ∈ zg"
(*B must check that NRO is A's signature to learn the sender's name*)
| ZG2: "[evs2 ∈ zg; Gets B {Number f_nro, Agent B, Nonce L, C, NRO}∈ set evs2; NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, C}; NRR = Crypt (priK B) {Number f_nrr, Agent A, Nonce L, C}] ==> Says B A {Number f_nrr, Agent A, Nonce L, NRR} # evs2 ∈ zg"
(*A must check that NRR is B's signature to learn the sender's name;
without spy, the matching label would be enough*)
| ZG3: "[evs3 ∈ zg; C = Crypt K M; K ∈ symKeys; Says A B {Number f_nro, Agent B, Nonce L, C, NRO}∈ set evs3; Gets A {Number f_nrr, Agent A, Nonce L, NRR}∈ set evs3; NRR = Crypt (priK B) {Number f_nrr, Agent A, Nonce L, C}; sub_K = Crypt (priK A) {Number f_sub, Agent B, Nonce L, Key K}] ==> Says A TTP {Number f_sub, Agent B, Nonce L, Key K, sub_K} # evs3 ∈ zg"
(*TTP checks that sub_K is A's signature to learn who issued K, then givescredentialstoAandB.TheNoteseventmodelstheavailabilityof thecredentials,buttheactoffetchingthemisnotmodelled.Wealso givecon_KtotheSpy.Thismakesthethreatmodelmoredangerous,while alsoallowinglemma@{textCrypt_used_imp_spies}toomitthecondition
@{term "K \<noteq> priK TTP"}. *)
| ZG4: "[evs4 ∈ zg; K ∈ symKeys; Gets TTP {Number f_sub, Agent B, Nonce L, Key K, sub_K} ∈ set evs4; sub_K = Crypt (priK A) {Number f_sub, Agent B, Nonce L, Key K}; con_K = Crypt (priK TTP) {Number f_con, Agent A, Agent B, Nonce L, Key K}] ==> Says TTP Spy con_K # Notes TTP {Number f_con, Agent A, Agent B, Nonce L, Key K, con_K} # evs4 ∈ zg"
text‹A "possibility property": there are traces that reach the end› lemma"[A ≠ B; TTP ≠ A; TTP ≠ B; K ∈ symKeys]==> ∃L. ∃evs ∈ zg. Notes TTP {Number f_con, Agent A, Agent B, Nonce L, Key K, Crypt (priK TTP) {Number f_con, Agent A, Agent B, Nonce L, Key K}} ∈ set evs" apply (intro exI bexI) apply (rule_tac [2] zg.Nil
[THEN zg.ZG1, THEN zg.Reception [of _ A B], THEN zg.ZG2, THEN zg.Reception [of _ B A], THEN zg.ZG3, THEN zg.Reception [of _ A TTP], THEN zg.ZG4]) apply (basic_possibility, auto) done
subsection‹Basic Lemmas›
lemma Gets_imp_Says: "[Gets B X ∈ set evs; evs ∈ zg]==>∃A. Says A B X ∈ set evs" apply (erule rev_mp) apply (erule zg.induct, auto) done
lemma Gets_imp_knows_Spy: "[Gets B X ∈ set evs; evs ∈ zg]==> X ∈ spies evs" by (blast dest!: Gets_imp_Says Says_imp_knows_Spy)
text‹Lets us replace proofs about term‹used evs› by simpler proofs term‹parts (spies evs)›.› lemma Crypt_used_imp_spies: "[Crypt K X ∈ used evs; evs ∈ zg] ==> Crypt K X ∈ parts (spies evs)" apply (erule rev_mp) apply (erule zg.induct) apply (simp_all add: parts_insert_knows_A) done
text‹For reasoning about C, which is encrypted in message ZG2› lemma ZG2_msg_in_parts_spies: "[Gets B {F, B', L, C, X}∈ set evs; evs ∈ zg] ==> C ∈ parts (spies evs)" by (blast dest: Gets_imp_Says)
(*classical regularity lemma on priK*) lemma Spy_see_priK [simp]: "evs ∈ zg ==> (Key (priK A) ∈ parts (spies evs)) = (A ∈ bad)" apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, auto) done
text‹So that blast can use it too› declare Spy_see_priK [THEN [2] rev_iffD1, dest!]
lemma Spy_analz_priK [simp]: "evs ∈ zg ==> (Key (priK A) ∈ analz (spies evs)) = (A ∈ bad)" by auto
subsection‹About NRO: Validity for term‹B››
text‹Below we prove that if term‹NRO› exists then term‹A› definitely
it, provided term‹A› is not broken.›
text‹Strong conclusion for a good agent› lemma NRO_validity_good: "[NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, C}; NRO ∈ parts (spies evs); A ∉ bad; evs ∈ zg] ==> Says A B {Number f_nro, Agent B, Nonce L, C, NRO}∈ set evs" apply clarify apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, auto) done
lemma NRO_sender: "[Says A' B {n, b, l, C, Crypt (priK A) X}∈ set evs; evs ∈ zg] ==> A' ∈ {A,Spy}" apply (erule rev_mp) apply (erule zg.induct, simp_all) done
text‹Holds also for term‹A = Spy›!› theorem NRO_validity: "[Gets B {Number f_nro, Agent B, Nonce L, C, NRO}∈ set evs; NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, C}; A ∉ broken; evs ∈ zg] ==> Says A B {Number f_nro, Agent B, Nonce L, C, NRO}∈ set evs" apply (drule Gets_imp_Says, assumption) apply clarify apply (frule NRO_sender, auto) txt‹We are left with the case where the sender is term‹Spy› and not
equal to term‹A›, because term‹A ∉ bad›.
Thus theorem ‹NRO_validity_good› applies.› apply (blast dest: NRO_validity_good [OF refl]) done
subsection‹About NRR: Validity for term‹A››
text‹Below we prove that if term‹NRR› exists then term‹B› definitely
it, provided term‹B› is not broken.›
text‹Strong conclusion for a good agent› lemma NRR_validity_good: "[NRR = Crypt (priK B) {Number f_nrr, Agent A, Nonce L, C}; NRR ∈ parts (spies evs); B ∉ bad; evs ∈ zg] ==> Says B A {Number f_nrr, Agent A, Nonce L, NRR}∈ set evs" apply clarify apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, auto) done
lemma NRR_sender: "[Says B' A {n, a, l, Crypt (priK B) X}∈ set evs; evs ∈ zg] ==> B' ∈ {B,Spy}" apply (erule rev_mp) apply (erule zg.induct, simp_all) done
text‹Holds also for term‹B = Spy›!› theorem NRR_validity: "[Says B' A {Number f_nrr, Agent A, Nonce L, NRR}∈ set evs; NRR = Crypt (priK B) {Number f_nrr, Agent A, Nonce L, C}; B ∉ broken; evs ∈ zg] ==> Says B A {Number f_nrr, Agent A, Nonce L, NRR}∈ set evs" apply clarify apply (frule NRR_sender, auto) txt‹We are left with the case where term‹B' = Spy› and term‹B' ≠ B›,
i.e. term‹B ∉ bad›, when we can apply ‹NRR_validity_good›.› apply (blast dest: NRR_validity_good [OF refl]) done
subsection‹Proofs About term‹sub_K››
text‹Below we prove that if term‹sub_K› exists then term‹A› definitely
it, provided term‹A› is not broken.›
text‹Strong conclusion for a good agent› lemma sub_K_validity_good: "[sub_K = Crypt (priK A) {Number f_sub, Agent B, Nonce L, Key K}; sub_K ∈ parts (spies evs); A ∉ bad; evs ∈ zg] ==> Says A TTP {Number f_sub, Agent B, Nonce L, Key K, sub_K}∈ set evs" apply clarify apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, simp_all) txt‹Fake› apply (blast dest!: Fake_parts_sing_imp_Un) done
lemma sub_K_sender: "[Says A' TTP {n, b, l, k, Crypt (priK A) X}∈ set evs; evs ∈ zg] ==> A' ∈ {A,Spy}" apply (erule rev_mp) apply (erule zg.induct, simp_all) done
text‹Holds also for term‹A = Spy›!› theorem sub_K_validity: "[Gets TTP {Number f_sub, Agent B, Nonce L, Key K, sub_K}∈ set evs; sub_K = Crypt (priK A) {Number f_sub, Agent B, Nonce L, Key K}; A ∉ broken; evs ∈ zg] ==> Says A TTP {Number f_sub, Agent B, Nonce L, Key K, sub_K}∈ set evs" apply (drule Gets_imp_Says, assumption) apply clarify apply (frule sub_K_sender, auto) txt‹We are left with the case where the sender is term‹Spy› and not
equal to term‹A›, because term‹A ∉ bad›.
Thus theorem ‹sub_K_validity_good› applies.› apply (blast dest: sub_K_validity_good [OF refl]) done
subsection‹Proofs About term‹con_K››
text‹Below we prove that if term‹con_K› exists, then term‹TTP› has it,
therefore term‹A› and term‹B›) can get it too. Moreover, we know term‹A› sent term‹sub_K››
text‹If term‹TTP› holds term‹con_K› then term‹A› sent term‹sub_K›. We assume that term‹A› is not broken. Importantly, nothing
needs to be assumed about the form of term‹con_K›!› lemma Notes_TTP_imp_Says_A: "[Notes TTP {Number f_con, Agent A, Agent B, Nonce L, Key K, con_K} ∈ set evs; sub_K = Crypt (priK A) {Number f_sub, Agent B, Nonce L, Key K}; A ∉ broken; evs ∈ zg] ==> Says A TTP {Number f_sub, Agent B, Nonce L, Key K, sub_K}∈ set evs" apply clarify apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, simp_all) txt‹ZG4› apply clarify apply (rule sub_K_validity, auto) done
text‹If term‹con_K› exists, then term‹A› sent term‹sub_K›. We again
assume that term‹A› is not broken.› theorem B_sub_K_validity: "[con_K ∈ used evs; con_K = Crypt (priK TTP) {Number f_con, Agent A, Agent B, Nonce L, Key K}; sub_K = Crypt (priK A) {Number f_sub, Agent B, Nonce L, Key K}; A ∉ broken; evs ∈ zg] ==> Says A TTP {Number f_sub, Agent B, Nonce L, Key K, sub_K}∈ set evs" by (blast dest: con_K_validity Notes_TTP_imp_Says_A)
subsection‹Proving fairness›
text‹Cannot prove that, if term‹B› has NRO, then term‹A› has her NRR.
would appear that term‹B› has a small advantage, though it is
to win disputes: term‹B› needs to present term‹con_K› as well.›
text‹Strange: unicity of the label protects term‹A›?› lemma A_unicity: "[NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, Crypt K M}; NRO ∈ parts (spies evs); Says A B {Number f_nro, Agent B, Nonce L, Crypt K M', NRO'} ∈ set evs; A ∉ bad; evs ∈ zg] ==> M'=M" apply clarify apply (erule rev_mp) apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, auto) txt‹ZG1: freshness› apply (blast dest: parts.Body) done
text‹Fairness lemma: if term‹sub_K› exists, then term‹A› holds
. Relies on unicity of labels.› lemma sub_K_implies_NRR: "[NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, Crypt K M}; NRR = Crypt (priK B) {Number f_nrr, Agent A, Nonce L, Crypt K M}; sub_K ∈ parts (spies evs); NRO ∈ parts (spies evs); sub_K = Crypt (priK A) {Number f_sub, Agent B, Nonce L, Key K}; A ∉ bad; evs ∈ zg] ==> Gets A {Number f_nrr, Agent A, Nonce L, NRR}∈ set evs" apply clarify apply hypsubst_thin apply (erule rev_mp) apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, simp_all) txt‹Fake› apply blast txt‹ZG1: freshness› apply (blast dest: parts.Body) txt‹ZG3› apply (blast dest: A_unicity [OF refl]) done
lemma Crypt_used_imp_L_used: "[Crypt (priK TTP) {F, A, B, L, K}∈ used evs; evs ∈ zg] ==> L ∈ used evs" apply (erule rev_mp) apply (erule zg.induct, auto) txt‹Fake› apply (blast dest!: Fake_parts_sing_imp_Un) txt‹ZG2: freshness› apply (blast dest: parts.Body) done
text‹Fairness for term‹A›: if term‹con_K› and term‹NRO› exist, term‹A› holds NRR. term‹A› must be uncompromised, but there is no
about term‹B›.› theorem A_fairness_NRO: "[con_K ∈ used evs; NRO ∈ parts (spies evs); con_K = Crypt (priK TTP) {Number f_con, Agent A, Agent B, Nonce L, Key K}; NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, Crypt K M}; NRR = Crypt (priK B) {Number f_nrr, Agent A, Nonce L, Crypt K M}; A ∉ bad; evs ∈ zg] ==> Gets A {Number f_nrr, Agent A, Nonce L, NRR}∈ set evs" apply clarify apply (erule rev_mp) apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, simp_all) txt‹Fake› apply (simp add: parts_insert_knows_A) apply (blast dest: Fake_parts_sing_imp_Un) txt‹ZG1› apply (blast dest: Crypt_used_imp_L_used) txt‹ZG2› apply (blast dest: parts_cut) txt‹ZG4› apply (blast intro: sub_K_implies_NRR [OF refl]
dest: Gets_imp_knows_Spy [THEN parts.Inj]) done
text‹Fairness for term‹B›: NRR exists at all, then term‹B› holds NRO. term‹B› must be uncompromised, but there is no assumption about term‹A›.› theorem B_fairness_NRR: "[NRR ∈ used evs; NRR = Crypt (priK B) {Number f_nrr, Agent A, Nonce L, C}; NRO = Crypt (priK A) {Number f_nro, Agent B, Nonce L, C}; B ∉ bad; evs ∈ zg] ==> Gets B {Number f_nro, Agent B, Nonce L, C, NRO}∈ set evs" apply clarify apply (erule rev_mp) apply (erule zg.induct) apply (frule_tac [5] ZG2_msg_in_parts_spies, simp_all) txt‹Fake› apply (blast dest!: Fake_parts_sing_imp_Un) txt‹ZG2› apply (blast dest: parts_cut) done
text‹If term‹con_K› exists at all, then term‹B› can get it, by ‹con_K_validity›. Cannot conclude that also NRO is available to term‹B›,
if term‹A› were unfair, term‹A› could build message 3 without
message 1, which contains NRO.›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.