diff -r 69c627b6b28d -r 75ae4244a596 src/HOL/Auth/NS_Public_Bad.thy --- a/src/HOL/Auth/NS_Public_Bad.thy Wed Apr 23 18:09:48 2003 +0200 +++ b/src/HOL/Auth/NS_Public_Bad.thy Fri Apr 25 11:18:14 2003 +0200 @@ -28,20 +28,20 @@ (*Alice initiates a protocol run, sending a nonce to Bob*) NS1: "\evs1 \ ns_public; Nonce NA \ used evs1\ - \ Says A B (Crypt (pubK B) \Nonce NA, Agent A\) + \ Says A B (Crypt (pubEK B) \Nonce NA, Agent A\) # evs1 \ ns_public" (*Bob responds to Alice's message with a further nonce*) NS2: "\evs2 \ ns_public; Nonce NB \ used evs2; - Says A' B (Crypt (pubK B) \Nonce NA, Agent A\) \ set evs2\ - \ Says B A (Crypt (pubK A) \Nonce NA, Nonce NB\) + Says A' B (Crypt (pubEK B) \Nonce NA, Agent A\) \ set evs2\ + \ Says B A (Crypt (pubEK A) \Nonce NA, Nonce NB\) # evs2 \ ns_public" (*Alice proves her existence by sending NB back to Bob.*) NS3: "\evs3 \ ns_public; - Says A B (Crypt (pubK B) \Nonce NA, Agent A\) \ set evs3; - Says B' A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs3\ - \ Says A B (Crypt (pubK B) (Nonce NB)) # evs3 \ ns_public" + Says A B (Crypt (pubEK B) \Nonce NA, Agent A\) \ set evs3; + Says B' A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs3\ + \ Says A B (Crypt (pubEK B) (Nonce NB)) # evs3 \ ns_public" declare knows_Spy_partsEs [elim] declare analz_subset_parts [THEN subsetD, dest] @@ -49,7 +49,7 @@ declare image_eq_UN [simp] (*accelerates proofs involving nested images*) (*A "possibility property": there are traces that reach the end*) -lemma "\NB. \evs \ ns_public. Says A B (Crypt (pubK B) (Nonce NB)) \ set evs" +lemma "\NB. \evs \ ns_public. Says A B (Crypt (pubEK B) (Nonce NB)) \ set evs" apply (intro exI bexI) apply (rule_tac [2] ns_public.Nil [THEN ns_public.NS1, THEN ns_public.NS2, THEN ns_public.NS3]) @@ -62,12 +62,12 @@ sends messages containing X! **) (*Spy never sees another agent's private key! (unless it's bad at start)*) -lemma Spy_see_priK [simp]: - "evs \ ns_public \ (Key (priK A) \ parts (spies evs)) = (A \ bad)" +lemma Spy_see_priEK [simp]: + "evs \ ns_public \ (Key (priEK A) \ parts (spies evs)) = (A \ bad)" by (erule ns_public.induct, auto) -lemma Spy_analz_priK [simp]: - "evs \ ns_public \ (Key (priK A) \ analz (spies evs)) = (A \ bad)" +lemma Spy_analz_priEK [simp]: + "evs \ ns_public \ (Key (priEK A) \ analz (spies evs)) = (A \ bad)" by auto @@ -77,8 +77,8 @@ is secret. (Honest users generate fresh nonces.)*) lemma no_nonce_NS1_NS2 [rule_format]: "evs \ ns_public - \ Crypt (pubK C) \NA', Nonce NA\ \ parts (spies evs) \ - Crypt (pubK B) \Nonce NA, Agent A\ \ parts (spies evs) \ + \ Crypt (pubEK C) \NA', Nonce NA\ \ parts (spies evs) \ + Crypt (pubEK B) \Nonce NA, Agent A\ \ parts (spies evs) \ Nonce NA \ analz (spies evs)" apply (erule ns_public.induct, simp_all) apply (blast intro: analz_insertI)+ @@ -87,8 +87,8 @@ (*Unicity for NS1: nonce NA identifies agents A and B*) lemma unique_NA: - "\Crypt(pubK B) \Nonce NA, Agent A \ \ parts(spies evs); - Crypt(pubK B') \Nonce NA, Agent A'\ \ parts(spies evs); + "\Crypt(pubEK B) \Nonce NA, Agent A \ \ parts(spies evs); + Crypt(pubEK B') \Nonce NA, Agent A'\ \ parts(spies evs); Nonce NA \ analz (spies evs); evs \ ns_public\ \ A=A' \ B=B'" apply (erule rev_mp, erule rev_mp, erule rev_mp) @@ -102,7 +102,7 @@ The major premise "Says A B ..." makes it a dest-rule, so we use (erule rev_mp) rather than rule_format. *) theorem Spy_not_see_NA: - "\Says A B (Crypt(pubK B) \Nonce NA, Agent A\) \ set evs; + "\Says A B (Crypt(pubEK B) \Nonce NA, Agent A\) \ set evs; A \ bad; B \ bad; evs \ ns_public\ \ Nonce NA \ analz (spies evs)" apply (erule rev_mp) @@ -115,27 +115,27 @@ to start a run, then B has sent message 2.*) lemma A_trusts_NS2_lemma [rule_format]: "\A \ bad; B \ bad; evs \ ns_public\ - \ Crypt (pubK A) \Nonce NA, Nonce NB\ \ parts (spies evs) \ - Says A B (Crypt(pubK B) \Nonce NA, Agent A\) \ set evs \ - Says B A (Crypt(pubK A) \Nonce NA, Nonce NB\) \ set evs" + \ Crypt (pubEK A) \Nonce NA, Nonce NB\ \ parts (spies evs) \ + Says A B (Crypt(pubEK B) \Nonce NA, Agent A\) \ set evs \ + Says B A (Crypt(pubEK A) \Nonce NA, Nonce NB\) \ set evs" apply (erule ns_public.induct) apply (auto dest: Spy_not_see_NA unique_NA) done theorem A_trusts_NS2: - "\Says A B (Crypt(pubK B) \Nonce NA, Agent A\) \ set evs; - Says B' A (Crypt(pubK A) \Nonce NA, Nonce NB\) \ set evs; + "\Says A B (Crypt(pubEK B) \Nonce NA, Agent A\) \ set evs; + Says B' A (Crypt(pubEK A) \Nonce NA, Nonce NB\) \ set evs; A \ bad; B \ bad; evs \ ns_public\ - \ Says B A (Crypt(pubK A) \Nonce NA, Nonce NB\) \ set evs" + \ Says B A (Crypt(pubEK A) \Nonce NA, Nonce NB\) \ set evs" by (blast intro: A_trusts_NS2_lemma) (*If the encrypted message appears then it originated with Alice in NS1*) lemma B_trusts_NS1 [rule_format]: "evs \ ns_public - \ Crypt (pubK B) \Nonce NA, Agent A\ \ parts (spies evs) \ + \ Crypt (pubEK B) \Nonce NA, Agent A\ \ parts (spies evs) \ Nonce NA \ analz (spies evs) \ - Says A B (Crypt (pubK B) \Nonce NA, Agent A\) \ set evs" + Says A B (Crypt (pubEK B) \Nonce NA, Agent A\) \ set evs" apply (erule ns_public.induct, simp_all) (*Fake*) apply (blast intro!: analz_insertI) @@ -148,8 +148,8 @@ (*Unicity for NS2: nonce NB identifies nonce NA and agent A [proof closely follows that for unique_NA] *) lemma unique_NB [dest]: - "\Crypt(pubK A) \Nonce NA, Nonce NB\ \ parts(spies evs); - Crypt(pubK A') \Nonce NA', Nonce NB\ \ parts(spies evs); + "\Crypt(pubEK A) \Nonce NA, Nonce NB\ \ parts(spies evs); + Crypt(pubEK A') \Nonce NA', Nonce NB\ \ parts(spies evs); Nonce NB \ analz (spies evs); evs \ ns_public\ \ A=A' \ NA=NA'" apply (erule rev_mp, erule rev_mp, erule rev_mp) @@ -161,8 +161,8 @@ (*NB remains secret PROVIDED Alice never responds with round 3*) theorem Spy_not_see_NB [dest]: - "\Says B A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs; - \C. Says A C (Crypt (pubK C) (Nonce NB)) \ set evs; + "\Says B A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs; + \C. Says A C (Crypt (pubEK C) (Nonce NB)) \ set evs; A \ bad; B \ bad; evs \ ns_public\ \ Nonce NB \ analz (spies evs)" apply (erule rev_mp, erule rev_mp) @@ -177,23 +177,23 @@ lemma B_trusts_NS3_lemma [rule_format]: "\A \ bad; B \ bad; evs \ ns_public\ - \ Crypt (pubK B) (Nonce NB) \ parts (spies evs) \ - Says B A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs \ - (\C. Says A C (Crypt (pubK C) (Nonce NB)) \ set evs)" + \ Crypt (pubEK B) (Nonce NB) \ parts (spies evs) \ + Says B A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs \ + (\C. Says A C (Crypt (pubEK C) (Nonce NB)) \ set evs)" apply (erule ns_public.induct, auto) by (blast intro: no_nonce_NS1_NS2)+ theorem B_trusts_NS3: - "\Says B A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs; - Says A' B (Crypt (pubK B) (Nonce NB)) \ set evs; + "\Says B A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs; + Says A' B (Crypt (pubEK B) (Nonce NB)) \ set evs; A \ bad; B \ bad; evs \ ns_public\ - \ \C. Says A C (Crypt (pubK C) (Nonce NB)) \ set evs" + \ \C. Says A C (Crypt (pubEK C) (Nonce NB)) \ set evs" by (blast intro: B_trusts_NS3_lemma) (*Can we strengthen the secrecy theorem Spy_not_see_NB? NO*) lemma "\A \ bad; B \ bad; evs \ ns_public\ - \ Says B A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs + \ Says B A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs \ Nonce NB \ analz (spies evs)" apply (erule ns_public.induct, simp_all, spy_analz) (*NS1: by freshness*) @@ -211,14 +211,14 @@ THIS IS THE ATTACK! Level 8 !!evs. \A \ bad; B \ bad; evs \ ns_public\ - \ Says B A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs \ + \ Says B A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs \ Nonce NB \ analz (spies evs) 1. !!C B' evs3. \A \ bad; B \ bad; evs3 \ ns_public - Says A C (Crypt (pubK C) \Nonce NA, Agent A\) \ set evs3; - Says B' A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs3; + Says A C (Crypt (pubEK C) \Nonce NA, Agent A\) \ set evs3; + Says B' A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs3; C \ bad; - Says B A (Crypt (pubK A) \Nonce NA, Nonce NB\) \ set evs3; + Says B A (Crypt (pubEK A) \Nonce NA, Nonce NB\) \ set evs3; Nonce NB \ analz (spies evs3)\ \ False *)