/* 
	Bilateral Key Exchange with Public Key protocol (bkepkCE2)

	Version from Corin/Etalle: An Improved Constraint-Based System for the Verification of Security Protocols.
	Tried to stay as close as possible to compare timing results.
*/

usertype Key;

const pk,hash: Function;
secret sk: Function;

inversekeys (pk,sk);

protocol bkepkCE2(A,B,testnonce)
{
	role B
	{
		fresh nb: Nonce;
		var na: Nonce;
		var kab: Key;

		send_1 (B,A, B,{ nb,B }pk(A) );
		recv_2 (A,B, { hash(nb),na,A,kab }pk(B) );
		send_3 (B,A, { hash(na) }kab );
	}

	role A
	{
		var nb: Nonce;
		fresh na: Nonce;
		fresh kab: Key;

		recv_1 (B,A, B,{ nb,B }pk(A) );
		send_2 (A,B, { hash(nb),na,A,kab }pk(B) );
		recv_3 (B,A, { hash(na) }kab );
	}

	role testnonce
	{
		var n: Nonce;

		recv_!4 (testnonce,testnonce, n);
	}
}

const Alice,Bob,Eve;




