|
Introduction
Applet
Examples
Download
Research Papers
Changelog
To Do List
|
import prelude;
public providing : Word;
public session : Word;
public key : Word;
public to : Word;
public for : Word;
type Challenge = PoshChall ();
type ResponseSToA ( a:Un, b:Un, kab:SharedKey(a,b,kab) )
= PoshResp ( begun(providing session key kab to a for b),
begun(providing session key kab to b for a) );
type ResponseAToB ( a:Host, b:Host, kab:SharedKey(a,b,kab) )
= PoshResp ( begun(providing session key kab to b for a) );
pattern Msg2 ( a:Un, s:Server, kas:SharedKey(a,s,kas) )
= ( nonceA : ResponseSToA(a,b,kab),
b : Un,
kab : SharedKey(a,b,kab),
ticket : Un );
pattern Msg3 ( b:Un, s:Server, kbs:SharedKey(b,s,kbs) )
= ( kab : SharedKey(a,b,kab), a : Un );
pattern Msg4 ( a:Un, b:Host, kab:SharedKey(a,b,kab) )
= Challenge;
pattern Msg5 ( a:Host, b:Host, kab:SharedKey(a,b,kab) )
= ResponseAToB(a,b,kab);
tag msg2(Msg2(a,s,kas)) : Auth(a:Un, s:Server, kas:SharedKey(a,s,kas));
tag msg3(Msg3(b,s,kbs)) : Auth(b:Un, s:Server, kbs:SharedKey(b,s,kbs));
tag msg4(Msg4(a,b,kab)) : Auth(a:Un, b:Host, kab:SharedKey(a,b,kab));
tag msg5(Msg5(a,b,kab)) : Auth(a:Host, b:Host, kab:SharedKey(a,b,kab));
fun lkupKey (p:Any,q:Any) : (k:SharedKey(p,q,k));
client Initiator
(a:Host, b:Host, s:Server, kas:SharedKey(a,s,kas))
at a is
{
establish Intermediary at s is (socketS : Socket);
new (nonceA : Challenge);
output socketS is (a, b, nonceA);
input socketS is { msg2(nonceA, b, kab:SharedKey(a,b,kab), ticket:Un) }kas
[ begun(providing session key kab to a for b),
begun(providing session key kab to b for a) ];
end(providing session key kab to a for b);
establish Responder at b is (socketB : Socket);
output socketB is ticket;
input socketB is { msg4 (nonceB:Challenge) }kab;
output socketB is { msg5(nonceB) }kab;
}
server Responder
(b:Host, s:Server, kbs:SharedKey(b,s,kbs))
at b is (socket : Socket)
{
input socket is { msg3(kab:SharedKey(a,b,kab), a:Un) }kbs;
new (nonceB : Challenge);
end (providing session key kab to b for a); // line b3
output socket is { msg4(nonceB) }kab; // line b4
input socket is { msg5(nonceB) }kab; // line b5
//end (providing session key kab to b for a); // line b6
}
server Intermediary (s:Server) at s is (socket : Socket) {
input socket is (a:Un, b:Un, nonceA:Challenge);
let kas:SharedKey(a,s,kas) = lkupKey (a,s);
let kbs:SharedKey(b,s,kbs) = lkupKey (b,s);
new (kab : SharedKey(a,b,kab));
begin(providing session key kab to a for b);
begin(providing session key kab to b for a);
output socket is { msg2(nonceA, b, kab, { msg3(kab,a) }kbs) }kas;
}
|