Protocol Signal
Protocol Signal
C OMPUTING S CIENCE
R ADBOUD U NIVERSITY
Second supervisor:
Prof. Dr. J.J.C. Daemen
j.daemen@cs.ru.nl
Second assessor:
Dr. S. Samardjiska
simonas@cs.ru.nl
The X3DH protocols is a key agreement protocol that is used in the Signal protocol
to establish a shared secret key between two parties. While there is a rigorous
security analysis for the Signal protocol, the X3DH protocol does not have the
same level of analysis. In this paper we will provide such an analysis and provide
explanations for most of the theory that is used. We will define the security this
protocol gives and give a proof of security of the X3DH protocol by using game
hops and introducing an adversary with power over the network and proving a
bound on the advantage of the adversary. The conclusion is that the X3DH protocol
provides secrecy of the shared secret and the message.
Contents
1 Introduction 3
1.1 Signal Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 Double Ratchet . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.2 Properties . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Contributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Related Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Preliminaries 7
2.1 Mathematical structures . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.2 Cyclic Groups . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.3 Multiplicative Groups . . . . . . . . . . . . . . . . . . . 8
2.1.4 Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.5 Elliptic Curves . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Key Derivation Functions . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Computational Problems . . . . . . . . . . . . . . . . . . . . . . 11
2.3.1 Discrete Logarithm . . . . . . . . . . . . . . . . . . . . . 11
2.4 Random Oracles . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Distinguishability . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5.1 Advantages . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5.2 Complexity . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5.3 Security Strength . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6.1 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6.2 Static and Ephemeral . . . . . . . . . . . . . . . . . . . . 16
2.6.3 Public Key Authentication . . . . . . . . . . . . . . . . . 16
2.6.4 Diffie-Hellman Problems . . . . . . . . . . . . . . . . . . 17
2.7 Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.7.1 Threat Models . . . . . . . . . . . . . . . . . . . . . . . 18
2.7.2 Security Models . . . . . . . . . . . . . . . . . . . . . . 18
2.8 Game Hopping . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.8.1 Large Failure Events . . . . . . . . . . . . . . . . . . . . 19
1
2.8.2 Small Failure Events . . . . . . . . . . . . . . . . . . . . 19
3 Research 20
3.1 The X3DH Protocol . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.1.1 Trusted Server . . . . . . . . . . . . . . . . . . . . . . . 20
3.1.2 Prekeys . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.3 Initiating the Protocol . . . . . . . . . . . . . . . . . . . 22
3.1.4 Deciphering . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2 Defining the X3DH Protocol . . . . . . . . . . . . . . . . . . . . 24
3.2.1 Threat Model . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2.2 Security Model . . . . . . . . . . . . . . . . . . . . . . . 25
3.2.3 Modelling X3DH . . . . . . . . . . . . . . . . . . . . . . 27
3.2.4 Session Identifier . . . . . . . . . . . . . . . . . . . . . . 28
3.2.5 Predicates . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3 Proof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.1 Scope of the Proof . . . . . . . . . . . . . . . . . . . . . 32
3.3.2 Proof of Security . . . . . . . . . . . . . . . . . . . . . . 33
4 Conclusions 41
4.1 Future Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2
Chapter 1
Introduction
Messaging services are very popular and are used globally. However, privacy is be-
coming a bigger topic for the consumers of these services. In return, the providers
of these services use cryptographic protocols to secure the messages and make it
very difficult for adversaries to read these messages. This was not always the case,
as the first messaging services were hardly encrypted at all.
One of the cryptographic protocols that is used nowadays is the Signal protocol.
The Signal protocol is a secure messaging protocol that is included in many known
messaging applications, such as Signal, Skype [27], WhatsApp [37] and Facebook
Messenger [18]. This protocol is used to provide end-to-end encryption of commu-
nication, meaning that it aims to prevent third parties to read the messages while it
is in transit from one party to another.
Initially, there was no proof of security, only a scheme when the protocol was
implemented. Later, Cohn-Gordon et al. [11] were the first to provide a formal
security analysis of the Signal protocol. While the protocol has been out for a
number of years, there has only been a small amount of research done about the
Signal protocol.
3
parties take turns in generating new secrets and sending them to the other party to
use in deriving the shared secret keys.
In the case that a party wants to send multiple messages at once, the method
used in the asymmetric stage cannot be used. For this case there is the symmetric
stage. In this stage, every message will have a new key derived from the same
secret.
The shared secret key which is used to start the double ratcheting algorithm is
commonly received from the X3DH protocol. The X3DH protocol is used to agree
on a shared secret key between two parties. Like other key agreement protocols,
such as Diffie-Hellman or RSA-KEM, it is done in such a way that other parties
that are listening in on the conversation will not be able to calculate this secret
key. The focus of this paper is the X3DH protocol and this protocol will be further
explained in Section 3.1.
1.1.2 Properties
Signal claims to have the following properties:
• Resilience (definition is taken from [4]): This means that the output of this
protocol is computationally indistinguishable from random. In the case of
a key exchange protocol, the output of this protocol is a shared secret key
between two parties.
• Plausible deniability [10]: This means that there is no proof that a party has
sent a message to another party, in other words two parties can deny that they
have had communication.
Signal claims that the double ratchet algorithm provides post-compromise security,
forward secrecy and resilience, and X3DH provides forward secrecy and plausible
deniability.
4
1.2 Motivation
In the security analysis of Cohn-Gordon et al. [11], they use the Triple Diffie-
Hellman protocol as key agreement protocol. It is also possible to use X3DH as
key agreement protocol. The difference between the two protocols is that X3DH
has an additional Diffie-Hellman value that is used to calculate the shared secret
key.
In Triple Diffie-Hellman, the responder does not provide an ephemeral key or
one-time prekeys. This makes replaying messages possible [29].
If the initiator sends an initial message without the use of a one-time prekey,
then an adversary can replay this message multiple times. The responder will then
think that the initiator send multiple messages, whereas the initiator only sent one.
While Cohn-Gordon et al. used the Triple Diffie-Hellman protocol as key agree-
ment, they also proved secrecy for the X3DH protocol. The goal of this paper will
be to focus on only on the X3DH protocol and prove the secrecy of this protocol.
1.3 Contributions
The aim of this thesis is to define the security that X3DH provides. It is unclear
what security X3DH actually provides, so defining this makes the protocol itself
better to understand.
Another goal is to provide a clear and accessible proof of secrecy of the X3DH
protocol, while also providing a clear definition of secrecy in this protocol. The
proof is based on the security analysis of Cohn-Gordon et al. [11]. This analysis
is very extensive, but does not fully explain the underlying theory. The goal of the
current project is to first provide all the necessary knowledge that is needed and
then provide the proof of secrecy for the X3DH protocol.
By making this proof more accessible, other cryptographers or researchers that
use the X3DH protocol or research it will know what X3DH is and can verify the
security it provides.
5
framework and applied it to a simplified version of the Signal protocol in order to
find weaknesses in this protocol.
Almuzaini et al. [2] provided another formal analysis of the Signal protocol
using a model checking tool called Scyther. Whereas Cohn-Gordon et al. assumed
that the secrets that are used are verified using another channel of communication,
in this research it is not assumed so. Without this assumption Almuzaini et al. did
find an attack on the Signal protocol that exposes a secret key.
Our paper focuses on one-to-one chats using the Signal protocol, however it
is possible to implement group chats, which Rösler et al. [34] focused on. They
analyzed the group chat implementations of Signal and other messaging services
which implement the Signal protocol.
Cremers et al. [13] have researched a clone attack on messaging services that
implement the Signal protocol. A clone attack is an attack that clones the identity
of a party after the full state of a party is compromised. The conclusion of this
research is that many messaging services cannot recover from a clone attack, and
as such will violate the post-compromise security claim.
The specifications of the X3DH protocol by Marlinspike et al. [29] from Signal
is used to define our model of X3DH and explain the X3DH protocol.
6
Chapter 2
Preliminaries
2.1.1 Groups
In this work, a group is a tuple (A, ./), where A is a set and ./ a binary operation,
with the following properties:
• Closed: ∀x, y ∈ A : a ./ b ∈ A,
• Neutral element: ∃e ∈ A, ∀a ∈ A : a ./ e = e ./ a = a,
• Commutative: ∀a, b ∈ A : a ./ b = b ./ a.
The commutative property is optional, however groups that satisfy this property are
called abelian. A group can be infinite depending on A. The number of elements
in A is called the order of the group. The order of an element a ∈ A, denoted as
ord(a), is the smallest positive integer n such that an = e, or [n]a = e in the case
of addition. Modular addition is a group with the operation + which is denoted as
(Z/nZ, +).
7
• Associative: Is trivial, since + is associative.
This group is called a cyclic group and g is called the generator of this group. For
example, in a group (Z/nZ, +), the generator g = 1. Cyclic groups are abelian,
and a cyclic group of order q is isomorphic with (Z/qZ, +). Isomorphic means that
the groups have the same structure and properties. Having an isomorphism means
that there is a mapping function from one group to the other which is a bijection.
A subset H ⊂ G of a group (G, +) is called a subgroup of G, if (H, +) is also
a group.
2.1.4 Fields
In this work, a field is a triple (F , +, ∗), where (F , +) is a group and (F \{0 })∗
is a group and distributivity holds. Distributivity means that for all a, b, c ∈ F it
holds that a ∗ (b + c) = a ∗ b + a ∗ c. The field (Z/pZ, +, ∗), where p is a prime,
is called a prime field and is denoted as GF (p). There is a unique prime field for
each prime number.
8
hard to break. Breaking a cryptographic protocol means that an adversary can cal-
culate or deduce the shared secret, without having access to the secret components
that make up this shared secret.
Let GF (q) be a finite field with q elements, where q = pm , p is prime and
p 6= 2, 3. An elliptic curve over GF (q) is the set of pairs (x, y) that satisfies the
following equation, called the Weierstrass equation:
y 2 = x3 + ax + b. (2.1)
Figure 2.1: Addition in elliptic curves: Figure 2.2: Doubling in elliptic curves:
P +Q=R 2P = R
9
The second operation is doubling, which is also better explained by a geometric
example, shown in Figure 2.2. We have a point P which we are going to double.
First we draw the tangent line of the elliptic curve at point P , which intersects at
point R0 . Next we take the reflection of R0 on the x-axis to get R, which is the
result of the doubling of P .
Now we can define an abelian group (E, +) of an elliptic curve defined over a
field, with a neutral element that is a called point at infinity, ∞. This point is the
sum of P and −P (which is the reflection of point P on the x-axis) and is a point
on every vertical line. We must show that the group properties hold:
• Closed: By construction adding two points results in
another point on the curve E .
• n = ord(G).
• h = #E GF (p) /n. This is called the cofactor of the elliptic curve E.
X3DH is implemented with either the Elliptic Curve Diffie-Hellman X25519
or X448 [1]. These curves use the Montgomery form representation of elliptic
curves.
By 2 = x3 + Ax2 + x. (2.2)
Both use a function “X25519” and “X448”, respectively, in order to do scalar
multiplications on the curve. They take as an input a coordinate of a point P and
a scalar n and outputs nP . In order for Alice to generate a public key in X25519,
first she generates a private key a and converts it into a byte string of 32 bytes.
Then her public key is A = aG, where G is the base point, which is the point with
the minimal, positive x value in the case of these functions.
10
Then her public key is A = X25519(a, 9) where 9 is the x-coordinate of the
base point. Bob does the same with a private key b and computes B. Now both can
compute the shared secret key K = X25519(a, B) = X25519(b, A).
11
words, find x ∈ (Z/qZ)∗ such that g x = y.
In the case of Elliptic Curves [36] it is as follows: consider an elliptic curve E
over a finite field GF (p) with p a prime and P = (x, y) a point of prime order n,
meaning that n is the smallest number such that nP = ∞, on the elliptic curve.
Let k be an integer. Let E be the cyclic group generated by P . Given a point
Q = kP ∈ E, it will be hard to compute k.
2.5 Distinguishability
With the help of random oracles we can conduct an experiment to help us prove
the security of protocols. Formally in these experiments, the adversary Eve is an
algorithm A. To measure the capability of the adversary, we use the following
experiment.
Secretly we will select either our cryptographic protocol CP with a secret key
or a random oracle RO. We choose so by generating a random bit b which will
either be 0 or 1. We select CP if b = 1 and select RO if b = 0 . It is up to the
adversary A to find what the value of the bit is.
The experiment is shown in Figure 2.3. Now A will be in one of two worlds:
the “real world” or the “ideal world”. In the real world, A interacts with CP and
A interacts with RO in the ideal world. A does not know in which world it is in,
but can query the entity it is interacting with, noted as “oracle”. When A queries
input X, CP will process the input paired with the secret key which is unknown to
the adversary and provide output Y of length n bits. RO will take input X and see
if it has already received X before. If that is the case, output Y will be the same
as when X was queried before. If X was not queried before, output Y will be a
random bit string of length n. Eventually A returns a bit b0 ∈ {0, 1}. b0 = 1 if A
thinks it is in the real world, and b0 = 0 if it thinks it is in the ideal world.
12
Secret Key
In the case of public key cryptography, we can use a random oracle to prove
the security of our protocol. If we give this random oracle a proper interface so
that it accepts the same values as our protocol and provides similar looking output,
we can query the random oracle for a session key. We can then use the experiment
defined above to get a session key from either the protocol or the oracle and ask an
adversary to tell us in which world he is in. Using this distinguishability experiment
we then prove the security of the “ideal” version where we use the oracle. Then we
will prove our “real” version secure, where we use our protocol, as otherwise we
will have a efficient solution to a computational hard problem.
2.5.1 Advantages
If the adversary would just guess, then he has a success probability of 1/2. So
in order to have a successful attack, he needs to guess b with a probability that is
significantly larger than 1/2.
One can define the advantage of the adversary with this equation:
However, in order to better work with the advantage, another formula is derived as
follows. In this derivation we use the logical “and” symbol ∧. This means that in
order for the statement a ∧ b to be true, both a and b must be true. We can derive
13
the following formula:
Pr(b0 = 1 ∧ b = 1) Pr(b0 = 0 ∧ b = 0)
= + −1
Pr(b = 1) Pr(b = 0) (2.4)
= Pr(b0 = 1|b = 1) + Pr(b0 = 0|b = 0) − 1
= Pr(b0 = 1|b = 1) − 1 − Pr b0 = 0|b = 0
2.5.2 Complexity
The advantage of A of distinguishing between CP and RO increases when A
makes queries to its oracle, called online queries. All these queries are stored in
a query history, noted QHd . To express the advantage we use the total number of
bits sent to and received from the oracle for all queries, |QHd |. This is called the
data complexity.
It is also possible for A to implement CP itself with an arbitrarily chosen secret
key. A does not have to be connected to its oracle for this, so these are called offline
evaluations. These evaluations are stored in another query history, noted QHc . The
advantage in this case depends on the length of the key, so |QHc |. This is called
the computational complexity.
Implementing and running the individual evaluations often involves more com-
putations related to the scheme that is used. However the time these take is often
neglected.
14
2.6 Diffie-Hellman
In order to understand the Extended Triple Diffie-Hellman protocol, or X3DH,
we need to understand the Diffie-Hellman protocol. Diffie-Hellman [19] is a key-
exchange protocol, created by Whitfield Diffie and Martin Hellman dating back to
1976 [17]. The protocol ensures that two parties can calculate a shared secret, from
their own personal secrets. A third party with no access to these personal secrets is
unable to calculate the shared secret. Traditionally the two parties are named Alice
and Bob and the malicious third party is named Eve.
Diffie-Hellman makes use of public key cryptography in order to create a
shared secret that only Alice and Bob know. In order for Alice to send a mes-
sage to Bob, she calculates the shared secret and uses this as an input for a Key
Derivation Function (KDF). This is a function that creates a secret key based on
the shared secret that can be used for secure communication. KDF is explained in
Section 2.2. Bob can also compute the shared secret and uses the KDF to calculate
the same secret key.
The protocol makes use of either a multiplicative group G of order q and a
generator g or an elliptic curve group of order q and base point g. The protocol
goes as follows:
The domain parameters of the Diffie-Hellman protocol are (q, g). These parame-
ters define the group that is used in the protocol. The public keys are (A, B ) and
the private keys are (a, b).
We will use the notation DH (A, B ) for the the shared secret of both parties
with the public keys A and B. It is important for each party to know the corre-
sponding private key for one of the public keys.
2.6.1 Security
The Diffie-Hellman protocol is based on the computationally hard Diffie-Hellman
assumption. This means that an attacker needs to solve this computationally hard
problem if it wants to break the protocol. However this is dependent on the choice
of the group and the generator. If the group is too small, solving the computational
problem is not difficult.
In order for Eve to find out what the shared secret is, she has to either compro-
mise one of the private keys, or find a way to calculate the shared secret with only
15
the public keys. For example, in order for Eve to compromise the shared secret key
g ab , she has to either calculate a from g a with a discrete logarithm, or Eve can have
another method to calculate g ab from g a and g b .
This means that breaking the Diffie-Hellman protocol by trying to compute the
shared secret key is not efficient and as such Diffie-Hellman is secure against these
kinds of attacks.
Signatures
A signature scheme [20] is a way to cryptographically sign a message in such a
way that the receiver can authenticate that the message came from the sender and
that the message is not changed. The use of signatures provide authentication of
the party that is sending the message. It also provides integrity of the message,
meaning that it is visible if the message is altered during transmission. It also
provides non-repudiation of origin, meaning that the sender cannot deny having
sent the message.
16
The problem with using signatures for authentication is that the public key that
is used has to be authenticated itself before it can be used.
Signature schemes make use of the public and private keys of public key cryp-
tography. If Alice sends a message to Bob, but wants to sign it, she signs the
message with Alice her private key and sends both the signature and the original
message to Bob. Bob can verify the signature using Alice her public key. Only
Alice has access to her private key, so Bob can be almost sure that the message
came from her.
Certificates
Another way of authenticating is by introducing a trusted third party (TTP), for
example a company, also called a Certificate Authority (CA), and certificates. A
certificate is a signature that binds an identity to a public key. For example, Alice
and Bob have generated key pairs (a, A) and (b, B). If Alice is sure that Bob his
public key is B, she can sign a message containing the public key of Bob and Bob
his identity. For example, the message could be “Bob’s public key is B”. Bob can
then use the signature from Alice to show other parties that he is communicating
with that B is indeed his public key. However, for this to work Alice needs to be
trusted by the other parties that Bob is communicating with.
A CA can be such a party that is trusted by every other party. Any party that
wants to use a CA to obtain and verify certificates must obtain the public key of
the CA. This has to be done in a secure way, else it is not possible to authenticate
the public keys of other parties using this CA. This can be done by physical means
and is better to scale compared to the previous method, since every party only has
to visit the CA once and they do not have to physically meet the other parties.
With the help of a CA, two parties Alice and Bob can authenticate the public
keys of each other with the help of the certificates. Since Alice trusts the CA, she
trusts the certificate that says that the public key of Bob is B.
The way the Signal protocol handles certificates is dependent on the implemen-
tation. However, the common way for mobile applications, and as such messaging
services implementing the Signal protocol, is to implement a CA inside the appli-
cation.
17
adversary uses the discrete logarithm to calculate a from g a . Then the adversary
can compute (g b )a = g ab . However, there is no proof as of yet that this is the
only way to solve CDH. In some special cases it can be shown that the discrete
logarithm assumption is the same as the CDH assumption [15].
Second there is the Decisional Diffie-Hellman Problem (DDH) [8]: given a
quadruple of elements (g, g a , g b , g c ) where a and b are randomly chosen, decide
whether c ≡ ab mod p. In other words, if we have (g a , g b , x ) it is difficult to
decide if x = g ab or x is a random element in the group generated by g. It is the
case that if CDH is easy to solve, then so is DDH, however the opposite is not true.
There are some groups where solving DDH is easy, but CDH is not. These groups
are called Gap Diffie-Hellman groups.
There is also a computational problem related to these Gap Diffie-Hellman
groups, namely the Gap Diffie-Hellman Problem (GDH) [31]: given a triple of
elements (g, g a , g b ) where a and b are randomly chosen, find K = g ab with help
of a DDH Oracle. Having access to a DDH Oracle means that we can query the
oracle with a quadruple of elements (g, g a , g b , g c ). The oracle will return 1 if
g c = g ab and 0 otherwise. This can be used to verify potential solutions to the
GDH problem and query them to the DDH oracle to see if they are correct. The
proof of security of X3DH makes use of the GDH hardness assumption.
2.7 Models
2.7.1 Threat Models
A threat model is a model which contains the capabilities of the adversary. We
define the capabilities and we will prove in the end that an adversary with these
capabilities cannot break the protocol which you are trying to prove to be secure.
For example, an adversary can be a passive attacker, meaning that the adversary
can only eavesdrop. An adversary can also be an active attacker, meaning that
the adversary can delete, modify, replay messages and has full control over the
network.
18
better. The advantage that the adversary has in each game is bounded in some
way by the preceding game. The first game will be the original experiment. The
following games will lead to a game for which we can prove a bound. Because
each game is bounded in some way by their preceding games, we can then prove a
bound for the original experiment.
However, this means that by rewriting the formula we must have Pr(¬E) 6= 0. It
is the case that if Pr(¬E) = 0, then we see that Pr(S2 ) = 0 in equation 2.6.
For example, in Game 1 the attacker must calculate the shared secret key with
a public key. In Game 2 the challenger guesses a public key i ∈ {1 . . . q} and the
attacker can only win if that public key is used. Then we can define the event E as
the event that that certain public key is not used. As the probability that ¬E occurs
is 1q , we obtain that:
Pr(S1 ) = Pr(S2 ) · q. (2.8)
19
Chapter 3
Research
20
Step 1)
IKP, SPKP, Certificate, multiple OPKP
Party Server
Step 2) B
Alice Server
Step 3)
Alice Bob
IKA, EKA, Identifier for OPKB, Ciphertext
Figure 3.1: A visual representation of the X3DH protocol. The steps shown in the
figure do not have to be done at once. In step 1 the parties publish their information
to the server. In step 2 Alice requests Bob his information. In this step Bob can be
offline. In step 3 Alice sends Bob the secrets needed to compute the shared secret.
In this step Bob can also be offline and will receive this message from Alice when
he comes online.
at first, then the server can be trusted. This principle is not the best principle to use,
but it is the easiest one to use.
In this paper we do not assume that the server is trusted. However we do
assume that Alice and Bob have authenticated the public keys of each other, so that
an impersonification of either party by the server would be noticed.
3.1.2 Prekeys
We assume that Alice is the party that initiates the X3DH protocol and wants to
send a message to Bob. In order for Bob to be able to receive a message, he
needs to generate and store some keys on the server. The generation of these keys
is implementation specific, but as specified in the documentation of Signal [29],
they must either all be in X25519 form or in X448 form. These forms have been
discussed in Section 2.1.5. Bob has a private key for every key that is uploaded to
the server. First, Bob needs to generate and store his public identity key IKB to
the server. The private key corresponding to the identity key is ikB and Bob should
keep this key a secret. The identity key is a long-term key that Bob generates when
he connects to the server for the first time. This key is tied to his identity so this
key will not be replaced over time.
21
The second key that needs to be generated and stored is a medium-term public
key SPKB , called a signed prekey. This is called a signed prekey, because Bob also
needs to store a public key certificate of SPKB using IKB . This signed prekey and
the certificate have to be replaced regularly, by generating a new signed prekey.
The server will be updated to use the new signed prekey. After replacing the key,
Bob keeps the old private key of SPKB for a short time, in order to be able to
decrypt delayed messages. It is important that he deletes the old keys after that
short period of time, in order to provide forward secrecy as these keys are needed
to recalculate the shared secret that is used to decrypt past messages. The amount
of time that the old keys are stored are dependent on the implementation. Since
one-time prekeys are used, replaying older signed prekeys are not harmful, since
they have to be accompanied with a one-time prekey. If Bob notices a one-time
prekeys has been reused, Bob does not accept the message.
These one-time prekeys OPKB are the last keys that have to be uploaded by
Bob. These keys are used a single time, after which the server deletes the key.
When the server notices that the amount of one-time prekeys is getting low, or
whenever Bob wants, he can upload more of these keys to the server. These keys
and SPKB are called ”prekeys” because the keys are uploaded prior to the begin-
ning of the protocol. So in short, the values Bob needs to store are:
• IKB ,
• SPKB ,
The first two keys and the certificate combined with a single OPKB is called a
prekey bundle.
22
• K1 = DH (IKA , SPKB ),
• K2 = DH (EKA , IKB ),
• K3 = DH (EKA , SPKB ),
• K4 = DH (EKA , OPKB ).
Diffie-Hellman K1 K2 K3 K4
Shared Secrets
Figure 3.2: The first and last row are public keys that are from Bob and Alice
respectively. The lines from the Diffie-Hellman keys indicate what keys are used
in the calculation.
Using a KDF Alice and Bob can subsequently calculate the shared secret key:
KAB = KDF (K1 ||K2 ||K3 ||K4 , `, salt, context), where || means concatenation
of the keys. Without loss of generality we assume that injective padding is used on
the input. The `, salt and context variables are all dependent on how this protocol
is implemented. After Alice has calculated KAB she deletes her ephemeral key,
ekA , and all the Ki .
Now that Alice has the shared secret key KAB , she can send a message to Bob
so that Bob can calculate KAB as well. Alice will send the following to Bob:
• IKA ,
• EKA ,
23
• an identifier of which one-time prekey is used,
After the initial message, KAB is used in the ratcheting algorithm to derive the
future keys. Alice can append optional information, such as Bob his username or
certificates. This is however dependent on the implementation.
3.1.4 Deciphering
In order for Bob to decipher the message, he needs to calculate KAB . After receiv-
ing the initial message, Bob knows IKA , EKA and which one-time prekey Alice
used. He also has access to the following private keys: spkB , ikB and opkB . Now
Bob can do the same Diffie-Hellman calculations that Alice did, because the public
keys that are used are either already known by Bob or sent by Alice. It is impor-
tant that Bob also deletes the intermediary Ki values and opkB after calculating
KAB . Now Bob can decrypt the initial ciphertext sent by Alice and checks if it is
correct. It is important that if it is incorrect, for example if the message decrypts
to a random string, Bob stops all communication and deletes all associated values.
If it is correct, both parties can use shared secret key KAB for the rest of their
communication.
24
We assume that the KDF function is working as it should and that there is
no other way to calculate the shared secret key than by using the Diffie-Hellman
values.
We do assume that Alice and Bob have both verified the public keys of each
other.
The property we want to prove is secrecy of the shared secret key. Authenti-
cation will be proven alongside secrecy by showing that only the intended parties
could compute the key KAB . Secrecy of the shared secret key will be proven by
showing that the shared key will stay a secret even if some secret values from either
Alice or Bob would be compromised.
In our setting, the protocol consists of two key generation algorithms and two
algorithms to run the protocol:
• PreKeyGen(ik ), which takes ik as input and outputs the signed prekey pair
(SPK , spk ),
• Initiateephemeral (ik , spk , role, targetid ), where ik and spk are the private
keys of the identity key and the signed prekey, role indicates whether this
party is initiating a conversation or is responding to it. In the case of the
25
initiating party, there is also an identification of who the targeted responder
is. The ephemeral is the ephemeral private key that is used. With the input
and this ephemeral the algorithm creates the output, which is a state and
possibly a message. The goal of the Initiate algorithm is to define the first
stage of exchanging the prekey bundles.
• Runephemeral (ik , spk , state, message), where ik and spk are the private keys
of the identity key and the signed prekey, state is the state of the proto-
col, and message is an incoming message. This algorithm also uses the
ephemeral private key to create the output. The output is an updated state
and possibly a message. The goal of this algorithm is to create a session
between the two parties and making it possible for both parties to calculate
the shared secret key.
The algorithms are based on the ones used in Cohn-Gordon et al. but the Initiate
and Run algorithm have an extra input ephemeral to show that in this algorithm
an ephemeral key is used.
The state of the protocol that is used in the algorithms is a collection of vari-
ables. In order to access a single variable, an object-oriented approach is taken.
For example, the notation to access variable v in the state π is π.v .
• π.ephemeral ∈ {0, 1}λ , a random string for this stage, based on the security
parameter. Used as the ephemeral key.
• π.sessionid, the session identifier. This contains all the public keys to which
the participant has access.
• π.status, the status of the state. It can be either empty, active, accepted or
rejected . accepted or rejected means that it has fully completed the compu-
tations and accepted or rejected the outcome.
We denote πxi as the state of session i of user x. In comparison to the state variables
in Cohn-Gordon et al. we have removed some variables which are not necessary
for our proof.
26
Combining the four algorithms gives an implementation of the X3DH protocol.
The key generation algorithms create the keys that are needed for the protocol. The
Initiate algorithm initiates the protocol. If the party that runs the Initiate algorithm
has the role of responder, it outputs a prekey bundle. If the party that runs the
Initiate algorithm has the role of initiator, it outputs nothing but receives the prekey
bundle. The Run algorithm handles the rest of the algorithm. If the party that
runs the Run algorithm has the role of initiator, it sends a message containing the
ephemeral key EK to the responder. If the party that runs the Initiate algorithm
has the role of responder, it outputs nothing but receives the message.
27
• x ← y is used to assign a value y to a variable x.
$
• x←
− Y is used to randomly assign a value of Y to a variable x.
These algorithms use additional variables of the state that are defined below:
• π.ephemeral ∈ {0, 1}λ , which is the ephemeral private key that is used.
• π.reveal ephemeral, a predicate that says if the reveal query for the ephemeral
key is called.
• π.reveal sessionkey, a predicate that says if the reveal query for the session
key is called.
28
Algorithm 1 ExpΠ,p,s,e (A)
$
1: b← − {0, 1}
2: tested ← ⊥
3: for x = 1, . . . , p do . Initialize the keys for each user
$
4: (IKx , ikx ) ←
− IdentityKeyGen()
5: for y = 1, . . . , e do . Initialize signed prekeys for all sessions
$
6: (SPKyx , spkyx ) ←
− PreKeyGen(ikx )
7: public ← (IK1 , . . . , IKp , SPK11 , . . . , SPKep )
$
8: b0 ←− ASend,Reveal∗,Test (public) . Test can only be called once
9: if (tested 6= ⊥) ∧ fresh(tested) ∧ b = b0 then . Adversary was successful
10: return 1
11: else . Adversary was not successful
12: return 0
Algorithm 2 Send(x, i, m)
1: if πxi = ⊥ then . There is no session i yet
2: (peerid, y, role) ← m
$
3: πxi .ephemeral ← − {0, 1}λ
4: (πxi , m0 ) ← Initiateπxi .ephemeral (ikx , spkyx , role, peerid )
5: return m0
6: else . There is a session i
7: (πxi , m0 ) ← Runπxi .ephemeral (ikx , spkyx , πxi , m)
8: return m0
29
Algorithm 7 Test(x, i)
1: if tested 6= ⊥ or πxi .status 6= accept then . Test can only be called once
2: return ⊥
3: tested ← (x, i)
4: if b = 0 then . Return the real key
5: return πxi .key
6: else . Return a random string that looks like a key
7: return random string
3.2.5 Predicates
With the current experiment it is possible for the adversary to break the protocol,
by just revealing all secrets. We will define some predicates in order to limit this.
If during the experiment, some of the predicates are not true, the adversary fails.
If we now define these predicates in a correct way, we will have an adversary who
cannot break the protocol by just revealing all secrets. For each predicate we will
first provide an informal definition followed by a formal logical definition.
All predicates given in this section are from the paper of Cohn-Gordon et al.
and only have slight modifications to them to only be used in the X3DH protocol.
First we will define the valid(x, i) predicate, where x is the user and i is the
index of a session of that user. A state is valid if it has fully completed the compu-
tations and it has accepted them and the session key is not queried by the adversary
for this session or another session with the same session identifier. This gives us
the following definition:
Now we will define the clean(x, i) predicate. This predicate makes sure that
the adversary does not reveal too many secret keys, so that it can calculate the ses-
sion key. In order to calculate the session key in X3DH, one must calculate four
Diffie-Hellman secret keys. Each of these Diffie-Hellman keys is calculated by a
combination of personal keys of each party. For two parties Alice and Bob these
combinations are shown in Figure 3.2. For each of these combinations, we will de-
fine a cleanXY (x, i) predicate which states that the keys X and Y are not revealed
by the adversary, where X is either the identity key, signed prekey or ephemeral
key of Alice, and Y the same for Bob. We will denote by L the long-term iden-
tity key, M for the medium-term signed prekey and E for the ephemeral key. The
clean(x, i) predicate will be a disjunction of the four cleanXY (x, i) predicates, be-
cause at least one must be true in order for the adversary to not be able to calculate
30
the session key. This gives us the following definition:
clean(x, i) = cleanLM (x, i) ∨ cleanEL (x, i) ∨ cleanEM (x, i) ∨ cleanEE (x, i).
(3.3)
In all the subpredicates we need to make case distinctions on whether x is the
initiator of the protocol or the responder. This is to define which key must not be
revealed by the adversary. Thus, for the cleanLM (x, i) predicate we see that in the
case that x is the initiator, the identity key of x must not be revealed and the signed
prekey of the other party must not be revealed. In the case that x is the responder,
the identity key of the other party must not be revealed and the signed prekey of x
must not be revealed.
¬reveal ik ∧ ¬reveal spkπxi .otherprekeyid πxi .role = initiator
x πxi .otherid
cleanLM (x, i) =
π i .prekeyid
¬reveal ikπxi .otherid ∧ ¬reveal spkxx πxi .role = responder.
(3.4)
Ephemeral Keys
With ephemeral keys we must first address a minor issue. We must be sure that
the other party has generated an ephemeral key. In case of the initiator we must
make sure the ephemeral key is generated by the responder. We do so by checking
whether there exists a session for the responder, which we do by checking if the
ephemeral key is included in the session identifier. We cannot compare the session
identifiers, because the responder may not have responded yet, and as such has
not generated a session identifier. If a session with the responder does not exist,
then the ephemeral key would not be generated, or it could be generated by the
adversary. We must also make sure that this ephemeral key is not revealed by the
adversary in another session with the same session identifier.
In the case of the responder we already know that the initiator has generated
an ephemeral key. However, we must make sure that both parties have the same
session identifier and that the ephemeral key of the initiator is not revealed by the
adversary in another session with the same session identifier.
We will note a ⊂ b as: “a is a substring of b”. We will define a new sub-
predicate cleanEph (x, i) that will address this issue. For better readability we will
define these predicates for the initiator first, and then for the responder.
Initiator
cleaninit i
Eph (x, i) = ∃j : OP Kj ⊂ πx .sessionid
31
Now we can define the rest of the cleaninit
XY (x, i) predicates for the initiator:
cleaninit i
EL (x, i) = ¬πx .reveal ephemeral ∧ ¬reveal ikπxi .otherid , (3.6)
π i .otherprekeyid
cleaninit i
EM (x, i) = ¬πx .reveal ephemeral ∧ ¬reveal spkπxi .otherid , (3.7)
x
cleaninit i init
EE (x, i) = ¬πx .reveal ephemeral ∧ cleanEph (x, i). (3.8)
Responder
In the case that πxi .role = responder, cleanresp
Eph (x, i) is defined as follows:
cleanresp i j
Eph (x, i) = ∃j : πx .sessionid = ππxi .otherid .sessionid
∧ ∀j : πxi .sessionid = ππj i .otherid .sessionid (3.9)
x
j
⇒ ¬ππi .otherid .reveal ephemeral .
x
cleanresp resp
EL (x, i) = cleanEph (x, i) ∧ ¬reveal ikx , (3.10)
i
cleanresp resp πx .prekeyid
EM (x, i) = cleanEph (x, i) ∧ ¬reveal spkx , (3.11)
cleanresp resp i
EE (x, i) = cleanEph (x, i) ∧ ¬πx .reveal ephemeral. (3.12)
Now we can define the fresh(x, i) predicate. This predicate states that a session is
valid and that not too many keys have been revealed by the adversary. So this will
be the the combination of the valid(x, i) and clean(x, i) predicates:
Break Event
We denote the event breaki as the event that the adversary A wins Game i. We
denote Advi as the advantage of A against Game i and is defined as follows:
3.3 Proof
3.3.1 Scope of the Proof
There are some aspects of the X3DH protocol that we did not model and will
not prove. One of these aspects is the different implementations of the X3DH
protocol used by messaging services. We focus on the protocol as documented by
the developers of X3DH. We also do not make any assumptions on the underlying
primitives that are used, for example what elliptic curve is used.
32
We do not prove all the security goals that Signal claims X3DH has, such as
plausible deniability, instead, we focus on one-to-one messaging. This means we
do not look at group messaging or other functionalities that can be offered.
As explained in Section 3.2.1 we do not assume side-channel attacks.
There are also some technicalities we have to discuss.
For the Test algorithm we will consider the party that is used in the Test al-
gorithm to be the initiator of the session. We will leave the proof in case of the
responder as analogous.
We assume that the Key Derivation Function that is used is a random oracle, so
we do not have to make any assumptions on the KDF.
33
Case 1 Game 5 Game 6 Game 7 Game 8
Figure 3.3: An overview of the proof. Most cases are similar to each other, so in
the proof we handle one case and explain the differences in the other cases.
34
Game 2: Guess test session
In this game, the challenger must guess which session will be tested by the adver-
sary with Test(x, i). This means that C must guess both x and i correctly. For x
there are a total of p possibilities, and for i there are s possibilities. That means that
1
the probability that the challenger guesses both of them correctly is xp . This will
∗ ∗
be a game hop with a large failure event. Let C guess (x , i ) ∈ [1 . . . p] × [1 . . . s].
We will define an event E where A will query Test(x, i), where (x, i) 6= (x∗ , i∗ ).
1
We will abort the game when E occurs. The probability that ¬E occurs is p·s .
From this we get the following:
35
clean (x,i)
We will define all the game hops for the case Adv3 LM and πxi .role =
i
initiator. As was mentioned before, the case of πx .role = responder is analo-
gous, and only one of the two appears. The cases for the other clean(x, i) pred-
icates will be given later, but since they are very similar, we will only give the
differences.
36
abort this game when A queries K1 to the KDF oracle it has access to, because
that is the case that the protocol is broken. We will define this event as E . We will
show that if E happens, the adversary will win the game, which we have defined
as Adv(break6 ). So we can split the advantage as follows:
We will now show that in the case of E , we can create an algorithm A∗ that can
win the GDH problem. As was explained in Section 2.6.4, in the GDH problem
A∗ is given a triple (g, g a , g b ) , and its goal is to find K = g ab with access to a
DDH oracle.
Now A∗ will replace IKx with g a and SPKny with g b , with both a and b un-
known to A∗ . A∗ will then simulate Game 5. Since IKx and SPKny are replaced, it
is not possible to calculate some session keys between certain parties. Since the ad-
versary A can set up sessions between parties, A∗ must simulate these calculations
by giving random keys. These sessions are:
1. A session which is not the Test session that is between parties x and y, where
x is the initiator. Since g a and g b are both used to calculate the session key,
this would require knowledge about a or b.
2. A session which is not the Test session that is between party x and any other
party, including y, where x is the responder. Since g a is used and some other
ephemeral public key on which we have no information, this would require
knowledge about a.
3. A session which can be the Test session that is between any party that is not
x and party y, where y is the responder. Since g b is used and some other
ephemeral public key on which we have no information, this would require
knowledge about b.
A∗ will keep a list which contains, for each session for which a random key is used,
the random key and which public keys should have been used for the calculations.
By keeping this list, A∗ must be consistent in answering queries from A by giving
the right random keys for the right sessions. Before simulating a session and pick-
ing a random key, it is also important that A∗ will use the DDH oracle to check if
a previous random oracle query matches the session, in order to give the right key.
Otherwise, the simulation will not be consistent.
It is also important that A∗ will not answer the reveal queries which will violate
the clean predicate, as this predicate must stay true or the adversary loses.
If A queries the KDF oracle with a query of the form g z1 ||g z2 ||g z3 ||g z4 , then
A∗ must first go through its list and use the DDH oracle to check if the public keys
match the corresponding g zi , for i ∈ {1 . . . 4}. These g zi each match the Ki that
is used to calculate the shared secret key. We refer to Figure 3.2 to see which keys
are needed to calculate which Ki . For each session type that uses random keys we
can then construct DDH oracle queries to give us the information we need.
37
For sessions of type 1, A∗ has no knowledge about a, b and some other ephemeral
private key e, so in that case A∗ will query the DDH oracle (g, g a , g b , g z1 ) to see
if the first key is correct, and (g, g e , g b , g z3 ) to see if the third key is correct. A∗
knows enough to check the other keys itself.
For sessions of type 2, A∗ has no knowledge about a and e, which is some other
ephemeral private key. In that case we will query the DDH oracle (g, g a , g e , g z2 ),
in order to see if the second key is correct. A∗ knows enough to check the other
keys itself.
For sessions of type 3, A∗ has no knowledge about b and e, which is some other
ephemeral private key. In that case we will query the DDH oracle (g, g b , g e , g z3 ),
in order to see if the third key is correct. A∗ knows enough to check the other keys
itself.
For each case, if the DDH oracle returns 1, meaning that the key is correct, then
∗
A can use the random keys that it generated from the list it keeps. If the oracle
does not return 1, then A∗ must generate a new random value and query that value
to the oracle.
It is important to note that if A∗ queries (g, g a , g b , g z1 ) to the DDH oracle, and
it returns 1, then A has found the solution to the GDH problem, and A∗ will just
return g z1 as the answer to the GDH challenger. In other words, if A breaks Game
6, then A∗ breaks the GDH problem.
So from this we have that if E occurs, then we have a solution to the GDH
problem. This gives us the following:
Adv(break 6 ) ≤ GDH (A∗ ). (3.22)
Where GDH (A∗ ) is the probability of guessing the right answer for the GDH
problem.
38
Case 2: cleanEL (x, i)
In this case we make sure that the cleanEL (x, i) predicate stays true. This means
that A cannot have issued the queries RevealEphemeral(x, i) and RevealIdentityKey(y)
in the case that πxi .role = initiator and πxi .otherik = y is the other party of the
session. In the case that πxi .role = responder the queries RevealEphemeral(y, i)
and RevealIdentityKey(x) cannot have been issued.
The differences from the previous games is that we no longer have to guess
the index in Game 4. In Game 5 we allow EKx and IKy to be duplicate, and in
Game 6 we replace these keys with the GDH values g a and g b . From this we get
the following:
clean (x,i) 1
Adv3 EL ≤ + GDH (A∗ ). (3.25)
q
39
Combining the four cases
We see that all cases are bounded by the GDH problem. Now we can combine all
the cases to get the following bound on Game 3:
1 ∗ 1 ∗ 1 ∗
Adv3 ≤ e + GDH (A ) + + GDH (A ) + e + GDH (A )
q q q
(3.28)
1 ∗
+s + GDH (A ) .
q
From this equation we can derive a bound for Game 0, the original experiment:
1 1
p+e·p
e + GDH (A ) + + GDH (A∗ )
∗
q q
Adv0 ≤ 2
+ p2 · s3 ·
q 1 ∗ 1 ∗
+e + GDH (A ) + s + GDH (A )
q q
p+e·p
2 2 3 2e + s + 1 ∗
≤ +p ·s · + (2 · e + s + 1)GDH (A ) .
q q
(3.29)
40
Chapter 4
Conclusions
In this thesis, we have considered X3DH in the Signal protocol, and derived a proof
of security. From the proof it follows that X3DH provides secrecy and authentica-
tion.
We proved this by showing that a powerful adversary with control over the
network cannot calculate the shared secret key to expose the messages that are
being sent. This even holds if the adversary has access to some of the secret values
that are used to calculate the shared secret key. We proved it by showing that the
advantage that an adversary has in breaking the X3DH protocol is bounded by the
Gap Diffie-Hellman hardness assumption.
One could argue that the signatures of prekeys are not necessary, however be-
cause of these signatures, it is not possible for a malicious server to provide forged
prekeys to a party and then reveal the communication between two parties. This
signature shows that these keys were published by one of the parties and not by the
server itself [29].
While doing the literature research on this topic, it appeared that existing re-
search on the X3DH protocol was slim. It has been discussed in various papers as
part of the Signal protocol, but it is not looked at on its own.
41
some that are still not proven as of yet, for example plausible deniability. While
this may not be as impactful as secrecy, it is still a security goal and as such would
require a proof.
Each implementation of the Signal protocol differs, and as such, different im-
plementations of the X3DH protocol are used. We only proved the security of
X3DH protocol as documented by the developers. Therefore, the proof that is
given might not hold for other implementations of the X3DH protocol.
We assumed in our proof that the public keys were verified before they were
used in the protocol. In the real world, this is not always the case, and with no
verification of the keys on a different channel of communication, it is possible for
an adversary to impersonate other parties. It is difficult to make sure that public
keys are verified, and so far there is no real way to provide this verification by not
using another channel of communication.
42
Bibliography
[1] M. Hamburg A. Langley and S.Turner. Elliptic Curves for Security. Inter-
net Engineering Task Force; RFC 7748 (Informational); IETF, January 2016.
urlhttps://www.ietf.org/rfc/rfc7748.txt.
[2] N. Z. Almuzaini and I. Ahmad. Formal Analysis of the Signal Protocol Us-
ing the Scyther Tool. In 2019 2nd International Conference on Computer
Applications Information Security (ICCAIS), pages 1–6, 2019.
[3] Feng Bao, Robert H Deng, and Huafei Zhu. Variations of Diffie-Hellman
problem. In International conference on information and communications
security, pages 301–312. Springer, 2003.
[4] Boaz Barak and Shai Halevi. A model and architecture for pseudo-random
generation with applications to /dev/random. Cryptology ePrint Archive, Re-
port 2005/029, 2005. https://eprint.iacr.org/2005/029.
[5] Mihir Bellare and Phillip Rogaway. Entity Authentication and Key Distribu-
tion. In Proceedings of the 13th Annual International Cryptology Conference
on Advances in Cryptology, CRYPTO ’93, page 232–249, Berlin, Heidelberg,
1993. Springer-Verlag.
[6] Mihir Bellare and Phillip Rogaway. Random oracles are practical: A
paradigm for designing efficient protocols. In Proceedings of the 1st ACM
conference on Computer and communications security, pages 62–73, 1993.
[9] Ran Canetti, Shai Halevi, and Jonathan Katz. A forward-secure public-key
encryption scheme. In International Conference on the Theory and Applica-
tions of Cryptographic Techniques, pages 255–271. Springer, 2003.
43
[10] Rein Canetti, Cynthia Dwork, Moni Naor, and Rafail Ostrovsky. Deniable
encryption. In Annual International Cryptology Conference, pages 90–104.
Springer, 1997.
[11] K. Cohn-Gordon, C. Cremers, B. Dowling, L. Garratt, and D. Stebila. A
Formal Security Analysis of the Signal Messaging Protocol. In 2017 IEEE
European Symposium on Security and Privacy (EuroS P), pages 451–466,
2017.
[12] Katriel Cohn-Gordon, Cas Cremers, and Luke Garratt. Post-Compromise
Security. Cryptology ePrint Archive, Report 2016/221, 2016. https://
eprint.iacr.org/2016/221.
[13] Cas Cremers, Jaiden Fairoze, Benjamin Kiesl, and Aurora Naska. Clone De-
tection in Secure Messaging: Improving Post-Compromise Security in Prac-
tice. In Proceedings of the 2020 ACM SIGSAC Conference on Computer and
Communications Security, CCS ’20, page 1481–1495, New York, NY, USA,
2020. Association for Computing Machinery.
[14] K. Igoe D. McGrew and M. Salter. Fundamental Elliptic Curve Cryptography
Algorithms. Internet Engineering Task Force; RFC 6090 (Informational);
IETF, February 2011. urlhttps://www.ietf.org/rfc/rfc6090.txt.
[15] Bert Den Boer. Diffie-Hellman is as strong as discrete log for certain primes.
In Conference on the Theory and Application of Cryptography, pages 530–
539. Springer, 1988.
[16] Alexander W. Dent. A Note On Game-Hopping Proofs. Cryptology ePrint
Archive, Report 2006/260, 2006. https://eprint.iacr.org/2006/
260.
[17] Whitfield Diffie and Martin Hellman. New directions in cryptography. IEEE
transactions on Information Theory, 22(6):644–654, 1976.
[18] Facebook. Messenger Secret Conversations Technical Whitepaper, July
2016. https://fbnewsroomus.files.wordpress.com/2016/
07/secret_conversations_whitepaper-1.pdf.
[19] A. Behrouz. Forouzan. Data communications & networking Fourth Edition,
pages 952–956. McGraw-Hill Education, fourth edition, 2006.
[20] A. Behrouz. Forouzan. Data communications & networking Fourth Edition,
pages 971–976. McGraw-Hill Education, fourth edition, 2006.
[21] Stefan Friedl. An elementary proof of the group law for elliptic curves.
Groups Complexity Cryptology, 9(2):117–123, 2017.
[22] Darrel Hankerson, Alfred J Menezes, and Scott Vanstone. Guide to elliptic
curve cryptography. Springer Science & Business Media, 2006.
44
[23] N. Kobeissi, K. Bhargavan, and B. Blanchet. Automated Verification for
Secure Messaging Protocols and Their Implementations: A Symbolic and
Computational Approach. In 2017 IEEE European Symposium on Security
and Privacy (EuroS P), pages 435–450, 2017.
[26] Hugo Krawczyk. Cryptographic Extraction and Key Derivation: The HKDF
Scheme. Cryptology ePrint Archive, Report 2010/264, 2010. https://
eprint.iacr.org/2010/264.
[27] Joshua Lund. Signal partners with Microsoft to bring end-to-end encryption
to Skype. https://signal.org/blog/skype-partnership/.
[28] Moxie Marlinspike and Trevor Perrin (editor). The Double Ratchet
Algorithm, November 2016. https://signal.org/docs/
specifications/doubleratchet/.
[29] Moxie Marlinspike and Trevor Perrin (editor). The X3DH Key Agree-
ment Protocol, November 2016. https://signal.org/docs/
specifications/x3dh/.
[31] Tatsuaki Okamoto and David Pointcheval. The gap-problems: A new class
of problems for the security of cryptographic schemes. In Kwangjo Kim,
editor, Public Key Cryptography, pages 104–118, Berlin, Heidelberg, 2001.
Springer Berlin Heidelberg.
[33] E. Rescorla. The Transport Layer Security (TLS) Protocol Version 1.3.
Internet Engineering Task Force; RFC 8446; IETF, August 2018. url-
https://www.ietf.org/rfc/rfc8446.txt.
45
[35] Victor Shoup. Sequences of games: a tool for taming complexity in security
proofs. Cryptology ePrint Archive, Report 2004/332, 2004. https://
eprint.iacr.org/2004/332.
[36] Joseph H Silverman and Joe Suzuki. Elliptic curve discrete logarithms and the
index calculus. In International Conference on the Theory and Application
of Cryptology and Information Security, pages 110–125. Springer, 1998.
46