The Private Authentication protocol as described in [F] involves an initiator A and a responder B.
The initiator A sends a message enc(<pkA,n0>,r0,pkB)
to the responder B, where pkA
(respectively pkB
) is the public key of A (respectively B). The responder B checks that the first projection of the decryption of the received message is equal to pkA
and that the second projection of the decryption of the received message has a correct length. In that case, B sends back enc(<n0,n>,r,pkA)
.
The protocol is as follows:
This is a “light” model without the last check of A.
In this file, we prove anonymity, i.e. that an attacker cannot tell whether a session is initiated by an identity A or by an identity Abis.
[F] G. Bana and H. Comon-Lundh. A computationally complete symbolic attacker for equivalence properties. In 2014 ACM Conference on Computer and Communications Security, CCS ’14, pages 609–620. ACM, 2014
When this option is set to true
, Squirrel checks whether each tactic invoked for the proof is also sound for quantum attackers.
We first declare the communication channels, the function symbols for the public encryption scheme as well as the several names used in the protocol’s messages.
abstract (++) : message -> message -> message.We also declare a public function symbol plus
, which we will use to model the addition of lengths of messages.
The initiator A is indexed by i
to represent an unbounded number of sessions and is defined by a single output.
We define a similar process for the initiator Abis.
process B(j:index) =The responder B is indexed by j
to represent an unbounded number of sessions.
In order to express anonymity using an equivalence property, we model two systems using the diff
operator. On the left side, the key kA
is used while the right side uses the key kAbis
.
The protocol is finally defined by a system where an unbounded number of sessions for A, Abis and B play in parallel, after having outputted the public keys of A, Abis and B.
include Basic. Goal eq_sym :This axiom states that the length of a pair is equal to the sum of the lengths of each component of the pair.
Helper lemma for pushing conditionals under the len(_)
function.
The anonymity property is expressed as an equivalence between the left side (the one using kA
and the right side (the one using kAbis
) of the system. This property is expressed by the logic formula forall t:timestamp, frame@t
where frame@t
is a bi-frame.
The high-level idea of the proof is as follows: we show that the message outputted by the role B does not give any element to the attacker to distinguish the left side from the right side, relying on the fact that encryption satisfies key privacy and IND-CCA1 assumptions.
enrich pk(kA), pk(kAbis), pk(kB). [> Line 155: (enrich pk(kA), pk(kAbis), pk(kB))We start by adding to the frame the two public keys pk(kA)
, pk(kAbis)
and pk(kB)
since any execution starts by the action O
outputting them. This allows to simplify some cases in the proof below.
Case where t = 0:
This case is trivial thanks to the addition of pk(kA)
, pk(kAbis)
and pk(kB)
in the frame.
Case where t = A(i):
The output of this action is the same on both sides. We show that this output can be removed from the frame so that we can conclude by induction hypothesis. We start by expanding all macros and splitting the pairs and function applications. We are then left with the two names n0(i)
and r0(i)
used for the encryption. These names are fresh (i.e. does not appear anywhere else in the frame) so we are able to remove them with the fresh
tactic.
Case where t = Abis(ibis):
Similar to the previous case.
Case where t = B(j):
We have to show that the output message does not give any information to the attacker to distinguish the left side from the right side.
We first use the key privacy assumption: knowing only a cipertext, it should not be possible to know which specific key was used. The corresponding enckp
tactic allows here to replace kAbis
by kA
on the right side.
We now use the ciphertext indistinguishability (IND-CCA1) assumption, which requires to show that the lengths of the plaintexts on both sides are equal.
rewrite if_len. [> Line 214: (rewrite ...)We use the lemma if_len
to push the conditional under len(_).
We use the if_same_branch
helper lemma to simplify the conditional using the fact that both branches are identical.
We conclude using the fact that n(j)
is fresh.