|
Introduction
Applet
Examples
Download
Research Papers
Changelog
To Do List
|
import prelude;
public providing : Word;
public acknowledging : Word;
public reception : Word;
public to : Word;
public for : Word;
public of : Word;
type Challenge = PoshChall ();
type ResponseBToA (a:Any, b:Any, na:Any)
= PoshResp ( begun(b acknowledging reception of na to a) );
type ResponseSToA (a:Any, b:Any, kab:SharedKey(a,b,kab), na:Any)
= PoshResp ( begun(providing kab to a for b),
begun(providing kab to b for a),
begun(b acknowledging reception of na to a) );
type ResponseSToB (a:Any, b:Any, kab:SharedKey(a,b,kab))
= PoshResp ( begun(providing kab to b for a),
begun(a acknowledging reception of kab to b) );
pattern Msg2 (b:Host)
= ( a:Un,
nonceA:ResponseBToA(a,b,nonceA),
Challenge );
pattern Msg3 (a:Un)
= ( b : Un,
kab : SharedKey(a,b,kab),
nonceA : ResponseSToA(a,b,kab,nonceA),
Challenge );
pattern Msg4a (b:Un)
= ( a:Un, kab:SharedKey(a,b,kab) );
pattern Msg4b (a:Host, b:Host, kab:SharedKey(a,b,kab))
= ( nonceB : ResponseSToB(a,b,kab) );
tag msg2(Msg2(b)) : Auth(b:Host, s:Server, kbs:SharedKey(b,s,kbs));
tag msg3(Msg3(a)) : Auth(a:Un, s:Server, kas:SharedKey(a,s,kas));
tag msg4a(Msg4a(b)) : Auth(b:Un, s:Server, kbs:SharedKey(b,s,kbs));
tag msg4b(Msg4b(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 Responder at b is (socket : Socket);
new (nonceA : Challenge);
output socket is (a, nonceA);
input socket is (
{ msg3 (b, kab:SharedKey(a,b,kab), nonceA, nonceB:Challenge) }kas,
ticket : Un
) [ begun(providing kab to a for b),
begun(providing kab to b for a),
begun(b acknowledging reception of nonceA to a) ];
end (providing kab to a for b);
end (b acknowledging reception of nonceA to a);
begin (a acknowledging reception of kab to b);
output socket is (ticket, { msg4b(nonceB) }kab );
}
server Responder
(b:Host, s:Server, kbs:SharedKey(b,s,kbs))
at b is (socketA : Socket)
{
input socketA is (a : Un, nonceA : Challenge);
establish Intermediary at s is (socketS : Socket);
new (nonceB : Challenge);
begin (b acknowledging reception of nonceA to a);
output socketS is (b, { msg2 (a, nonceA, nonceB) }kbs, socketA);
input socketA is (
{ msg4a (a, kab:SharedKey(a,b,kab)) }kbs,
ctext : Un
);
end (providing kab to b for a); // LINE END1
match ctext is { msg4b(nonceB) }kab; // LINE DECRYPT
//end (providing kab to b for a); // LINE END2
end (a acknowledging reception of kab to b);
}
server Intermediary (s:Server) at s is (socketB : Socket)
{
input socketB is (b:Un, request:Un, socketA:Socket);
let kbs:SharedKey(b,s,kbs) = lkupKey (b,s);
match request is { msg2 (
a:Un, nonceA:ResponseBToA(a,b,nonceA), nonceB:Challenge
) }kbs;
let kas:SharedKey(a,s,kas) = lkupKey (a,s);
new (kab : SharedKey(a,b,kab));
begin (providing kab to a for b);
begin (providing kab to b for a);
output socketA is (
{ msg3 (b, kab, nonceA, nonceB) }kas,
{ msg4a (a, kab) }kbs
);
}
|