tamarin-prover-0.4.0.0: data/examples/csf12/STS_MAC_fix1.spthy
theory STS_MAC_fix1
begin
builtins: diffie-hellman, signing
functions: mac/2
functions: KDF/1
section{* The Station-To-Station Protocol (MAC version, fix UKS attack with proof-of-possession of exponent) *}
/*
* Protocol: Station-To-Station, MAC variant: fix with CA Proof-of-Possession check
* Modeler: Cas Cremers
* Date: January 2012
* Source: "Unknown Key-Share Attacks on the Station-to-Station (STS) Protocol"
* Blake-Wilson, Simon and Menezes, Alfred
* PKC '99, Springer, 1999
*
* Status: working
*/
// Public keymat infrastructure
/**
* The !Pk facts can be regarded as certificates
*/
rule Register_pk_normal:
[ Fr(~ltk) ]
-->
[ !Ltk($A, ~ltk), !Pk($A, pk(~ltk)), Out(pk(~ltk)) ]
// Can register a key, but only if we know the exponent
// Models proof-of-possession check.
rule Register_pk_evil:
[ In(ltk) ]
--[ Corrupt($E) ]->
[ !Ltk($E, ltk), !Pk($E, pk(ltk)), Out(pk(ltk)) ]
// Protocol
rule Init_1:
let epkI = 'g'^~ekI
in
[ Fr(~ekI), !Ltk($I, ~ltkI) ]
-->
[ Init_1( $I, $R, ~ltkI, ~ekI )
, Out( <$I, $R, epkI> ) ]
rule Init_2:
let epkI = 'g'^~ekI
sigI = sign{ epkI, Y }~ltkI
sigR = sign{ Y, epkI }~ltkR
keymat = Y^~ekI
key = KDF(keymat)
in
[ Init_1( $I, $R, ~ltkI, ~ekI )
, !Pk($R, pk(~ltkR))
, In( <$R, $I, Y, sigR, mac( keymat, sigR)
> ) ]
--[ AcceptedI(~ekI,$I,$R,epkI,Y, key) ]->
[ Out( <$I, $R, sigI, mac( keymat, sigI) > ),
!SessionKey(~ekI,$I,$R, key)
]
rule Resp_1:
let epkR = 'g'^~ekR
sigI = sign{ X, epkR }~ltkI
sigR = sign{ epkR, X }~ltkR
keymat = X^~ekR
key = KDF(keymat)
in
[ !Ltk($R, ~ltkR)
, Fr(~ekR)
, In( <$I, $R, X > ) ]
-->
[ Resp_1( $I, $R, ~ltkR, ~ekR, X )
, Out(< $R, $I, epkR, sigR, mac( keymat, sigR ) >)
]
rule Resp_2:
let epkR = 'g'^~ekR
sigI = sign{ X, epkR }~ltkI
sigR = sign{ epkR, X }~ltkR
keymat = X^~ekR
key = KDF(keymat)
in
[ !Pk($I, pk(~ltkI))
, Resp_1( $I, $R, ~ltkR, ~ekR, X )
, In( <$I, $R, sigI, mac( keymat, sigI ) >)
]
--[ AcceptedR(~ekR,$I,$R,X,epkR, key ) ]->
[ !SessionKey(~ekR,$I,$R, key) ]
rule Sessionkey_Reveal:
[ !SessionKey(~tid, $I,$R,k) ]
--[ SesskRev(~tid) ]->
[ Out(k) ]
lemma KI_Perfect_Forward_Secrecy_I:
"not (Ex ttest I R sessKey #i1 #k hki hkr.
AcceptedI(ttest,I,R,hki,hkr,sessKey) @ i1 &
not (Ex #r. Corrupt(I) @ r) &
not (Ex #r. Corrupt(R) @ r) &
K(sessKey) @ k &
// No session keymat reveal of test
not (Ex #i3. SesskRev(ttest) @ i3) &
// No session keymat reveal of partner
not (Ex #i3 #i4 tpartner kpartner. SesskRev(tpartner) @ i3
& AcceptedR(tpartner,I,R,hki,hkr,kpartner) @ i4
)
)
"
lemma KI_Perfect_Forward_Secrecy_R:
"not (Ex ttest I R sessKey #i1 #k hki hkr.
AcceptedR(ttest,I,R,hki,hkr,sessKey) @ i1 &
not (Ex #r. Corrupt(I) @ r) &
not (Ex #r. Corrupt(R) @ r) &
K(sessKey) @ k &
// No session keymat reveal of test
not (Ex #i2. SesskRev(ttest) @ i2) &
// No session keymat reveal of partner
not (Ex #i2 #i3 tpartner kpartner. SesskRev(tpartner) @ i2
& AcceptedI(tpartner,I,R,hki,hkr,kpartner) @ i3
)
)
"
end