5053
|
1 |
(* Title: HOL/Auth/Kerberos_BAN
|
|
2 |
ID: $Id$
|
|
3 |
Author: Giampaolo Bella, Cambridge University Computer Laboratory
|
|
4 |
Copyright 1998 University of Cambridge
|
|
5 |
|
|
6 |
The Kerberos protocol, BAN version.
|
|
7 |
|
|
8 |
From page 251 of
|
|
9 |
Burrows, Abadi and Needham. A Logic of Authentication.
|
|
10 |
Proc. Royal Soc. 426 (1989)
|
5064
|
11 |
|
|
12 |
Tidied by lcp.
|
5053
|
13 |
*)
|
|
14 |
|
|
15 |
open Kerberos_BAN;
|
|
16 |
|
|
17 |
(*
|
|
18 |
Confidentiality (secrecy) and authentication properties rely on
|
|
19 |
temporal checks: strong guarantees in a little abstracted - but
|
|
20 |
very realistic - model (see .thy).
|
|
21 |
|
|
22 |
Total execution time: 158s
|
|
23 |
*)
|
|
24 |
|
|
25 |
proof_timing:=true;
|
|
26 |
HOL_quantifiers := false;
|
|
27 |
|
|
28 |
AddEs spies_partsEs;
|
|
29 |
AddDs [impOfSubs analz_subset_parts];
|
|
30 |
AddDs [impOfSubs Fake_parts_insert];
|
|
31 |
|
5064
|
32 |
AddIffs [SesKeyLife_LB, AutLife_LB];
|
5053
|
33 |
|
|
34 |
|
|
35 |
(*A "possibility property": there are traces that reach the end.*)
|
|
36 |
goal thy
|
|
37 |
"!!A B. [| A ~= B; A ~= Server; B ~= Server |] \
|
|
38 |
\ ==> EX Timestamp K. EX evs: kerberos_ban. \
|
|
39 |
\ Says B A (Crypt K (Number Timestamp)) \
|
|
40 |
\ : set evs";
|
|
41 |
by (REPEAT (resolve_tac [exI,bexI] 1));
|
|
42 |
by (rtac (kerberos_ban.Nil RS kerberos_ban.Kb1 RS kerberos_ban.Kb2 RS
|
|
43 |
kerberos_ban.Kb3 RS kerberos_ban.Kb4) 2);
|
|
44 |
by possibility_tac;
|
|
45 |
by (ALLGOALS (simp_tac (simpset() addsimps [leD]))); (*from NatDef.ML!!!!*)
|
|
46 |
by (cut_facts_tac [SesKeyLife_LB] 1);
|
|
47 |
by (trans_tac 1);
|
|
48 |
result();
|
|
49 |
|
|
50 |
|
|
51 |
|
|
52 |
(**** Inductive proofs about kerberos_ban ****)
|
|
53 |
|
|
54 |
(*Nobody sends themselves messages*)
|
|
55 |
goal thy "!!evs. evs : kerberos_ban ==> ALL A X. Says A A X ~: set evs";
|
|
56 |
by (etac kerberos_ban.induct 1);
|
|
57 |
by Auto_tac;
|
|
58 |
qed_spec_mp "not_Says_to_self";
|
|
59 |
Addsimps [not_Says_to_self];
|
|
60 |
AddSEs [not_Says_to_self RSN (2, rev_notE)];
|
|
61 |
|
|
62 |
|
|
63 |
(*Forwarding Lemma for reasoning about the encrypted portion of message Kb3*)
|
|
64 |
goal thy "!!evs. Says S A (Crypt KA {|Timestamp, B, K, X|}) : set evs \
|
|
65 |
\ ==> X : parts (spies evs)";
|
|
66 |
by (Blast_tac 1);
|
|
67 |
qed "Kb3_msg_in_parts_spies";
|
|
68 |
|
|
69 |
goal thy
|
|
70 |
"!!evs. Says Server A (Crypt (shrK A) {|Timestamp, B, K, X|}) : set evs \
|
|
71 |
\ ==> K : parts (spies evs)";
|
|
72 |
by (Blast_tac 1);
|
|
73 |
qed "Oops_parts_spies";
|
|
74 |
|
|
75 |
(*For proving the easier theorems about X ~: parts (spies evs).*)
|
|
76 |
fun parts_induct_tac i =
|
|
77 |
etac kerberos_ban.induct i THEN
|
|
78 |
forward_tac [Oops_parts_spies] (i+6) THEN
|
|
79 |
forward_tac [Kb3_msg_in_parts_spies] (i+4) THEN
|
|
80 |
prove_simple_subgoals_tac i;
|
|
81 |
|
|
82 |
|
|
83 |
(*Spy never sees another agent's shared key! (unless it's bad at start)*)
|
|
84 |
goal thy
|
|
85 |
"!!evs. evs : kerberos_ban ==> (Key (shrK A) : parts (spies evs)) = (A : bad)";
|
|
86 |
by (parts_induct_tac 1);
|
|
87 |
by (ALLGOALS Blast_tac);
|
|
88 |
qed "Spy_see_shrK";
|
|
89 |
Addsimps [Spy_see_shrK];
|
|
90 |
|
|
91 |
|
|
92 |
goal thy
|
|
93 |
"!!evs. evs : kerberos_ban ==> (Key (shrK A) : analz (spies evs)) = (A : bad)";
|
|
94 |
by Auto_tac;
|
|
95 |
qed "Spy_analz_shrK";
|
|
96 |
Addsimps [Spy_analz_shrK];
|
|
97 |
|
|
98 |
goal thy "!!A. [| Key (shrK A) : parts (spies evs); \
|
|
99 |
\ evs : kerberos_ban |] ==> A:bad";
|
|
100 |
by (blast_tac (claset() addDs [Spy_see_shrK]) 1);
|
|
101 |
qed "Spy_see_shrK_D";
|
|
102 |
|
|
103 |
bind_thm ("Spy_analz_shrK_D", analz_subset_parts RS subsetD RS Spy_see_shrK_D);
|
|
104 |
AddSDs [Spy_see_shrK_D, Spy_analz_shrK_D];
|
|
105 |
|
|
106 |
|
|
107 |
(*Nobody can have used non-existent keys!*)
|
|
108 |
goal thy "!!evs. evs : kerberos_ban ==> \
|
|
109 |
\ Key K ~: used evs --> K ~: keysFor (parts (spies evs))";
|
|
110 |
by (parts_induct_tac 1);
|
|
111 |
(*Fake*)
|
|
112 |
by (blast_tac (claset() addSDs [keysFor_parts_insert]) 1);
|
|
113 |
(*Kb2, Kb3, Kb4*)
|
|
114 |
by (ALLGOALS Blast_tac);
|
|
115 |
qed_spec_mp "new_keys_not_used";
|
|
116 |
|
|
117 |
bind_thm ("new_keys_not_analzd",
|
|
118 |
[analz_subset_parts RS keysFor_mono,
|
|
119 |
new_keys_not_used] MRS contra_subsetD);
|
|
120 |
|
|
121 |
Addsimps [new_keys_not_used, new_keys_not_analzd];
|
|
122 |
|
|
123 |
|
|
124 |
(** Lemmas concerning the form of items passed in messages **)
|
|
125 |
|
|
126 |
(*Describes the form of K, X and K' when the Server sends this message.*)
|
|
127 |
goal thy
|
|
128 |
"!!evs. [| Says Server A (Crypt K' {|Number Ts, Agent B, Key K, X|}) \
|
|
129 |
\ : set evs; evs : kerberos_ban |] \
|
|
130 |
\ ==> K ~: range shrK & \
|
|
131 |
\ X = (Crypt (shrK B) {|Number Ts, Agent A, Key K|}) & \
|
|
132 |
\ K' = shrK A";
|
|
133 |
by (etac rev_mp 1);
|
|
134 |
by (etac kerberos_ban.induct 1);
|
|
135 |
by Auto_tac;
|
|
136 |
qed "Says_Server_message_form";
|
|
137 |
|
|
138 |
|
|
139 |
(*If the encrypted message appears then it originated with the Server
|
|
140 |
PROVIDED that A is NOT compromised!
|
|
141 |
|
|
142 |
This shows implicitly the FRESHNESS OF THE SESSION KEY to A
|
|
143 |
*)
|
|
144 |
goal thy
|
|
145 |
"!!evs. [| Crypt (shrK A) {|Number Ts, Agent B, Key K, X|} \
|
|
146 |
\ : parts (spies evs); \
|
|
147 |
\ A ~: bad; evs : kerberos_ban |] \
|
|
148 |
\ ==> Says Server A (Crypt (shrK A) {|Number Ts, Agent B, Key K, X|}) \
|
|
149 |
\ : set evs";
|
|
150 |
by (etac rev_mp 1);
|
|
151 |
by (parts_induct_tac 1);
|
|
152 |
by (Blast_tac 1);
|
|
153 |
qed "A_trusts_K_by_Kb2";
|
|
154 |
|
|
155 |
|
|
156 |
(*If the TICKET appears then it originated with the Server*)
|
|
157 |
(*FRESHNESS OF THE SESSION KEY to B*)
|
|
158 |
goal thy
|
|
159 |
"!!evs. [| Crypt (shrK B) {|Number Ts, Agent A, Key K|} : parts (spies evs); \
|
|
160 |
\ B ~: bad; evs : kerberos_ban |] \
|
|
161 |
\ ==> Says Server A \
|
|
162 |
\ (Crypt (shrK A) {|Number Ts, Agent B, Key K, \
|
|
163 |
\ Crypt (shrK B) {|Number Ts, Agent A, Key K|}|}) \
|
|
164 |
\ : set evs";
|
|
165 |
by (etac rev_mp 1);
|
|
166 |
by (parts_induct_tac 1);
|
|
167 |
by (Blast_tac 1);
|
|
168 |
qed "B_trusts_K_by_Kb3";
|
|
169 |
|
|
170 |
|
|
171 |
(*EITHER describes the form of X when the following message is sent,
|
|
172 |
OR reduces it to the Fake case.
|
|
173 |
Use Says_Server_message_form if applicable.*)
|
|
174 |
goal thy
|
|
175 |
"!!evs. [| Says S A (Crypt (shrK A) {|Number Ts, Agent B, Key K, X|}) \
|
|
176 |
\ : set evs; \
|
|
177 |
\ evs : kerberos_ban |] \
|
|
178 |
\ ==> (K ~: range shrK & X = (Crypt (shrK B) {|Number Ts, Agent A, Key K|}))\
|
|
179 |
\ | X : analz (spies evs)";
|
|
180 |
by (case_tac "A : bad" 1);
|
|
181 |
by (fast_tac (claset() addSDs [Says_imp_spies RS analz.Inj]
|
|
182 |
addss (simpset())) 1);
|
|
183 |
by (forward_tac [Says_imp_spies RS parts.Inj] 1);
|
|
184 |
by (blast_tac (claset() addSDs [A_trusts_K_by_Kb2,
|
|
185 |
Says_Server_message_form]) 1);
|
|
186 |
qed "Says_S_message_form";
|
|
187 |
|
|
188 |
|
|
189 |
(*For proofs involving analz.*)
|
|
190 |
val analz_spies_tac =
|
|
191 |
forward_tac [Says_Server_message_form] 7 THEN
|
|
192 |
forward_tac [Says_S_message_form] 5 THEN
|
|
193 |
REPEAT_FIRST (eresolve_tac [asm_rl, conjE, disjE] ORELSE' hyp_subst_tac);
|
|
194 |
|
|
195 |
|
|
196 |
(****
|
|
197 |
The following is to prove theorems of the form
|
|
198 |
|
|
199 |
Key K : analz (insert (Key KAB) (spies evs)) ==>
|
|
200 |
Key K : analz (spies evs)
|
|
201 |
|
|
202 |
A more general formula must be proved inductively.
|
|
203 |
|
|
204 |
****)
|
|
205 |
|
|
206 |
|
|
207 |
(** Session keys are not used to encrypt other session keys **)
|
|
208 |
|
|
209 |
goal thy
|
|
210 |
"!!evs. evs : kerberos_ban ==> \
|
|
211 |
\ ALL K KK. KK <= Compl (range shrK) --> \
|
|
212 |
\ (Key K : analz (Key``KK Un (spies evs))) = \
|
|
213 |
\ (K : KK | Key K : analz (spies evs))";
|
|
214 |
by (etac kerberos_ban.induct 1);
|
|
215 |
by analz_spies_tac;
|
|
216 |
by (REPEAT_FIRST (resolve_tac [allI, impI]));
|
|
217 |
by (REPEAT_FIRST (rtac analz_image_freshK_lemma));
|
|
218 |
(*Takes 5 secs*)
|
|
219 |
by (ALLGOALS (asm_simp_tac analz_image_freshK_ss));
|
|
220 |
(*Fake*)
|
|
221 |
by (spy_analz_tac 1);
|
|
222 |
qed_spec_mp "analz_image_freshK";
|
|
223 |
|
|
224 |
|
|
225 |
goal thy
|
|
226 |
"!!evs. [| evs : kerberos_ban; KAB ~: range shrK |] ==> \
|
|
227 |
\ Key K : analz (insert (Key KAB) (spies evs)) = \
|
|
228 |
\ (K = KAB | Key K : analz (spies evs))";
|
|
229 |
by (asm_simp_tac (analz_image_freshK_ss addsimps [analz_image_freshK]) 1);
|
|
230 |
qed "analz_insert_freshK";
|
|
231 |
|
|
232 |
|
|
233 |
(** The session key K uniquely identifies the message **)
|
|
234 |
|
|
235 |
goal thy
|
|
236 |
"!!evs. evs : kerberos_ban ==> \
|
|
237 |
\ EX A' Ts' B' X'. ALL A Ts B X. \
|
|
238 |
\ Says Server A (Crypt (shrK A) {|Number Ts, Agent B, Key K, X|}) \
|
|
239 |
\ : set evs \
|
|
240 |
\ --> A=A' & Ts=Ts' & B=B' & X=X'";
|
|
241 |
by (etac kerberos_ban.induct 1);
|
|
242 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps [all_conj_distrib])));
|
|
243 |
by Safe_tac;
|
|
244 |
(*Kb2: it can't be a new key*)
|
|
245 |
by (expand_case_tac "K = ?y" 1);
|
|
246 |
by (REPEAT (ares_tac [refl,exI,impI,conjI] 2));
|
|
247 |
by (blast_tac (claset() delrules [conjI]) 1);
|
|
248 |
val lemma = result();
|
|
249 |
|
|
250 |
(*In messages of this form, the session key uniquely identifies the rest*)
|
|
251 |
goal thy
|
|
252 |
"!!evs. [| Says Server A \
|
|
253 |
\ (Crypt (shrK A) {|Number Ts, Agent B, Key K, X|}) : set evs; \
|
|
254 |
\ Says Server A' \
|
|
255 |
\ (Crypt (shrK A') {|Number Ts', Agent B', Key K, X'|}) : set evs;\
|
|
256 |
\ evs : kerberos_ban |] ==> A=A' & Ts=Ts' & B=B' & X = X'";
|
|
257 |
by (prove_unique_tac lemma 1);
|
|
258 |
qed "unique_session_keys";
|
|
259 |
|
|
260 |
|
|
261 |
(** Lemma: the session key sent in msg Kb2 would be EXPIRED
|
|
262 |
if the spy could see it!
|
|
263 |
**)
|
|
264 |
|
|
265 |
goal thy
|
5064
|
266 |
"!!evs. [| A ~: bad; B ~: bad; evs : kerberos_ban |] \
|
|
267 |
\ ==> Says Server A \
|
|
268 |
\ (Crypt (shrK A) {|Number Ts, Agent B, Key K, \
|
|
269 |
\ Crypt (shrK B) {|Number Ts, Agent A, Key K|}|})\
|
|
270 |
\ : set evs --> \
|
5053
|
271 |
\ Key K : analz (spies evs) --> Expired Ts evs";
|
|
272 |
by (etac kerberos_ban.induct 1);
|
|
273 |
by analz_spies_tac;
|
|
274 |
by (ALLGOALS
|
5064
|
275 |
(asm_simp_tac (simpset() addsimps ([analz_insert_eq, analz_insert_freshK]
|
|
276 |
@ pushes))));
|
5053
|
277 |
(*Oops*)
|
|
278 |
by (blast_tac (claset() addDs [unique_session_keys] addIs [less_SucI]) 4);
|
|
279 |
(*Kb2*)
|
5064
|
280 |
by (blast_tac (claset() addIs [parts_insertI, less_SucI]) 2);
|
5053
|
281 |
(*Fake*)
|
|
282 |
by (spy_analz_tac 1);
|
|
283 |
(**LEVEL 6 **)
|
5064
|
284 |
(*Kb3*)
|
5053
|
285 |
by (case_tac "Aa : bad" 1);
|
5064
|
286 |
by (blast_tac (claset() addDs [A_trusts_K_by_Kb2, unique_session_keys]) 2);
|
|
287 |
by (blast_tac (claset() addDs [Says_imp_spies RS analz.Inj,
|
|
288 |
Crypt_Spy_analz_bad, analz.Fst, analz.Snd]
|
5053
|
289 |
addIs [less_SucI]) 1);
|
|
290 |
val lemma = result() RS mp RS mp RSN(1,rev_notE);
|
|
291 |
|
|
292 |
|
|
293 |
(** CONFIDENTIALITY for the SERVER:
|
|
294 |
Spy does not see the keys sent in msg Kb2
|
|
295 |
as long as they have NOT EXPIRED
|
|
296 |
**)
|
|
297 |
goal thy
|
|
298 |
"!!evs. [| Says Server A \
|
|
299 |
\ (Crypt K' {|Number T, Agent B, Key K, X|}) : set evs; \
|
|
300 |
\ ~ Expired T evs; \
|
|
301 |
\ A ~: bad; B ~: bad; evs : kerberos_ban \
|
|
302 |
\ |] ==> Key K ~: analz (spies evs)";
|
|
303 |
by (forward_tac [Says_Server_message_form] 1 THEN assume_tac 1);
|
5064
|
304 |
by (Clarify_tac 1); (*prevents PROOF FAILED*)
|
5053
|
305 |
by (blast_tac (claset() addSEs [lemma]) 1);
|
|
306 |
qed "Confidentiality_S";
|
|
307 |
|
|
308 |
(**** THE COUNTERPART OF CONFIDENTIALITY
|
|
309 |
[|...; Expired Ts evs; ...|] ==> Key K : analz (spies evs)
|
|
310 |
WOULD HOLD ONLY IF AN OOPS OCCURRED! ---> Nothing to prove! ****)
|
|
311 |
|
|
312 |
|
|
313 |
(** CONFIDENTIALITY for ALICE: **)
|
|
314 |
(** Also A_trusts_K_by_Kb2 RS Confidentiality_S **)
|
|
315 |
goal thy
|
|
316 |
"!!evs. [| Crypt (shrK A) {|Number T, Agent B, Key K, X|} : parts (spies evs);\
|
|
317 |
\ ~ Expired T evs; \
|
|
318 |
\ A ~: bad; B ~: bad; evs : kerberos_ban \
|
|
319 |
\ |] ==> Key K ~: analz (spies evs)";
|
5064
|
320 |
by (blast_tac (claset() addSDs [A_trusts_K_by_Kb2, Confidentiality_S]) 1);
|
5053
|
321 |
qed "Confidentiality_A";
|
|
322 |
|
|
323 |
|
|
324 |
(** CONFIDENTIALITY for BOB: **)
|
|
325 |
(** Also B_trusts_K_by_Kb3 RS Confidentiality_S **)
|
|
326 |
goal thy
|
|
327 |
"!!evs. [| Crypt (shrK B) {|Number Tk, Agent A, Key K|} \
|
|
328 |
\ : parts (spies evs); \
|
|
329 |
\ ~ Expired Tk evs; \
|
|
330 |
\ A ~: bad; B ~: bad; evs : kerberos_ban \
|
|
331 |
\ |] ==> Key K ~: analz (spies evs)";
|
|
332 |
by (blast_tac (claset() addSDs [B_trusts_K_by_Kb3,
|
|
333 |
Confidentiality_S]) 1);
|
|
334 |
qed "Confidentiality_B";
|
|
335 |
|
|
336 |
|
|
337 |
goal thy
|
|
338 |
"!!evs. [| B ~: bad; evs : kerberos_ban |] \
|
|
339 |
\ ==> Key K ~: analz (spies evs) --> \
|
|
340 |
\ Says Server A (Crypt (shrK A) {|Number Ts, Agent B, Key K, X|}) \
|
|
341 |
\ : set evs --> \
|
|
342 |
\ Crypt K (Number Ta) : parts (spies evs) --> \
|
|
343 |
\ Says B A (Crypt K (Number Ta)) : set evs";
|
|
344 |
by (etac kerberos_ban.induct 1);
|
|
345 |
by (forward_tac [Says_S_message_form] 5 THEN assume_tac 5);
|
|
346 |
by (dtac Kb3_msg_in_parts_spies 5);
|
|
347 |
by (forward_tac [Oops_parts_spies] 7);
|
5064
|
348 |
by (REPEAT (FIRSTGOAL analz_mono_contra_tac));
|
5053
|
349 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps [all_conj_distrib])));
|
5064
|
350 |
(**LEVEL 6**)
|
5053
|
351 |
by (Blast_tac 1);
|
5064
|
352 |
by (Clarify_tac 1);
|
5053
|
353 |
(*
|
|
354 |
Subgoal 1: contradiction from the assumptions
|
|
355 |
Key K ~: used evs2 and Crypt K (Number Ta) : parts (spies evs2)
|
|
356 |
*)
|
|
357 |
by (dtac Crypt_imp_invKey_keysFor 1);
|
|
358 |
by (Asm_full_simp_tac 1);
|
5064
|
359 |
(* the two tactics above detect the contradiction*)
|
5053
|
360 |
by (case_tac "Ba : bad" 1); (*splits up the subgoal by the stated case*)
|
|
361 |
by (blast_tac (claset() addDs [Says_imp_spies RS parts.Inj RS parts.Fst RS
|
|
362 |
B_trusts_K_by_Kb3,
|
|
363 |
unique_session_keys]) 2);
|
|
364 |
by (blast_tac (claset() addDs [Says_imp_spies RS analz.Inj RS analz.Fst RS
|
|
365 |
Crypt_Spy_analz_bad]) 1);
|
|
366 |
val lemma_B = result();
|
|
367 |
|
|
368 |
|
|
369 |
(*AUTHENTICATION OF B TO A*)
|
|
370 |
goal thy
|
|
371 |
"!!evs. [| Crypt K (Number Ta) : parts (spies evs); \
|
|
372 |
\ Crypt (shrK A) {|Number Ts, Agent B, Key K, X|} \
|
|
373 |
\ : parts (spies evs); \
|
|
374 |
\ ~ Expired Ts evs; \
|
|
375 |
\ A ~: bad; B ~: bad; evs : kerberos_ban |] \
|
|
376 |
\ ==> Says B A (Crypt K (Number Ta)) : set evs";
|
|
377 |
by (blast_tac (claset() addSDs [A_trusts_K_by_Kb2]
|
|
378 |
addSIs [lemma_B RS mp RS mp RS mp]
|
|
379 |
addSEs [Confidentiality_S RSN (2,rev_notE)]) 1);
|
|
380 |
qed "Authentication_B";
|
|
381 |
|
|
382 |
|
|
383 |
goal thy
|
|
384 |
"!!evs. [| A ~: bad; B ~: bad; evs : kerberos_ban |] ==> \
|
|
385 |
\ Key K ~: analz (spies evs) --> \
|
|
386 |
\ Says Server A (Crypt (shrK A) {|Number Ts, Agent B, Key K, X|}) \
|
|
387 |
\ : set evs --> \
|
|
388 |
\ Crypt K {|Agent A, Number Ta|} : parts (spies evs) -->\
|
|
389 |
\ Says A B {|X, Crypt K {|Agent A, Number Ta|}|} \
|
|
390 |
\ : set evs";
|
|
391 |
by (etac kerberos_ban.induct 1);
|
|
392 |
by (forward_tac [Says_S_message_form] 5 THEN assume_tac 5);
|
|
393 |
by (forward_tac [Kb3_msg_in_parts_spies] 5);
|
|
394 |
by (forward_tac [Oops_parts_spies] 7);
|
5064
|
395 |
by (REPEAT (FIRSTGOAL analz_mono_contra_tac));
|
5053
|
396 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps [all_conj_distrib])));
|
5064
|
397 |
(**LEVEL 6**)
|
5053
|
398 |
by (Blast_tac 1);
|
5064
|
399 |
by (Clarify_tac 1);
|
5053
|
400 |
by (dtac Crypt_imp_invKey_keysFor 1);
|
|
401 |
by (Asm_full_simp_tac 1);
|
5064
|
402 |
by (blast_tac (claset() addDs [A_trusts_K_by_Kb2, unique_session_keys]) 1);
|
5053
|
403 |
val lemma_A = result();
|
|
404 |
|
|
405 |
|
|
406 |
(*AUTHENTICATION OF A TO B*)
|
|
407 |
goal thy
|
5064
|
408 |
"!!evs. [| Crypt K {|Agent A, Number Ta|} : parts (spies evs); \
|
|
409 |
\ Crypt (shrK B) {|Number Ts, Agent A, Key K|} \
|
|
410 |
\ : parts (spies evs); \
|
|
411 |
\ ~ Expired Ts evs; \
|
|
412 |
\ A ~: bad; B ~: bad; evs : kerberos_ban |] \
|
5053
|
413 |
\ ==> Says A B {|Crypt (shrK B) {|Number Ts, Agent A, Key K|}, \
|
|
414 |
\ Crypt K {|Agent A, Number Ta|}|} : set evs";
|
|
415 |
by (blast_tac (claset() addSDs [B_trusts_K_by_Kb3]
|
|
416 |
addSIs [lemma_A RS mp RS mp RS mp]
|
|
417 |
addSEs [Confidentiality_S RSN (2,rev_notE)]) 1);
|
|
418 |
qed "Authentication_A";
|