role alice( A,B : agent, K : symmetric_key, Hash : hash_func, SND,RCV : channel(dy)) played_by A def= local State : nat, Na,Nb : text, K1 : message init State := 0 transition 1. State = 0 /\ RCV(start) =|> State’:= 2 /\ Na’ := new() /\ SND({Na’}_K) 2. State = 2 /\ RCV({Nb’}_K) =|> State’:= 4 /\ K1’ := Hash(Na.Nb’) /\ SND({Nb’}_K1’) /\ witness(A,B,bob_alice_nb,Nb’) end role role bob( A,B : agent, K : symmetric_key, Hash : hash_func, SND,RCV : channel(dy)) played_by B def= local State : nat, Nb,Na : text, K1 : message init State := 1 transition 1. State = 1 /\ RCV({Na’}_K) =|> State’:= 3 /\ Nb’ := new() /\ SND({Nb’}_K) /\ K1’:= Hash(Na’.Nb’) /\ secret(K1’,k1,{A,B}) 2. State = 3 /\ RCV({Nb}_K1) =|> State’:= 5 /\ request(B,A,bob_alice_nb,Nb) end role role session( A,B : agent, K : symmetric_key, Hash : hash_func) def= local SA, SB, RA, RB : channel (dy) composition alice(A,B,K,Hash,SA,RA) /\ bob (A,B,K,Hash,SB,RB) end role role environment() def= const bob_alice_nb, k1 : protocol_id, kab,kai,kib : symmetric_key, a,b : agent, h : hash_func intruder_knowledge = {a,b,h,kai,kib} composition session(a,b,kab,h) /\ session(a,i,kai,h) /\ session(i,b,kib,h) end role goal secrecy_of k1 authentication_on bob_alice_nb end goal environment()