[Pkg-privacy-commits] [obfsproxy] 99/353: Add the obfs3 specification and threat model.

Ximin Luo infinity0 at moszumanska.debian.org
Sat Aug 22 13:01:45 UTC 2015


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository obfsproxy.

commit 225e420c883d37b97bd170bf60d357688b3cd089
Author: George Kadianakis <desnacked at riseup.net>
Date:   Tue Jan 22 19:50:11 2013 +0200

    Add the obfs3 specification and threat model.
---
 doc/obfs3/obfs3-protocol-spec.txt | 154 ++++++++++++++++++++++++++++++++++++++
 doc/obfs3/obfs3-threat-model.txt  |   9 +++
 2 files changed, 163 insertions(+)

diff --git a/doc/obfs3/obfs3-protocol-spec.txt b/doc/obfs3/obfs3-protocol-spec.txt
new file mode 100644
index 0000000..dcea4f4
--- /dev/null
+++ b/doc/obfs3/obfs3-protocol-spec.txt
@@ -0,0 +1,154 @@
+        obfs3 (The Threebfuscator)
+
+0. Protocol overview
+
+   This is a protocol obfuscation layer for TCP protocols.  Its
+   purpose is to keep a third party from telling what protocol is in
+   use based on message contents.
+
+   Like obfs2, it does not provide authentication or data integrity.
+   It does not hide data lengths.  It is more suitable for providing a
+   layer of obfuscation for an existing authenticated protocol, like
+   SSH or TLS.
+
+   Like obfs2, the protocol has two phases: in the first phase, the
+   parties establish keys.  In the second, the parties exchange
+   superenciphered traffic.
+
+1. Motivation
+
+   The first widely used obfuscation protocol for Tor was obfs2. obfs2
+   encrypted traffic using a key that was negotiated during the
+   protocol.
+
+   obfs2 did not use a robust cryptographic key exchange, and the key
+   could be retrieved by any passive adversary who monitored the
+   initial handshake of obfs2.
+
+   People believe that the easiest way to block obfs2 would be to
+   retrieve the key, decrypt the first bytes of the handshake, and
+   look for redundancy on the handshake message.
+
+   To defend against this attack, obfs3 negotiates keys using an
+   anonymous Diffie Hellman key exchange. This is done so that a
+   passive adversary would not be able to retrieve the obfs3 session
+   key.
+
+   Unfortunately, traditional DH (over subgroups of Z_p* or over
+   Elliptic Curves) does not fit our threat model since its public
+   keys are distinguishable from random strings of the same size. For
+   this reason, a custom DH protocol was proposed that offers public
+   keys that look like random strings. The UniformDH scheme was
+   proposed by Ian Goldberg in:
+   https://lists.torproject.org/pipermail/tor-dev/2012-December/004245.html
+
+2. Primitives, notation, and constants.
+
+    E(K,s) is the AES-CTR-128 encryption of s using K as key.
+
+    x | y is the concatenation of x and y.
+    WR(n) is n bytes of weaker random data.
+    "xyz" is the ASCII characters 'x', 'y', and 'z', not NULL-terminated.
+    s[:n] is the first n bytes of s.
+    s[n:] is the last n bytes of s.
+
+    MAX_PADDING      is  8194
+
+    KEYLEN is the length of the key used by E(K,s) -- that is, 16.
+    COUNTERLEN is the length of the counter used by AES-CTR-128 -- that is, 16.
+
+    HMAC(k,m) is HMAC-SHA256(k,m) with 'k' being the key, and 'm' the
+    message.
+
+    A "byte" is an 8-bit octet.
+
+3. UniformDH
+
+   The UniformDH Diffie-Hellman scheme uses group 5 from RFC3526. It's
+   a 1536-bit MODP group.
+
+   To pick a private UniformDH key, we pick a random 1536-bit number,
+   and make it even by setting its low bit to 0. Let x be that private
+   key, and X = g^x (mod p).
+
+   The other party computes private and public keys, y and Y, in the
+   same manner.
+
+   When someone sends her public key to the other party, she randomly
+   decides whether to send X or p-X. This makes the public key
+   negligibly different from a uniform 1536-bit string
+
+   When a party wants to calculate the shared secret, she
+   raises the foreign public key to her private key. Note that both
+   (p-Y)^x = Y^x (mod p) and (p-X)^y = X^y (mod p), since x and y are
+   even.
+
+3. Key establishment phase.
+
+   The party who opens the connection is the 'initiator'; the one who
+   accepts it is the 'responder'.  Each begins by generating a
+   UniformDH keypair, and a random number PADLEN in [0, MAX_PADDING/2].
+   Both parties then send:
+
+    PUB_KEY | WR(PADLEN)
+
+   After retrieving the public key of the other end, each party
+   completes the DH key exchange and generates a shared-secret for the
+   session (named SHARED_SECRET). Using that shared-secret each party
+   derives its encryption keys as follows:
+
+     INIT_SECRET = HMAC(SHARED_SECRET, "Initiator obfuscated data")
+     RESP_SECRET = HMAC(SHARED_SECRET, "Responder obfuscated data")
+     INIT_KEY = INIT_SECRET[:KEYLEN]
+     INIT_COUNTER = INIT_SECRET[KEYLEN:]
+     RESP_KEY = RESP_SECRET[:KEYLEN]
+     RESP_COUNTER = RESP_SECRET[KEYLEN:]
+
+   The INIT_KEY value keys a block cipher (in CTR mode) used to
+   encrypt values from initiator to responder thereafter.  The counter
+   mode's initial counter value is INIT_COUNTER.  The RESP_KEY value
+   keys a block cipher (in CTR mode) used to encrypt values from
+   responder to initiator thereafter.  That counter mode's initial
+   counter value is RESP_COUNTER.
+
+   After the handshake is complete, when the initiator wants to send
+   application-layer data for the first time, she generates another
+   random number PADLEN2 in [0, MAX_PADDING/2], and sends:
+
+     WR(PADLEN2) | HMAC(SHARED_SECRET, "Initiator magic") | E(INIT_KEY, DATA)
+
+   When the responder wants to send application-layer data for the
+   first time, she sends:
+
+     WR(PADLEN2) | HMAC(SHARED_SECRET, "Responder magic") | E(RESP_KEY, DATA)
+
+   After a party receives the public key from the other end, it needs
+   to find out where the padding stops and where the application-layer
+   data starts. To do so, every time she receives network data, the
+   receiver tries to find the magic HMAC string in the data between
+   the public key and the end of the newly received data. After
+   spotting the magic string, she knows where the application-layer
+   data starts and she can start decrypting it.
+
+   If a party has scanned more than MAX_PADDING bytes and the magic
+   string has not yet been found, the party MUST close the connection.
+
+   After the initiator sends the magic string and the first chunk of
+   application-layer data, she can send additional application-layer
+   data simply by encrypting it with her encryption key, and without
+   prepending any magic strings:
+
+     E(INIT_KEY, DATA)
+
+   Similarly, the responder sends additional application-layer data by
+   encrypting it with her encryption key:
+
+     E(RESP_KEY, DATA)
+
+4. Acknowledgments
+
+   The idea of using a hash of the shared secret as the delimiter
+   between the padding and the data was suggested by Philipp Winter.
+
+   Ian Goldberg suggested the UniformDH scheme and helped a lot with
+   reviewing the protocol specification.
diff --git a/doc/obfs3/obfs3-threat-model.txt b/doc/obfs3/obfs3-threat-model.txt
new file mode 100644
index 0000000..1b559a2
--- /dev/null
+++ b/doc/obfs3/obfs3-threat-model.txt
@@ -0,0 +1,9 @@
+              Threat model for the obfs3 obfuscation protocol
+
+The threat model of obfs3 is identical to the threat model of obfs2,
+with an added goal:
+
+obfs3 offers protection against passive Deep Packet Inspection
+machines that expect the obfs3 protocol. Such machines should not be
+able to verify the existence of the obfs3 protocol without launching
+an active attack against its handshake.

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/obfsproxy.git



More information about the Pkg-privacy-commits mailing list