import oldprelude;
public Responder : Server;
public Initiator : Client;
public sent : Word;
public for : Word;
type NonceA (msgB : Payload) = Nonce (end (Initiator for Bob sent msgB));
type NonceB (msgA : Payload) = Nonce (end (Responder for Alice sent msgA));
type Msg2 = Struct (msgA : Payload, b : Host, nonceA : Challenge, nonceB' : NonceB (msgA));
type Msg3 = Struct (msgB : Payload, nonceA' : NonceA (msgB), nonceB : Challenge);
type MutualMsg = Union (msg2 : Msg2, msg3 : Msg3);
type MutualKey = Key (MutualMsg);
private SKey : MutualKey;
server Responder at Alice is (socket : Socket) {
input socket is (nonceB : Challenge);
new (msgA : Payload);
new (nonceA : Challenge);
begin (Responder for Alice sent msgA);
cast nonceB is (nonceB' : NonceB (msgA));
output socket is ({ msg2 (msgA, Bob, nonceA, nonceB') }SKey);
input socket is ({ msg3 (msgB : Payload, nonceA' : NonceA (msgB), nonceB) }SKey);
check nonceA is nonceA';
end (Initiator for Bob sent msgB);
}
client Initiator at Bob is {
establish Responder at Alice is (socket : Socket);
new (msgB : Payload);
new (nonceB : Challenge);
begin (Initiator for Bob sent msgB);
output socket is (nonceB);
input socket is ({ msg2(msgA : Payload, Bob, nonceA : Challenge, nonceB' : NonceB (msgA)) }SKey);
check nonceB is nonceB';
cast nonceA is (nonceA' : NonceA (msgB));
output socket is ({ msg3(msgB, nonceA', nonceB) }SKey);
end (Responder for Alice sent msgA);
}
|