|
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 initiator : Word;
public responder : Word;
public shares : Word;
public with : Word;
public for : Word;
public and : Word;
public generated : Word;
public acknowledges : Word;
type ISO5SNonceA (a : Host, b : Host)
= Nonce ( end ( responder b acknowledges initiator a ) );
type ISO5SNonceB (a : Host, b : Host)
= Nonce ( end ( initiator a acknowledges responder b ) );
type ISO5SMsg4 (a : Host, b : Host)
= Struct ( nonceA2' : ISO5SNonceA (a, b), nonceB2 : Challenge );
type ISO5SMsg5 (a : Host, b : Host)
= Struct ( nonceA2' : ISO5SNonceA (a, b), nonceB2' : ISO5SNonceB (a, b) );
type ISO5SMsg (a : Host, b : Host)
= Union ( msg4 : ISO5SMsg4 (a, b), msg5 : ISO5SMsg5 (a, b) );
type ISO5SKey (a : Host, b : Host)
= Key (ISO5SMsg (a, b));
type ISO5NonceA (a : Host, b : Host, sKey : ISO5SKey (a, b))
= Nonce ( end ( Sam generated sKey for initiator a and responder b ) );
type ISO5NonceB (a : Host, b : Host, sKey : ISO5SKey (a, b))
= Nonce ( end ( Sam generated sKey for responder b and initiator a ) );
type ISO5Msg3a (a : Host)
= Struct ( b : Host, sKey : ISO5SKey (a, b), nonceA1' : ISO5NonceA (a, b, sKey) );
type ISO5Msg3b (b : Host)
= Struct ( a : Host, sKey : ISO5SKey (a, b), nonceB1' : ISO5NonceB (a, b, sKey) );
type ISO5Msg (h : Host)
= Union ( msg3a : ISO5Msg3a (h), msg3b : ISO5Msg3b (h) );
type ISO5Key (h : Host)
= Key (ISO5Msg (h));
type ISO5KDCMsg
= Struct (h : Host, keyH : ISO5Key (h));
type ISO5KDCKey
= Key (ISO5KDCMsg);
private keyA : ISO5Key (Alice);
private keyB : ISO5Key (Bob);
private keyKDC : ISO5KDCKey;
client Initiator at Alice is {
new (nonceA1 : Challenge);
new (nonceA2 : Challenge);
establish Responder at Bob is (socket : Socket);
output socket is (Alice, nonceA1, nonceA2);
input socket is (
{ msg3a (
Bob,
sKey : ISO5SKey (Alice, Bob),
nonceA1' : ISO5NonceA (Alice, Bob, sKey)
) }keyA,
ticket : Un
);
decrypt ticket is ( { msg4 (
nonceA2' : ISO5SNonceA (Alice, Bob),
nonceB2 : Challenge
) }sKey );
check nonceA1 is nonceA1';
check nonceA2 is nonceA2';
end (Sam generated sKey for initiator Alice and responder Bob);
begin (initiator Alice acknowledges responder Bob);
cast nonceB2 is (nonceB2' : ISO5SNonceB (Alice, Bob) );
output socket is ( { msg5 ( nonceA2', nonceB2' ) }sKey );
end (responder Bob acknowledges initiator Alice);
}
server Responder at Bob is (socketA : Socket) {
establish Intermediary at Sam is (socketS : Socket);
new (nonceB1 : Challenge);
new (nonceB2 : Challenge);
input socketA is (a : Host, nonceA1 : Challenge, nonceA2 : Challenge);
output socketS is (a, nonceA1, Bob, nonceB1);
input socketS is (
{ msg3b (
a,
sKey : ISO5SKey (a, Bob),
nonceB1' : ISO5NonceB (a, Bob, sKey)
) }keyB,
ticket : Un);
check nonceB1 is nonceB1';
end (Sam generated sKey for responder Bob and initiator a);
begin (responder Bob acknowledges initiator a);
cast nonceA2 is (nonceA2' : ISO5SNonceA (a, Bob) );
output socketA is ( ticket, { msg4 ( nonceA2', nonceB2 ) }sKey );
input socketA is ( { msg5 ( nonceA2', nonceB2' : ISO5SNonceB (a, Bob) ) }sKey );
check nonceB2 is nonceB2';
end (initiator a acknowledges responder Bob);
}
server Intermediary at Sam is (socketB : Socket) {
input socketB is (a : Host, nonceA1 : Challenge, b : Host, nonceB1 : Challenge);
establish KDC at KDCHost is (socketKDC : Socket);
output socketKDC is (a);
input socketKDC is ({ a, keyA : ISO5Key (a) }keyKDC);
output socketKDC is (b);
input socketKDC is ({ b, keyB : ISO5Key (b) }keyKDC);
new (sKey : ISO5SKey (a, b));
begin (Sam generated sKey for initiator a and responder b);
begin (Sam generated sKey for responder b and initiator a);
cast nonceA1 is (nonceA1' : ISO5NonceA (a, b, sKey));
cast nonceB1 is (nonceB1' : ISO5NonceB (a, b, sKey));
output socketB is (
{ msg3b ( a, sKey, nonceB1' ) }keyB,
{ msg3a ( b, sKey, nonceA1' ) }keyA
);
}
|