
usertype Key;

const pk: Function;
secret sk: Function;
inversekeys(pk,sk);

protocol tmn(A,B,S)
{
	role A
	{
		const Ka: Key;
		var Kb: Key;

		send_1(A,S, B,{Ka}pk(S) );
		read_4(S,A, B,{Kb}Ka );

		#claim_5(A,Secret,Ka);
		#claim_8(A,Secret,Kb);
	}	
	
	role B
	{
		const Kb: Key;

		read_2(S,B, A );
		send_3(B,S, A, { Kb }pk(S) );

		claim_6(B,Secret,Kb);
	}

	role S
	{
		var Ka,Kb: Key;

		read_1(A,S, B,{Ka}pk(S) );
		send_2(S,B, A );
		read_3(B,S, A, { Kb }pk(S) );
		send_4(S,A, B,{Kb}Ka );

		#claim_7(S,Secret,Ka);
	}
}

const Alice,Bob,Eve,Simon: Agent;
const Ke: Key;


untrusted Eve;
compromised sk(Eve);

# Scenario to recreate an attack in SPORE
run tmn.B (Alice,Bob,Simon);
run tmn.S (Alice,Bob,Simon);


