Here is an excerpt of the theory.
functions: pk/1, sign/2, verify/3, h/1, senc/2, sdec/2,
//ECIES (
https://www.usenix.org/system/files/sec21-wang-yuchen.pdf)
encap/2, getkey/1, getcipher/1, decap/2,
parse1/1, parse2/1, mac/2
equations:
verify(sign(m, sk), m, pk(sk)) = true,
decap(sk, getcipher(encap(pk(sk), r))) = getkey(encap(pk(sk), r))
rule app_encryption:
let
na = p_na
nb = p_nb
auth_status = p_auth_status
Sig_b = p_Sig_b
Sig_t = p_Sig_t
result_encap = encap(KPPublicKey, ~APP_esk)
cipher = getcipher(result_encap)//Sender's ephemeral public key
key = getkey(result_encap)//Shared key
k1 = parse1(key)
k2 = parse2(key)
C1 = senc(data, k1)
C2 = mac(C1, k2)
senct = <cipher, C1, C2>
hash = h(<na, Bind_Tuple, nb, Sig_b, senct>)
Sig_t = sign(hash, UserPrivateKey)
in
[
F_State_A2($User,$Keypod1, p_na,p_nb,p_auth_status,p_Sig_b,p_Sig_t ),
Fr(~APP_esk),
!PkK($Keypod1, KPPublicKey),
!Data($User, data),
!Bind($Keypod1, $Keypod2, $Keypod3, $User, $RegCenter, Bind_Tuple),
!LtkU($User, UserPrivateKey)
]
--[ AppEnc($User, $Keypod1, $RegCenter, data) ]->
[
F_State_A3($User,$Keypod1, na,nb,auth_status,Sig_b,Sig_t ),
Out(<senct, Sig_t, '3'>)
]
rule keypod_decryption:
let
na = p_na
nb = p_nb
auth_status = p_auth_status
Sig_b = p_Sig_b
Sig_t = p_Sig_t
auth_status = <'0', 'auth'>
senct = <C0, C1, C2>
hash = h(<na, Bind_Tuple, nb, Sig_b, senct>)
Sig_t = SignatureT
result_Sig_t = verify(Sig_t, hash, UserPublicKey)
key = decap(C0, KPPrivateKey)
k1 = parse1(key)
k2 = parse2(key)
mac = mac(C1, k2)
data = sdec(C1, k1)
in
[
F_State_K2($Keypod1,$User,$RegCenter, p_na,p_nb,p_auth_status,p_Sig_b,p_Sig_t ),
In(<<C0, C1, C2>, SignatureT, '3'>),
!LtkK($Keypod1, KPPrivateKey),
!Bind($Keypod1, $Keypod2, $Keypod3, $User, $RegCenter, Bind_Tuple),
!PkU($User, UserPublicKey)
]
--[ Eq(mac, C2),
Eq(result_Sig_t, true),
CIdentity($Keypod1, $User, $RegCenter, <'0', 'auth'>),
CNonces($Keypod1, $User, $RegCenter, <na, nb>),
DataBackup($Keypod1, $User, $RegCenter, data) ]->
[
F_State_K3($Keypod1,$User,$RegCenter, na,nb,auth_status,Sig_b,Sig_t ),
!Data_Backup($Keypod1, $User, $RegCenter, data)
]
lemma data_backup_honest_setup:
exists-trace
" Ex Keypod User RegCenter data #i.
DataBackup(Keypod, User, RegCenter, data) @ i
& not (Ex #r. LtkKReveal(Keypod) @ r & #r < #i)
& not (Ex #r. LtkUReveal(User) @ r & #r < #i)
& not (Ex #r. LtkRReveal(RegCenter) @ r & #r < #i)
& not (Ex #r. DataReveal(User) @ r & #r < #i)
"
Meanwhile, I am attaching two proof trace graphs provided by Tamarin:
contraint 1 only (trace found)
. Constraint 1 and 2 both (contradiction)
Thanks in advance,
Hezl