scyther-proof-0.3.0: data/examples/classic/BKE.spthy
theory BKE
begin
section{* Bilateral Key Exchange with Public Key protocol (BKEPK) *}
text{*
Modeled after the description 6.6.6 in the Clark-Jacob library:
http://www.csl.sri.com/users/millen/capsl/library2.html
Notable differences:
1. We are using explicit global constants to identify the different
encryptions instead of implicit typing.
*}
protocol BKE {
1. I -> R: I, { 'TT1', ni, I }pk(R)
2. I <- R: { 'TT2', h(ni), nr, R, kir }pk(I)
3. I -> R: { 'TT3', h(nr) }kir
}
subsection{* Secrecy Properties *}
properties (of BKE)
// type invariant inferred from the protocol specification
auto: msc-typing
// originated terms secrecy
I_ni_secrecy: secret(I, -, ni, {I,R})
R_nr_secrecy: secret(R, -, nr, {I,R})
R_kir_secrecy: secret(R, -, kir, {I,R})
// composed originated terms secrecy
I_hash_ni_secrecy: secret(I, -, h(ni), {I,R})
R_hash_nr_secrecy: secret(R, -, h(nr), {I,R})
// variable secrecy
I_nr_secrecy: secret(I, 2, nr, {I,R})
I_kir_secrecy: secret(I, 2, kir, {I,R})
R_ni_secrecy: secret(R, 3, ni, {I,R})
subsection{* Authentication Properties *}
property (of BKE) I_ni_synch:
premises
"role(1) = I"
"step(1, I_3)"
"uncompromised(I#1,R#1)"
imply a thread 2 such that
" role(2) = R
& I#1 = I#2
& R#1 = R#2
& ni#1 = ni#2
& nr#1 = nr#2
& kir#1 = kir#2
& St(1,I_1) < St(2,R_1)
< St(2,R_2) < St(1,I_2)
< St(1,I_3)"
property (of BKE) R_ni_synch:
premises
"role(1) = R"
"step(1, R_3)"
"uncompromised(I#1,R#1)"
imply a thread 2 such that
" role(2) = I
& I#1 = I#2
& R#1 = R#2
& ni#1 = ni#2
& nr#1 = nr#2
& kir#1 = kir#2
& St(2,I_1) < St(1,R_1)
< St(1,R_2) < St(2,I_2)
< St(2,I_3) < St(1,R_3)"
end