[tor-commits] [obfsproxy/master] Added dummy plugin. A plugin that just leaves data pass by.

nickm at torproject.org nickm at torproject.org
Wed Apr 27 00:17:45 UTC 2011


commit f3f7d7d00e92835fc0db3e7731147898c46480e2
Author: George Kadianakis <desnacked at gmail.com>
Date:   Wed Mar 23 19:31:09 2011 +0100

    Added dummy plugin. A plugin that just leaves data pass by.
---
 Makefile.am                  |    6 +++-
 src/main.c                   |   24 +++++++++++-----
 src/network.c                |   15 +++++-----
 src/plugins/dummy.c          |   61 ++++++++++++++++++++++++++++++++++++++++++
 src/plugins/dummy.h          |   21 ++++++++++++++
 src/plugins/obfs2.c          |    4 +--
 src/protocol.c               |   18 +++++++-----
 src/protocol.h               |    4 ++-
 src/socks.c                  |    9 ++++--
 src/test/unittest_protocol.c |   24 ++++++++--------
 10 files changed, 143 insertions(+), 43 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 67cd34d..32d5c05 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,7 +13,8 @@ libobfsproxy_a_SOURCES = \
 	src/socks.c  \
 	src/util.c   \
 	src/plugins/obfs2.c \
-	src/plugins/obfs2_crypt.c
+	src/plugins/obfs2_crypt.c \
+	src/plugins/dummy.c
 
 obfsproxy_SOURCES = \
 	src/main.c
@@ -35,7 +36,8 @@ noinst_HEADERS = \
 	src/test/tinytest.h \
 	src/test/tinytest_macros.h \
 	src/plugins/obfs2.h \
-	src/plugins/obfs2_crypt.h
+	src/plugins/obfs2_crypt.h \
+	src/plugins/dummy.h
 
 EXTRA_DIST = doc/protocol-spec.txt src/sha256.c
 
diff --git a/src/main.c b/src/main.c
index 93d5820..4f29005 100644
--- a/src/main.c
+++ b/src/main.c
@@ -25,7 +25,7 @@ static void
 usage(void)
 {
   fprintf(stderr,
-    "Usage: obfsproxy {client/server/socks} listenaddr[:port] targetaddr:port\n"
+    "Usage: obfsproxy {client/server/socks} {obfs2/dummy} listenaddr[:port] targetaddr:port\n"
     "  (Default listen port is 48988 for client; 23548 for socks; 11253 for server)\n"
           );
   exit(1);
@@ -43,6 +43,7 @@ handle_signal_cb(evutil_socket_t fd, short what, void *arg)
 int
 main(int argc, const char **argv)
 {
+  int protocol;
   int is_client, is_socks = 0, mode;
   struct sockaddr_storage ss_listen, ss_target;
   struct sockaddr *sa_target=NULL;
@@ -54,7 +55,7 @@ main(int argc, const char **argv)
   listener_t *listener;
 
   /* XXXXX the interface is crap.  Fix that. XXXXX */
-  if (argc < 3)
+  if (argc < 4)
     usage();
   if (!strcmp(argv[1], "client")) {
     is_client = 1;
@@ -73,21 +74,28 @@ main(int argc, const char **argv)
     usage();
   }
 
+  if (!strcmp(argv[2], "obfs2"))
+    protocol = OBFS2_PROTOCOL;
+  else if (!strcmp(argv[2], "dummy"))
+    protocol = DUMMY_PROTOCOL;
+  else
+    usage();
+
   /* figure out what port(s) to listen on as client/server */
-  if (resolve_address_port(argv[2], 1, 1, &ss_listen, &sl_listen, defport) < 0)
+  if (resolve_address_port(argv[3], 1, 1, &ss_listen, &sl_listen, defport) < 0)
     usage();
 
   if (is_socks) {
-    if (argc != 3)
+    if (argc != 4)
       usage();
   } else {
-    if (argc != 4)
+    if (argc != 5)
       usage();
 
     /* figure out what place to connect to as a client/server. */
     /* XXXX when we add socks support, clients will not have a fixed "target"
      * XXXX address but will instead connect to a client-selected address. */
-    if (resolve_address_port(argv[3], 1, 0, &ss_target, &sl_target, NULL) < 0)
+    if (resolve_address_port(argv[4], 1, 0, &ss_target, &sl_target, NULL) < 0)
       usage();
     sa_target = (struct sockaddr *)&ss_target;
   }
@@ -109,9 +117,9 @@ main(int argc, const char **argv)
   sigevent = evsignal_new(base, SIGINT, handle_signal_cb, (void*) base);
 
   /* start an evconnlistener on the appropriate port(s) */
-  /* ASN We hardcode BRL_PROTOCOL for now. */
+  /* ASN We hardcode OBFS2_PROTOCOL for now. */
   listener = listener_new(base,
-                          mode, BRL_PROTOCOL,
+                          mode, protocol,
                           (struct sockaddr *)&ss_listen, sl_listen,
                           sa_target, sl_target,
                           NULL, 0);
diff --git a/src/network.c b/src/network.c
index 833b939..3e23cdc 100644
--- a/src/network.c
+++ b/src/network.c
@@ -45,7 +45,7 @@ static void plaintext_read_cb(struct bufferevent *bev, void *arg);
 static void socks_read_cb(struct bufferevent *bev, void *arg);
 /* ASN Changed encrypted_read_cb() to obfuscated_read_cb(), it sounds
    a bit more obfsproxy generic. I still don't like it though. */
-static void obfsucated_read_cb(struct bufferevent *bev, void *arg);
+static void obfuscated_read_cb(struct bufferevent *bev, void *arg);
 static void input_event_cb(struct bufferevent *bev, short what, void *arg);
 static void output_event_cb(struct bufferevent *bev, short what, void *arg);
 
@@ -129,6 +129,7 @@ simple_listener_cb(struct evconnlistener *evcl,
   int is_initiator = (conn->mode != LSN_SIMPLE_SERVER) ? 1 : 0;
   conn->proto->state = proto_init(conn->proto, &is_initiator);
 
+  /* ASN Which means that all plugins need a state... */
   if (!conn->proto->state)
     goto err;
 
@@ -150,7 +151,7 @@ simple_listener_cb(struct evconnlistener *evcl,
 
   if (conn->mode == LSN_SIMPLE_SERVER) {
     bufferevent_setcb(conn->input,
-                      obfsucated_read_cb, NULL, input_event_cb, conn);
+                      obfuscated_read_cb, NULL, input_event_cb, conn);
   } else if (conn->mode == LSN_SIMPLE_CLIENT) {
     bufferevent_setcb(conn->input,
                       plaintext_read_cb, NULL, input_event_cb, conn);
@@ -174,7 +175,7 @@ simple_listener_cb(struct evconnlistener *evcl,
                       plaintext_read_cb, NULL, output_event_cb, conn);
   else
     bufferevent_setcb(conn->output,
-                      obfsucated_read_cb, NULL, output_event_cb, conn);
+                      obfuscated_read_cb, NULL, output_event_cb, conn);
 
   /* Queue output right now. */
   struct bufferevent *encrypted =
@@ -206,8 +207,8 @@ simple_listener_cb(struct evconnlistener *evcl,
 static void
 conn_free(conn_t *conn)
 {
-  if (conn->proto->state)
-    proto_destroy(conn->proto->state);
+  if (conn->proto)
+    proto_destroy(conn->proto);
   if (conn->socks_state)
     socks_state_free(conn->socks_state);
   if (conn->input)
@@ -289,7 +290,7 @@ plaintext_read_cb(struct bufferevent *bev, void *arg)
 }
 
 static void
-obfsucated_read_cb(struct bufferevent *bev, void *arg)
+obfuscated_read_cb(struct bufferevent *bev, void *arg)
 {
   conn_t *conn = arg;
   struct bufferevent *other;
@@ -375,7 +376,7 @@ output_event_cb(struct bufferevent *bev, short what, void *arg)
       bufferevent_setcb(conn->input,
                         plaintext_read_cb, NULL, input_event_cb, conn);
       if (evbuffer_get_length(bufferevent_get_input(conn->input)) != 0)
-        obfsucated_read_cb(bev, conn->input);
+        obfuscated_read_cb(bev, conn->input);
     }
   }
   /* XXX we don't expect any other events */
diff --git a/src/plugins/dummy.c b/src/plugins/dummy.c
new file mode 100644
index 0000000..957c30b
--- /dev/null
+++ b/src/plugins/dummy.c
@@ -0,0 +1,61 @@
+/* Copyright 2011 Princess Peach Toadstool
+
+   You may do anything with this work that copyright law would normally
+   restrict, so long as you retain the above notice(s) and this license
+   in all redistributed copies and derived works.  There is no warranty.
+*/
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <unistd.h>
+
+#include <openssl/rand.h>
+#include <event2/buffer.h>
+
+#include "dummy.h"
+#include "../util.h"
+#include "../protocol.h"
+
+int
+dummy_new(struct protocol_t *proto_struct) {
+  proto_struct->destroy = (void *)NULL;
+  proto_struct->init = (void *)dummy_init;
+  proto_struct->handshake = (void *)NULL;
+  proto_struct->send = (void *)dummy_send;
+  proto_struct->recv = (void *)dummy_recv;
+
+  return 0;
+}
+
+int *
+dummy_init(int *initiator) {
+  /* Dodging state check. */
+  return initiator;
+}
+
+int
+dummy_send(void *nothing,
+           struct evbuffer *source, struct evbuffer *dest) {
+  (void)nothing;
+
+  /* ASN evbuffer_add_buffer() doesn't work for some reason. */
+  while (1) {
+    int n = evbuffer_remove_buffer(source, dest, 1024);
+    if (n <= 0)
+      return 0;
+  }
+}
+
+int
+dummy_recv(void *nothing,
+           struct evbuffer *source, struct evbuffer *dest) {
+  (void)nothing;
+  while (1) {
+    int n = evbuffer_remove_buffer(source, dest, 1024);
+    if (n <= 0)
+      return 0;
+  }
+}
diff --git a/src/plugins/dummy.h b/src/plugins/dummy.h
new file mode 100644
index 0000000..cf9342a
--- /dev/null
+++ b/src/plugins/dummy.h
@@ -0,0 +1,21 @@
+/* Copyright 2011 Princess Peach Toadstool
+
+   You may do anything with this work that copyright law would normally
+   restrict, so long as you retain the above notice(s) and this license
+   in all redistributed copies and derived works.  There is no warranty.
+*/
+
+#ifndef DUMMY_H
+#define DUMMY_H
+
+struct protocol_t;
+struct evbuffer;
+
+int *dummy_init(int *initiator);
+int dummy_send(void *nothing,
+               struct evbuffer *source, struct evbuffer *dest);
+int dummy_recv(void *nothing, struct evbuffer *source,
+               struct evbuffer *dest);
+int dummy_new(struct protocol_t *proto_struct);
+
+#endif
diff --git a/src/plugins/obfs2.c b/src/plugins/obfs2.c
index 01c74f3..ef8be8e 100644
--- a/src/plugins/obfs2.c
+++ b/src/plugins/obfs2.c
@@ -37,7 +37,7 @@ obfs2_new(struct protocol_t *proto_struct) {
     return -1;
   }
 
-  return 0;
+  return 1;
 }
 
 /** Return true iff the OBFUSCATE_SEED_LENGTH-byte seed in 'seed' is nonzero */
@@ -167,8 +167,6 @@ obfs2_send_initial_message(obfs2_state_t *state, struct evbuffer *buf)
   plength %= OBFUSCATE_MAX_PADDING;
   send_plength = htonl(plength);
 
-  printf("death and dest\n");
-
   if (state->we_are_initiator)
     seed = state->initiator_seed;
   else
diff --git a/src/protocol.c b/src/protocol.c
index 6df93ca..339feae 100644
--- a/src/protocol.c
+++ b/src/protocol.c
@@ -6,6 +6,7 @@
 #include "network.h"
 
 #include "plugins/obfs2.h"
+#include "plugins/dummy.h"
 
 /**
     This function returns a protocol_t structure based on the mode
@@ -15,13 +16,15 @@ struct protocol_t *
 set_up_protocol(int protocol) {
   struct protocol_t *proto = calloc(1, sizeof(struct protocol_t));
 
-  if (protocol == BRL_PROTOCOL) {
+  if (protocol == OBFS2_PROTOCOL)
     proto->new = &obfs2_new;
-    if (proto->new(proto))
-      printf("Protocol constructed\n");
-  }
+  else if (protocol == DUMMY_PROTOCOL)
+    proto->new = &dummy_new;
   /* elif { other protocols } */
 
+  if (proto->new(proto)>0)
+    printf("Protocol constructed\n");
+
   return proto;
 }
 
@@ -39,8 +42,8 @@ proto_handshake(struct protocol_t *proto, void *buf) {
   assert(proto);
   if (proto->handshake)
     return proto->handshake(proto->state, buf);
-  else
-    return -1;
+  else /* It's okay with me, protocol didn't have a handshake */
+    return 0;
 }
 
 int
@@ -48,7 +51,7 @@ proto_send(struct protocol_t *proto, void *source, void *dest) {
   assert(proto);
   if (proto->send)
     return proto->send(proto->state, source, dest);
-  else
+  else 
     return -1;
 }
 
@@ -63,6 +66,7 @@ proto_recv(struct protocol_t *proto, void *source, void *dest) {
 
 void proto_destroy(struct protocol_t *proto) {
   assert(proto);
+  assert(proto->state);
 
   if (proto->destroy)
     proto->destroy(proto->state);
diff --git a/src/protocol.h b/src/protocol.h
index 9e58ea8..781bde0 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -2,7 +2,9 @@
 #define PROTOCOL_H
 
 /* ASN I'm gonna be calling crypt_protocol.c BRL_RPOTOCOL for now. Yes. */
-#define BRL_PROTOCOL      1
+#define DUMMY_PROTOCOL    0
+#define OBFS2_PROTOCOL      1
+
 
 struct protocol_t *set_up_protocol(int protocol);
 void *proto_init(struct protocol_t *proto, void *arg);
diff --git a/src/socks.c b/src/socks.c
index 8f432e1..a3fb729 100644
--- a/src/socks.c
+++ b/src/socks.c
@@ -17,7 +17,7 @@
 
 
 /**
-   General idea:
+   General SOCKS5 idea:
 
    Client ------------------------> Server
           Method Negotiation Packet
@@ -32,8 +32,9 @@
                Server reply
 
    "Method Negotiation Packet" is handled by: socks5_handle_negotiation()
-   "Method Negotiation Reply" is done by: socks5_reply_negotiation()
-   "Client request" is handled by: socks5_validate_request()
+   "Method Negotiation Reply" is done by: socks5_do_negotiation()
+   "Client request" is handled by: socks5_handle_request()
+   "Server reply" is done by: socks5_send_reply
 */
 
 static int socks5_do_negotiation(struct evbuffer *dest,
@@ -191,6 +192,8 @@ socks5_send_reply(struct evbuffer *reply_dest, socks_state_t *state,
   /* We either failed or succeded.
      Either way, we should send something back to the client */
   p[0] = SOCKS5_VERSION;    /* Version field */
+  if (status == SOCKS5_REP_FAIL)
+    printf("Sending negative shit\n");
   p[1] = (unsigned char) status; /* Reply field */
   p[2] = 0;                 /* Reserved */
   if (state->parsereq.af == AF_UNSPEC) {
diff --git a/src/test/unittest_protocol.c b/src/test/unittest_protocol.c
index ceb666d..1864a3a 100644
--- a/src/test/unittest_protocol.c
+++ b/src/test/unittest_protocol.c
@@ -26,8 +26,8 @@
 static void
 test_proto_setup(void *data)
 {
-  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
-  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *client_proto = set_up_protocol(OBFS2_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(OBFS2_PROTOCOL);
 
   int initiator = 1;
   int no_initiator = 0;
@@ -55,8 +55,8 @@ test_proto_handshake(void *data)
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
-  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *client_proto = set_up_protocol(OBFS2_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(OBFS2_PROTOCOL);
 
   int initiator = 1;
   int no_initiator = 0;
@@ -114,8 +114,8 @@ test_proto_transfer(void *data)
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
-  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *client_proto = set_up_protocol(OBFS2_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(OBFS2_PROTOCOL);
 
   int initiator = 1;
   int no_initiator = 0;
@@ -197,8 +197,8 @@ test_proto_splitted_handshake(void *data)
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
-  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *client_proto = set_up_protocol(OBFS2_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(OBFS2_PROTOCOL);
 
   int initiator = 1;
   int no_initiator = 0;
@@ -337,8 +337,8 @@ test_proto_wrong_handshake_magic(void *data)
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
-  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *client_proto = set_up_protocol(OBFS2_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(OBFS2_PROTOCOL);
 
   int initiator = 1;
   int no_initiator = 0;
@@ -402,8 +402,8 @@ test_proto_wrong_handshake_plength(void *data)
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
   
-  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
-  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *client_proto = set_up_protocol(OBFS2_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(OBFS2_PROTOCOL);
   int initiator = 1;
   int no_initiator = 0;
   client_proto->state = proto_init(client_proto, &initiator);





More information about the tor-commits mailing list