10 Proc. Royal Soc. 426 (1989) |
10 Proc. Royal Soc. 426 (1989) |
11 *) |
11 *) |
12 |
12 |
13 Yahalom = Shared + |
13 Yahalom = Shared + |
14 |
14 |
15 consts yahalom :: agent set => event list set |
15 consts yahalom :: event list set |
16 inductive "yahalom lost" |
16 inductive "yahalom" |
17 intrs |
17 intrs |
18 (*Initial trace is empty*) |
18 (*Initial trace is empty*) |
19 Nil "[]: yahalom lost" |
19 Nil "[]: yahalom" |
20 |
20 |
21 (*The spy MAY say anything he CAN say. We do not expect him to |
21 (*The spy MAY say anything he CAN say. We do not expect him to |
22 invent new nonces here, but he can also use NS1. Common to |
22 invent new nonces here, but he can also use NS1. Common to |
23 all similar protocols.*) |
23 all similar protocols.*) |
24 Fake "[| evs: yahalom lost; B ~= Spy; |
24 Fake "[| evs: yahalom; B ~= Spy; |
25 X: synth (analz (sees lost Spy evs)) |] |
25 X: synth (analz (sees Spy evs)) |] |
26 ==> Says Spy B X # evs : yahalom lost" |
26 ==> Says Spy B X # evs : yahalom" |
27 |
27 |
28 (*Alice initiates a protocol run*) |
28 (*Alice initiates a protocol run*) |
29 YM1 "[| evs: yahalom lost; A ~= B; Nonce NA ~: used evs |] |
29 YM1 "[| evs: yahalom; A ~= B; Nonce NA ~: used evs |] |
30 ==> Says A B {|Agent A, Nonce NA|} # evs : yahalom lost" |
30 ==> Says A B {|Agent A, Nonce NA|} # evs : yahalom" |
31 |
31 |
32 (*Bob's response to Alice's message. Bob doesn't know who |
32 (*Bob's response to Alice's message. Bob doesn't know who |
33 the sender is, hence the A' in the sender field.*) |
33 the sender is, hence the A' in the sender field.*) |
34 YM2 "[| evs: yahalom lost; B ~= Server; Nonce NB ~: used evs; |
34 YM2 "[| evs: yahalom; B ~= Server; Nonce NB ~: used evs; |
35 Says A' B {|Agent A, Nonce NA|} : set evs |] |
35 Says A' B {|Agent A, Nonce NA|} : set evs |] |
36 ==> Says B Server |
36 ==> Says B Server |
37 {|Agent B, Crypt (shrK B) {|Agent A, Nonce NA, Nonce NB|}|} |
37 {|Agent B, Crypt (shrK B) {|Agent A, Nonce NA, Nonce NB|}|} |
38 # evs : yahalom lost" |
38 # evs : yahalom" |
39 |
39 |
40 (*The Server receives Bob's message. He responds by sending a |
40 (*The Server receives Bob's message. He responds by sending a |
41 new session key to Alice, with a packet for forwarding to Bob.*) |
41 new session key to Alice, with a packet for forwarding to Bob.*) |
42 YM3 "[| evs: yahalom lost; A ~= Server; Key KAB ~: used evs; |
42 YM3 "[| evs: yahalom; A ~= Server; Key KAB ~: used evs; |
43 Says B' Server |
43 Says B' Server |
44 {|Agent B, Crypt (shrK B) {|Agent A, Nonce NA, Nonce NB|}|} |
44 {|Agent B, Crypt (shrK B) {|Agent A, Nonce NA, Nonce NB|}|} |
45 : set evs |] |
45 : set evs |] |
46 ==> Says Server A |
46 ==> Says Server A |
47 {|Crypt (shrK A) {|Agent B, Key KAB, Nonce NA, Nonce NB|}, |
47 {|Crypt (shrK A) {|Agent B, Key KAB, Nonce NA, Nonce NB|}, |
48 Crypt (shrK B) {|Agent A, Key KAB|}|} |
48 Crypt (shrK B) {|Agent A, Key KAB|}|} |
49 # evs : yahalom lost" |
49 # evs : yahalom" |
50 |
50 |
51 (*Alice receives the Server's (?) message, checks her Nonce, and |
51 (*Alice receives the Server's (?) message, checks her Nonce, and |
52 uses the new session key to send Bob his Nonce.*) |
52 uses the new session key to send Bob his Nonce.*) |
53 YM4 "[| evs: yahalom lost; A ~= Server; |
53 YM4 "[| evs: yahalom; A ~= Server; |
54 Says S A {|Crypt (shrK A) {|Agent B, Key K, Nonce NA, Nonce NB|}, |
54 Says S A {|Crypt (shrK A) {|Agent B, Key K, Nonce NA, Nonce NB|}, |
55 X|} : set evs; |
55 X|} : set evs; |
56 Says A B {|Agent A, Nonce NA|} : set evs |] |
56 Says A B {|Agent A, Nonce NA|} : set evs |] |
57 ==> Says A B {|X, Crypt K (Nonce NB)|} # evs : yahalom lost" |
57 ==> Says A B {|X, Crypt K (Nonce NB)|} # evs : yahalom" |
58 |
58 |
59 (*This message models possible leaks of session keys. The Nonces |
59 (*This message models possible leaks of session keys. The Nonces |
60 identify the protocol run. Quoting Server here ensures they are |
60 identify the protocol run. Quoting Server here ensures they are |
61 correct.*) |
61 correct.*) |
62 Oops "[| evs: yahalom lost; A ~= Spy; |
62 Oops "[| evs: yahalom; A ~= Spy; |
63 Says Server A {|Crypt (shrK A) |
63 Says Server A {|Crypt (shrK A) |
64 {|Agent B, Key K, Nonce NA, Nonce NB|}, |
64 {|Agent B, Key K, Nonce NA, Nonce NB|}, |
65 X|} : set evs |] |
65 X|} : set evs |] |
66 ==> Says A Spy {|Nonce NA, Nonce NB, Key K|} # evs : yahalom lost" |
66 ==> Says A Spy {|Nonce NA, Nonce NB, Key K|} # evs : yahalom" |
67 |
67 |
68 |
68 |
69 constdefs |
69 constdefs |
70 KeyWithNonce :: [key, nat, event list] => bool |
70 KeyWithNonce :: [key, nat, event list] => bool |
71 "KeyWithNonce K NB evs == |
71 "KeyWithNonce K NB evs == |