[tor-commits] [obfsproxy/master] Stop doing iterative hashing when we don't have a shared secret.
nickm at torproject.org
nickm at torproject.org
Sun May 29 01:33:38 UTC 2011
commit 0da68ca3c40ffc775421ae732f70504ac74891fc
Author: George Kadianakis <desnacked at gmail.com>
Date: Thu May 26 00:33:46 2011 +0200
Stop doing iterative hashing when we don't have a shared secret.
---
doc/protocol-spec.txt | 24 ++++++++++--------------
src/main.c | 3 ++-
src/protocols/obfs2.c | 28 ++++++++++++++++------------
3 files changed, 28 insertions(+), 27 deletions(-)
diff --git a/doc/protocol-spec.txt b/doc/protocol-spec.txt
index 0f9edf9..798da14 100644
--- a/doc/protocol-spec.txt
+++ b/doc/protocol-spec.txt
@@ -17,6 +17,8 @@ The Twobfuscator
1. Primitives, notation, and constants.
H(x) is SHA256 of X
+ H^n(x) is H(x) called iteratively n times.
+
E_K(s) is the AES-counter-mode encryption of s using the key K.
x | y is the concatenation of x and y
@@ -39,9 +41,6 @@ The Twobfuscator
MAC(s, x) = H(s | x | s)
- Let n = HASH_ITERATIONS through section '2. Key establishment phase.'.
- Then, H^n(x) is H(x) called iteratively n times.
-
A "byte" is an 8-bit octet.
We require that HASHLEN >= KEYLEN + IVLEN
@@ -53,14 +52,12 @@ The Twobfuscator
a padding key as follows. The initiator generates:
INIT_SEED = SR(SEED_LENGTH)
- INIT_PAD_TEMP = MAC("Initiator obfuscation padding", INIT_SEED)[:KEYLEN]
- INIT_PAD_KEY = H^n(INIT_PAD_TEMP)
+ INIT_PAD_KEY = MAC("Initiator obfuscation padding", INIT_SEED)[:KEYLEN]
And the responder generates:
RESP_SEED = SR(SEED_LENGTH)
- RESP_PAD_TEMP = MAC("Responder obfuscation padding", INIT_SEED)[:KEYLEN]
- RESP_PAD_KEY = H^n(RESP_PAD_TEMP)
+ RESP_PAD_KEY = MAC("Responder obfuscation padding", INIT_SEED)[:KEYLEN]
Each then generates a random number PADLEN in range from 0 through
MAX_PADDING (inclusive), and sends:
@@ -79,12 +76,10 @@ The Twobfuscator
INIT_SECRET = MAC("Initiator obfuscated data", INIT_SEED|RESP_SEED)
RESP_SECRET = MAC("Responder obfuscated data", INIT_SEED|RESP_SEED)
- INIT_MASTER_KEY = H^n(INIT_SECRET)
- RESP_MASTER_KEY = H^n(RESP_SECRET)
- INIT_KEY = INIT_MASTER_KEY[:KEYLEN]
- INIT_IV = INIT_MASTER_KEY[KEYLEN:]
- RESP_KEY = RESP_MASTER_KEY[:KEYLEN]
- RESP_IV = RESP_MASTER_KEY[KEYLEN:]
+ INIT_KEY = INIT_SECRET[:KEYLEN]
+ INIT_IV = INIT_SECRET[KEYLEN:]
+ RESP_KEY = RESP_SECRET[:KEYLEN]
+ RESP_IV = RESP_SECRET[KEYLEN:]
The INIT_KEY value keys a stream cipher used to encrypt values from
initiator to responder thereafter. The stream cipher's IV is
@@ -97,5 +92,6 @@ The Twobfuscator
Optionally, if the client and server share a secret value SECRET,
they can replace the MAC function with:
- MAC(s,x) = H(s | x | SECRET | s)
+ MAC(s,x) = H^n(s | x | SECRET | s)
+ where n = HASH_ITERATIONS.
diff --git a/src/main.c b/src/main.c
index 59b6909..4c3c48c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -128,7 +128,8 @@ main(int argc, const char **argv)
mode, protocol,
(struct sockaddr *)&ss_listen, sl_listen,
sa_target, sl_target,
- shared_secret, strlen(shared_secret));
+ shared_secret,
+ shared_secret ? strlen(shared_secret) : 0);
if (! listener) {
printf("Couldn't create listener!\n");
return 4;
diff --git a/src/protocols/obfs2.c b/src/protocols/obfs2.c
index 4159691..b3fe590 100644
--- a/src/protocols/obfs2.c
+++ b/src/protocols/obfs2.c
@@ -75,8 +75,6 @@ derive_key(void *s, const char *keytype)
crypt_t *cryptstate;
uchar buf[SHA256_LENGTH];
digest_t *c = digest_new();
- digest_t *d;
- int i;
digest_update(c, (uchar*)keytype, strlen(keytype));
if (seed_nonzero(state->initiator_seed))
@@ -88,10 +86,14 @@ derive_key(void *s, const char *keytype)
digest_update(c, (uchar*)keytype, strlen(keytype));
digest_getdigest(c, buf, sizeof(buf));
- for (i=0; i < OBFUSCATE_HASH_ITERATIONS; i++) {
- d = digest_new();
- digest_update(d, buf, sizeof(buf));
- digest_getdigest(d, buf, sizeof(buf));
+ if (seed_nonzero(state->secret_seed)) {
+ digest_t *d;
+ int i;
+ for (i=0; i < OBFUSCATE_HASH_ITERATIONS; i++) {
+ d = digest_new();
+ digest_update(d, buf, sizeof(buf));
+ digest_getdigest(d, buf, sizeof(buf));
+ }
}
cryptstate = crypt_new(buf, 16);
@@ -110,8 +112,6 @@ derive_padding_key(void *s, const uchar *seed,
crypt_t *cryptstate;
uchar buf[SHA256_LENGTH];
digest_t *c = digest_new();
- digest_t *d;
- int i;
digest_update(c, (uchar*)keytype, strlen(keytype));
if (seed_nonzero(seed))
@@ -121,10 +121,14 @@ derive_padding_key(void *s, const uchar *seed,
digest_update(c, (uchar*)keytype, strlen(keytype));
digest_getdigest(c, buf, sizeof(buf));
- for (i=0; i < OBFUSCATE_HASH_ITERATIONS; i++) {
- d = digest_new();
- digest_update(d, buf, sizeof(buf));
- digest_getdigest(d, buf, sizeof(buf));
+ if (seed_nonzero(state->secret_seed)) {
+ digest_t *d;
+ int i;
+ for (i=0; i < OBFUSCATE_HASH_ITERATIONS; i++) {
+ d = digest_new();
+ digest_update(d, buf, sizeof(buf));
+ digest_getdigest(d, buf, sizeof(buf));
+ }
}
cryptstate = crypt_new(buf, 16);
More information about the tor-commits
mailing list