# 1 "tls-paulson.cpp"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "tls-paulson.cpp"
# 21 "tls-paulson.cpp"
usertype Params, Bool, SessionID;

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

const pa,pb: Params;
const false,true: Bool;


protocol tlspaulson(a,b)
{
 role a
 {
  fresh na: Nonce;
  fresh sid: SessionID;
  fresh pms: Nonce;
  var nb: Nonce;
  var pb: Params;

  send_1( a,b, a,na,sid,pa );
  recv_2( b,a, nb,sid,pb );
  recv_3( b,a, { b,pk(b) }sk(Terence) );
  send_4( a,b, { a,pk(a) }sk(Terence) );
  send_5( a,b, { pms }pk(b) );
  send_6( a,b, { hash(nb,b,pms) }sk(a) );
  send_7( a,b, { hash(hash(pms,na,nb),a,na,sid,pa,pb,nb,sid,pb,{ a,pk(a) }sk(Terence),{ b,pk(b) }sk(Terence),{pms}pk(b)) }hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,false) );
  recv_8( b,a, { hash(hash(pms,na,nb),a,na,sid,pa,pb,nb,sid,pb,{ a,pk(a) }sk(Terence),{ b,pk(b) }sk(Terence),{pms}pk(b)) }hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,true) );

  claim_9a(a, Secret, hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,true));
  claim_9b(a, Secret, hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,false));

 }

 role b
 {
  var na: Nonce;
  var sid: SessionID;
  var pms: Nonce;
  fresh nb: Nonce;
  fresh pb: Params;

  recv_1( a,b, a,na,sid,pa );
  send_2( b,a, nb,sid,pb );
  send_3( b,a, { b,pk(b) }sk(Terence) );
  recv_4( a,b, { a,pk(a) }sk(Terence) );
  recv_5( a,b, { pms }pk(b) );
  recv_6( a,b, { hash(nb,b,pms) }sk(a) );
  recv_7( a,b, { hash(hash(pms,na,nb),a,na,sid,pa,pb,nb,sid,pb,{ a,pk(a) }sk(Terence),{ b,pk(b) }sk(Terence),{pms}pk(b)) }hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,false) );
  send_8( b,a, { hash(hash(pms,na,nb),a,na,sid,pa,pb,nb,sid,pb,{ a,pk(a) }sk(Terence),{ b,pk(b) }sk(Terence),{pms}pk(b)) }hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,true) );

  claim_10a(b, Secret, hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,true));
  claim_10b(b, Secret, hash(sid,hash(pms,na,nb),na,pa,a,nb,pb,b,false));
 }
}


const side: SessionID;
const pe: Params;

