import prelude;
public sending : Word;
public to : Word;
public acknowledging : Word;
public receipt : Word;
public of : Word;
type Challenge = PoshChall();
type ResponseAToB (a:Any, b:Any, k:Any)
= PoshResp ( begun(a sending k to b) );
type ResponseBToA (a:Any, b:Any, k:Any)
= PoshResp ( begun(b acknowledging to a receipt of k) );
pattern Msg2 (a:Any, b:Any)
= ( hash ( n:ResponseAToB(a,b,k) ), k:SharedKey(a,b,k) );
pattern Msg3 (a:Any, b:Any, k:Any)
= ResponseBToA(a,b,k);
tag msg2 (Msg2(a,b)) : Auth (a:Any,b:Any,k:Any);
tag msg3 (Msg3(a,b,k)) : Auth (a:Any,b:Any,k:Any);
fun lkupKey (p:Any,q:Any) : (k:SharedKey(p,q,k));
client Initiator (b:Host, a:Host, kab:SharedKey(a,b,kab)) at b is
{
establish Responder at a is (socket : Socket);
new (nb : Challenge);
output socket is (b,nb);
input socket is (na:Challenge, { msg2( hash(nb), k:SharedKey(a,b,k) ) }kab )
[ begun (a sending k to b) ];
end (a sending k to b);
begin (b acknowledging to a receipt of k);
output socket is { hash( msg3(na) ) }k;
}
server Responder (a:Host) at a is (socket : Socket)
{
input socket is (b:Un, nb:Challenge);
new (k : SharedKey(a,b,k));
new (na : Challenge);
let kab : SharedKey(a,b,kab) = lkupKey (a,b);
begin (a sending k to b);
output socket is (na, { msg2( hash(nb), k ) }kab);
input socket is { hash( msg3(na) ) }k
[ begun (b acknowledging to a receipt of k) ];
end (b acknowledging to a receipt of k);
}
|