|
Introduction
Applet
Examples
Download
Research Papers
Changelog
To Do List
|
import oldprelude;
public Initiator : Client;
public Responder : Server;
public Intermediary : Server;
public KDC : Server;
public KDCHost : Host;
public providing : Word;
public contacting : Word;
public contacted : Word;
public session : Word;
public key : Word;
public with : Word;
public by : Word;
public to : Word;
public for : Word;
type WLMANonceA2 (a : Host, b : Host)
= Nonce ( end (b contacted by a) );
type WLMANonceB2 (a : Host, b : Host)
= Nonce ( end (a contacting b) );
type WLMASMsg6 (a : Host, b : Host)
= Struct ( nonceA2' : WLMANonceA2 (a, b), nonceB2 : Challenge );
type WLMASMsg7 (a : Host, b : Host)
= WLMANonceB2 (a, b);
type WLMASMsg (a : Host, b : Host)
= Union ( msg6 : WLMASMsg6 (a, b), msg7 : WLMASMsg7 (a, b), msgP : Payload );
type WLMASKey (a : Host, b : Host)
= Key ( WLMASMsg (a, b) );
type WLMANonceB1 (a : Host, b : Host, sKey : WLMASKey (a, b))
= Nonce ( end (Sam providing session key sKey to b for a) );
type WLMANonceA1 (a : Host, b : Host, sKey : WLMASKey (a, b))
= Nonce ( end (Sam providing session key sKey for a to b) );
type WLMAMsg3 (a : Host)
= Struct ( a' : Host, b: Host, nonceA1 : Challenge, nonceB1 : Challenge );
type WLMAMsg4 (b : Host)
= Struct ( a : Host, b': Host, nonceA1 : Challenge, nonceB1 : Challenge );
type WLMAMsg5a (a : Host)
= Struct ( b : Host, sKey : WLMASKey (a, b), nonceA1' : WLMANonceA1 (a, b, sKey), nonceB1' : WLMANonceB1 (a, b, sKey) );
type WLMAMsg5b (b : Host)
= Struct ( a : Host, sKey : WLMASKey (a, b), nonceA1' : WLMANonceA1 (a, b, sKey), nonceB1' : WLMANonceB1 (a, b, sKey) );
type WLMAMsg (h : Host)
= Union ( msg3 : WLMAMsg3 (h), msg4 : WLMAMsg4 (h), msg5a : WLMAMsg5a (h), msg5b : WLMAMsg5b (h) );
type WLMAKey (h : Host)
= Key (WLMAMsg (h));
type WLMAKDCMsg = Struct (h : Host, keyH : WLMAKey (h));
type WLMAKDCKey = Key (WLMAKDCMsg);
private keyA : WLMAKey (Alice);
private keyB : WLMAKey (Bob);
private keyKDC : WLMAKDCKey;
client Initiator at Alice is {
begin (Alice contacting Bob);
establish Responder at Bob is (socketB : Socket);
new (nonceA1 : Challenge);
new (nonceA2 : Challenge);
output socketB is (Alice, nonceA1, nonceA2);
input socketB is (Alice, Bob, nonceB1 : Challenge, nonceB2 : Challenge);
output socketB is ({ msg3 (Alice, Bob, nonceA1, nonceB1) }keyA);
input socketB is ({ msg5a (
Bob,
sKey : WLMASKey (Alice, Bob),
nonceA1' : WLMANonceA1 (Alice, Bob, sKey),
nonceB1' : WLMANonceB1 (Alice, Bob, sKey)
) }keyA, { msg6 (
nonceA2' : WLMANonceA2 (Alice, Bob),
nonceB2
) }sKey);
cast nonceB2 is (nonceB2' : WLMANonceB2 (Alice, Bob));
output socketB is ( { msg7 (nonceB2') }sKey );
check nonceA1 is nonceA1';
check nonceA2 is nonceA2';
end (Bob contacted by Alice);
end (Sam providing session key sKey for Alice to Bob);
}
server Responder at Bob is (socketA : Socket) {
input socketA is (a : Host, nonceA1 : Challenge, nonceA2 : Challenge);
begin (Bob contacted by a);
new (nonceB1 : Challenge);
new (nonceB2 : Challenge);
output socketA is (Bob, nonceB1, nonceB2);
input socketA is ( ctext3 : CText );
establish Intermediary at Sam is (socketS : Socket);
output socketS is ( ctext3, { msg4 (
a,
Bob,
nonceA1,
nonceB1
) }keyB );
input socketS is ( ctext5a : CText, { msg5b (
a,
sKey : WLMASKey (a, Bob),
nonceA1' : WLMANonceA1 (a, Bob, sKey),
nonceB1' : WLMANonceB1 (a, Bob, sKey)
) }keyB );
check nonceB1 is nonceB1';
cast nonceA2 is ( nonceA2' : WLMANonceA2 (a, Bob) );
output socketA is ( ctext5a, { msg6 ( nonceA2', nonceB2 ) }sKey );
input socketA is ( { msg7 ( nonceB2' : WLMANonceB2 (a, Bob) ) }sKey );
check nonceB2 is nonceB2';
end (a contacting Bob);
end (Sam providing session key sKey to Bob for a);
}
server Intermediary at Sam is (socketB : Socket) {
input socketB is ( a : Host, b : Host, ctext3 : CText, ctext4 : CText );
establish KDC at KDCHost is (socketKDC : Socket);
output socketKDC is (a);
input socketKDC is ({ a, keyA : WLMAKey (a) }keyKDC);
output socketKDC is (b);
input socketKDC is ({ b, keyB : WLMAKey (b) }keyKDC);
decrypt ctext3 is ( { msg3 ( a, b, nonceA1 : Challenge, nonceB1 : Challenge ) }keyA );
decrypt ctext4 is ( { msg4 ( a, b, nonceA1, nonceB1 ) }keyB );
new (sKey : WLMASKey (a, b));
begin (Sam providing session key sKey for a to b);
begin (Sam providing session key sKey to b for a);
cast nonceA1 is (nonceA1' : WLMANonceA1 (a, b, sKey));
cast nonceB1 is (nonceB1' : WLMANonceB1 (a, b, sKey));
output socketB is (
{ msg5a ( b, sKey, nonceA1', nonceB1' ) }keyA,
{ msg5b ( a, sKey, nonceA1', nonceB1' ) }keyB
);
}
|