|
Introduction
Applet
Examples
Download
Research Papers
Changelog
To Do List
|
import prelude;
public providing : Word;
public to : Word;
public for : Word;
type Challenge = PoshChall ();
type ResponseToA ( s:Server, a:Any, b:Any, kab:SharedKey(a,b) )
= PoshResp ( begun(s providing kab to a for b) );
type ResponseToB ( s:Server, a:Any, b:Any, kab:SharedKey(a,b) )
= PoshResp ( begun(s providing kab to b for a) );
pattern Msg3 (b:Any, s:Server)
= ( kab : SharedKey(a,b), nonce:ResponseToB(s,a,b,kab), a:Un, _ );
pattern Msg4 (a:Any, s:Server)
= ( kab:SharedKey(a,b), nonce:ResponseToA(s,a,b,kab), _, b:Un );
tag msg3(Msg3(b,s)) : Auth (b:Un,s:Server);
tag msg4(Msg4(a,s)) : Auth (a:Un,s:Server);
fun lkupKey(p:Any,q:Any) : SharedKey(p,q);
client Initiator
(a:Host, b:Host, s:Server, kas:SharedKey(a,s))
at a is
{
establish Responder at b is (socket:Socket);
new (nonceA:Challenge);
output socket is (a,b,nonceA);
input socket is { msg4(kab:SharedKey(a,b),nonceA,a,b) }kas
[ begun(s providing kab to a for b) ];
end(s providing kab to a for b);
}
server Responder
(b:Host, s:Server, kbs:SharedKey(b,s))
at b is (socketA:Socket)
{
input socketA is (a:Un,b,nonceA:Challenge);
establish Intermediary at s is (socketS:Socket);
new (nonceB:Challenge);
output socketS is (a,b,nonceA,nonceB);
input socketS is (
ticketA:Un,
{ msg3(kab:SharedKey(a,b),nonceB,a,b) }kbs
) [ begun(s providing kab to b for a) ];
output socketA is ticketA;
end (s providing kab to b for a);
}
server Intermediary (s:Server) at s is (socket:Socket) {
input socket is (a:Un,b:Un,nonceA:Challenge,nonceB:Challenge);
let kas:SharedKey(a,s) = lkupKey(a,s);
let kbs:SharedKey(b,s) = lkupKey(b,s);
new (kab:SharedKey(a,b));
begin (s providing kab to a for b);
begin (s providing kab to b for a);
output socket is ({ msg4(kab,nonceA,a,b) }kas, { msg3(kab,nonceB,a,b) }kbs);
}
|