commit 80d91a5305f2a3fdf2d9f074867643e874718dde Author: George Kadianakis desnacked@gmail.com Date: Sat Aug 20 06:36:16 2011 +0200
Add support for managed proxies to dummy and obfs2. --- src/protocols/dummy.c | 37 +++++++++++++++++++++++++++++++++++++ src/protocols/obfs2.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- src/test/unittest_obfs2.c | 5 +++++ 3 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/src/protocols/dummy.c b/src/protocols/dummy.c index 6489f58..27e6340 100644 --- a/src/protocols/dummy.c +++ b/src/protocols/dummy.c @@ -101,6 +101,43 @@ dummy_config_create(int n_options, const char *const *options) return NULL; }
+/** + Return a config_t for a managed proxy listener. +*/ +static config_t * +dummy_config_create_managed(int is_server, const char *protocol, + const char *bindaddr, const char *orport) +{ + const char* defport; + + dummy_config_t *cfg = xzalloc(sizeof(dummy_config_t)); + cfg->super.vtable = &dummy_vtable; + + if (is_server) { + defport = "11253"; /* 2bf5 */ + cfg->mode = LSN_SIMPLE_SERVER; + } else { + defport = "23548"; /* 5bf5 */ + cfg->mode = LSN_SOCKS_CLIENT; + } + + cfg->listen_addr = resolve_address_port(bindaddr, 1, 1, defport); + if (!cfg->listen_addr) + goto err; + + if (is_server) { + cfg->target_addr = resolve_address_port(orport, 1, 0, NULL); + if (!cfg->target_addr) + goto err; + } + + return &cfg->super; + + err: + dummy_config_free(&cfg->super); + return NULL; +} + /** Retrieve the 'n'th set of listen addresses for this configuration. */ static struct evutil_addrinfo * dummy_config_get_listen_addrs(config_t *cfg, size_t n) diff --git a/src/protocols/obfs2.c b/src/protocols/obfs2.c index 366bc45..42a1c04 100644 --- a/src/protocols/obfs2.c +++ b/src/protocols/obfs2.c @@ -44,7 +44,11 @@ shared_seed_nonzero(const uchar *seed) return memcmp(seed, SHARED_ZERO_SEED, SHARED_SECRET_LENGTH) != 0; }
-/** stupid function returning the other conn of the circuit */ +/** + Stupid temporary function returning the other conn of a circuit. + For example, if 'conn' is the downstream connection on a circuit, + this function returns the upstream connection. +*/ static inline conn_t * get_other_conn(conn_t *conn) { @@ -99,6 +103,43 @@ obfs2_config_create(int n_options, const char *const *options) }
/** + Populate a config_t for a managed proxy listener. +*/ +static config_t * +obfs2_config_create_managed(int is_server, const char *protocol, + const char *bindaddr, const char *orport) +{ + const char* defport; + + obfs2_config_t *cfg = xzalloc(sizeof(obfs2_config_t)); + cfg->super.vtable = &obfs2_vtable; + + if (is_server) { + defport = "11253"; /* 2bf5 */ + cfg->mode = LSN_SIMPLE_SERVER; + } else { + defport = "23548"; /* 5bf5 */ + cfg->mode = LSN_SOCKS_CLIENT; + } + + cfg->listen_addr = resolve_address_port(bindaddr, 1, 1, defport); + if (!cfg->listen_addr) + goto err; + + if (is_server) { + cfg->target_addr = resolve_address_port(orport, 1, 0, NULL); + if (!cfg->target_addr) + goto err; + } + + return &cfg->super; + + err: + obfs2_config_free(&cfg->super); + return NULL; +} + +/** Helper: Parses 'options' and fills 'cfg'. */ int @@ -195,7 +236,7 @@ obfs2_config_get_target_addr(config_t *cfg) }
/* - This is called everytime we get a connection for the dummy + This is called everytime we get a connection for the obfs2 protocol. */
diff --git a/src/test/unittest_obfs2.c b/src/test/unittest_obfs2.c index 211f6af..6e14b1e 100644 --- a/src/test/unittest_obfs2.c +++ b/src/test/unittest_obfs2.c @@ -7,6 +7,7 @@
#define PROTOCOL_OBFS2_PRIVATE #define CRYPT_PRIVATE +#define NETWORK_PRIVATE #include "protocols/obfs2.h" #include "crypt.h"
@@ -192,6 +193,10 @@ test_obfs2_transfer(void *state) int n; struct evbuffer_iovec v[2];
+ /* evil trick to bypass get_other_conn() */ + circuit_create(s->conn_client, s->conn_client); + circuit_create(s->conn_server, s->conn_server); + /* Handshake */ tt_int_op(0, <=, proto_handshake(s->conn_client, s->output_buffer)); tt_assert(RECV_GOOD == proto_recv(s->conn_server, s->output_buffer,