packages feed

scyther-proof-0.3.0: data/examples/classic/WMF.spthy

theory WideMouthFrog
begin

section{* Wide Mouthed Frog *}

text{*
  The protocol is modeled after the description in the SPORE library:

    http://www.lsv.ens-cachan.fr/Software/spore/wideMouthedFrog.html

  Note that we cannot reason about the timestamps in our current model.
  Furthermore, our current calculus for backwards reasoning is too weak
  to reason about the original protocol

    1: I -> S: I, {TimeI, R, kIR}k(I,S)
    2: R <- S:    {TimeS, I, kIR}k(R,S)

  because the server S could receive the message {TimeI, R, kIR}k(I,S)
  arbitrarily many times from himself. Therefore, we added global constants
  identifying the different steps.
*}

protocol WMF
{
  1. I -> S: I,R, {'step1', TimeI, R, kIR}k(I,S)
  2. R <- S: S,I, {'step2', TimeS, I, kIR}k(R,S)
}


subsection{* Secrecy Properties *}

properties (of WMF)
  I_kIR_sec: secret(I, -, kIR, {I,R,S}) 
  S_kIR_sec: secret(S, 1, kIR, {I,R,S}) 
  R_kIR_sec: secret(R, 2, kIR, {I,R,S}) 


subsection{* Authentication Properties *}

text{*
  The authentication guarantee for the initiator is trivial because it does not
  receive any confirmation that the responder received the new session-key.
*}

property (of WMF) S_ni_synch:
  premises
    "role(3) = S"
    "step(3, S_1)"
    "uncompromised(I#3, S#3)"
  imply threads 1 such that
    " role(1) = I
    & I#1 = I#3 
    & R#1 = R#3
    & S#1 = S#3
    & TimeI#1 = TimeI#3
    & kIR#1 = kIR#3 
    &   St(1, I_1) < St(3, S_1)"

property (of WMF) R_ni_synch:
  premises
    "role(2) = R"
    "step(2, R_2)"
    "uncompromised(I#2, R#2, S#2)"
  imply threads 1, 3 such that
    " role(1) = I
    & role(3) = S
    & I#1 = I#2      & I#2 = I#3
    & R#1 = R#2      & R#2 = R#3
    & S#1 = S#2      & S#2 = S#3
    & TimeI#1 = TimeI#3
    & TimeS#2 = TimeS#3
    & kIR#1 = kIR#2  & kIR#2 = kIR#3
    &   St(1, I_1) < St(3, S_1)
      < St(3, S_2) < St(2, R_2)"

end