# Lowe's modified version of Yahalom
#
# Modelled after the description in the SPORE library
# http://www.lsv.ens-cachan.fr/spore/yahalomLowe.html
#
#

secret k : Function;

usertype SessionKey;


protocol yahalom-Lowe(I,R,S)
{
    role I
    {
        const Ni: Nonce;
        var Nr: Nonce;
        var Kir: SessionKey;

        send_1(I,R, I,Ni);
        read_3(S,I, {R,Kir,Ni,Nr}k(I,S) );
        send_5(I,R, {I, R, S, Nr}Kir );

        claim_I1(I, Secret,Kir);
        claim_I2(I, Nisynch);
    }

    role R
    {
        const Nr: Nonce;
        var Ni: Nonce;
        var Kir: SessionKey;

        read_1(I,R, I,Ni);
        send_2(R,S, {I,Ni,Nr}k(R,S) );
        read_4(S,R, {I,Kir}k(R,S));
        read_5(I,R, {I, R, S, Nr}Kir);

        claim_R1(R, Secret,Kir);
        claim_R2(R, Nisynch);
    }

    role S
    {
        const Kir: SessionKey;
        var Ni,Nr: Nonce;

        read_2(R,S, {I,Ni,Nr}k(R,S) );
        send_3(S,I, {R,Kir,Ni,Nr}k(I,S));
        send_4(S,R, {I,Kir}k(R,S));
    }
}

const Alice,Bob,Simon : Agent;

