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