scyther-proof-0.3.0: data/examples/classic/KerberosV.spthy
theory KerberosV_no_timestamps
begin
section{* The Kerberos Protocol, Version V *}
text{*
Modeled after Bella's model in Isabelle/src/HOL/Auth/KerberosV.thy.
The differences to Bella's model are the following:
1. We do not model the timestamps and the timing properties because our
model does not support reasoning about them yet.
2. We do not model session key leakage, as our support for key compromise
properties is not ready yet.
3. We provide more general authentication and secrecy properties, as we do
not assume a priory the uncompromisedness of the ticket granting server.
Furthermore, the authentication propertis are more fine-grained due to
our more precise execution model.
4. We use explicit global constants instead of implicit typing to identify
the different encryptions.
*}
protocol KerberosV
{
1. C -> A: C,T,n1
2. <- A: A, {'TT21', AuthKey, C }k(T,A), {'TT22', AuthKey, n1, T}k(C,A)
C <- : A, TicketGrantingTicket, {'TT22', AuthKey, n1, T}k(C,A)
3. C -> : A, C, TicketGrantingTicket, {'TT3', C}AuthKey, C, S, n2
-> T: A, C, {'TT21', AuthKey, C}k(T,A), {'TT3', C}AuthKey, C, S, n2
4. <- T: T, {'TT41', ServerKey, C}k(S,T), {'TT42', ServerKey, n2, S}AuthKey
C <- : T, ServerTicket, {'TT42', ServerKey, n2, S}AuthKey
5. C -> : T, ServerTicket, {'TT5', C, t}ServerKey
-> S: T, {'TT41', ServerKey, C}k(S,T), {'TT5', C, t}ServerKey
6. C <- S: {'TT6', t}ServerKey
}
subsection{* Secrecy Properties *}
properties (of KerberosV)
auto: msc-typing
A_AuthKey_sec: secret(A, -, AuthKey, {C,A,T})
C_AuthKey_sec: secret(C, 2, AuthKey, {C,A,T})
T_AuthKey_sec: secret(T, 3, AuthKey, {C,A,T})
T_ServerKey_sec: secret(T, -, ServerKey, {C,A,T,S})
C_ServerKey_sec: secret(C, 4, ServerKey, {C,A,T,S})
C_t_sec: secret(C, -, t, {C,A,T,S})
subsection{* Authentication Properties *}
text{*
To simplify proof search, we first prove the following two first send
properties.
*}
property (of KerberosV) C_n1_first_send:
premises
"role(1) = C"
"knows(n1#1)"
imply
"St(1,C_1) < Ln(n1#1)"
property (of KerberosV) C_n2_first_send:
premises
"role(1) = C"
"knows(n2#1)"
imply
"St(1,C_3) < Ln(n2#1)"
property (of KerberosV) C_ni_synch:
premises
"role(1) = C"
"uncompromised(C#1, A#1, T#1, S#1)"
"step(1, C_6)"
imply threads 2, 3, 4 such that
"
// consequence from exchange with authenticator
role(2) = A &
A#1 = A#2 &
C#1 = C#2 &
T#1 = T#2 &
AuthKey#1 = AuthKey#2 &
n1#1 = n1#2 &
// consequence from exchange with ticket granting server
role(3) = T &
A#1 = A#3 &
C#1 = C#3 &
T#1 = T#3 &
S#1 = S#3 &
AuthKey#1 = AuthKey#3 &
n2#1 = n2#3 &
ServerKey#1 = ServerKey#3 &
// consequence from exchange with server
role(4) = S &
C#1 = C#4 &
T#1 = T#4 &
S#1 = S#4 &
t#1 = t#4 &
ServerKey#1 = ServerKey#4 &
// ordering
St(1, C_1) < St(2, A_1) <
St(2, A_2) < St(1, C_2) <
St(1, C_3) < St(3, T_3) <
St(3, T_4) < St(1, C_4) <
St(1, C_5) < St(4, S_5) <
St(4, S_6) < St(1, C_6)
"
property (of KerberosV) T_ni_synch:
premises
"role(3) = T"
"uncompromised(C#3, A#3, T#3)"
"step(3, T_3)"
imply threads 1, 2 such that
"
// consequence from receiving from client
role(1) = C &
A#1 = A#3 &
C#1 = C#3 &
T#1 = T#3 &
AuthKey#1 = AuthKey#3 &
// consequence of client receiving from authenticator
role(2) = A &
A#1 = A#2 &
C#1 = C#2 &
T#1 = T#2 &
AuthKey#1 = AuthKey#2 &
n1#1 = n1#2 &
// ordering consequences
St(1, C_1) < St(2, A_1) <
St(2, A_2) < St(1, C_2) <
St(1, C_3) < St(3, T_3)
"
text{*
here we can only formulate a weaker authentication property because the
uncompromisedness of the authenticator cannot be verified directly by the server.
What we can prove is under the assumption that we got our ServerKey from
some ticket granting server and this server was talking to an uncompromised
authenticator, then we have sort of an authentication.
*}
property (of KerberosV) S_auth:
premises
"role(4) = S"
"uncompromised(C#4, S#4, T#4)"
"step(4, S_5)"
"role(3) = T"
"uncompromised(A#3)"
"ServerKey#4 = ServerKey#3"
imply threads 1, 2 such that
"
// consequence from exchange with authenticator
role(1) = C &
role(2) = A &
A#1 = A#2 &
C#1 = C#2 &
T#1 = T#2 &
AuthKey#1 = AuthKey#2 &
n1#1 = n1#2 &
// consequence from exchange with ticket granting server
A#1 = A#3 &
C#1 = C#3 &
T#1 = T#3 &
S#1 = S#3 &
AuthKey#1 = AuthKey#3 &
n2#1 = n2#3 &
ServerKey#1 = ServerKey#3 &
// consequence from exchange with client
C#1 = C#4 &
T#1 = T#4 &
S#1 = S#4 &
t#1 = t#4 &
ServerKey#1 = ServerKey#4 &
// ordering consequences
St(1, C_1) < St(2, A_1) <
St(2, A_2) < St(1, C_2) <
St(1, C_3) < St(3, T_3) <
St(3, T_4) < St(1, C_4) <
St(1, C_5) < St(4, S_5)
"
end