[tor-commits] [obfsproxy/master] reviving unittests

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


commit 5200697b9074178b48083925a7df4f25cc4757ff
Author: George Kadianakis <desnacked at gmail.com>
Date:   Thu Mar 17 21:44:43 2011 +0100

    reviving unittests
---
 src/plugins/obfs2.c          |    2 +
 src/protocol.c               |    3 +-
 src/test/unittest.c          |    2 +-
 src/test/unittest_protocol.c |  262 ++++++++++++++++++++----------------------
 4 files changed, 131 insertions(+), 138 deletions(-)

diff --git a/src/plugins/obfs2.c b/src/plugins/obfs2.c
index 90a8528..c0cdc1e 100644
--- a/src/plugins/obfs2.c
+++ b/src/plugins/obfs2.c
@@ -158,6 +158,8 @@ 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 9fda4b0..6530fe0 100644
--- a/src/protocol.c
+++ b/src/protocol.c
@@ -19,12 +19,13 @@ set_up_protocol(int protocol) {
   if (protocol == BRL_PROTOCOL) {
     proto->new = &obfs2_new;
     proto->new(proto);
-    printf("Protocol constructed\n");
 
     if (initialize_crypto() < 0) {
       fprintf(stderr, "Can't initialize crypto; failing\n");
       return NULL;
     }
+
+    printf("Protocol constructed\n");
   }
   /* elif { other protocols } */
 
diff --git a/src/test/unittest.c b/src/test/unittest.c
index c9c6e17..4e1368c 100644
--- a/src/test/unittest.c
+++ b/src/test/unittest.c
@@ -15,7 +15,7 @@ extern struct testcase_t socks_tests[];
 
 struct testgroup_t groups[] = {
   { "crypt/", crypt_tests },
-  /*  { "proto/", protocol_tests }, */
+  { "proto/", protocol_tests },
   { "socks/", socks_tests },
   END_OF_GROUPS
 };
diff --git a/src/test/unittest_protocol.c b/src/test/unittest_protocol.c
index 69dff6f..334591c 100644
--- a/src/test/unittest_protocol.c
+++ b/src/test/unittest_protocol.c
@@ -1,4 +1,3 @@
-#if 0
 /* Copyright 2011 Nick Mathewson
 
    You may do anything with this work that copyright law would normally
@@ -20,22 +19,31 @@
 #define CRYPT_PRIVATE
 #include "../crypt.h"
 #include "../util.h"
-#include "../crypt_protocol.h"
+#include "../protocol.h"
+#include "../plugins/obfs2.h"
 
 /* Make sure we can successfully set up a protocol state */
 static void
 test_proto_setup(void *data)
 {
-  protocol_state_t *proto1, *proto2;
-  proto1 = protocol_state_new(1);
-  proto2 = protocol_state_new(0);
-  tt_assert(proto1);
-  tt_assert(proto2);
+  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+
+  int initiator = 1;
+  int no_initiator = 0;
+  client_proto->state = proto_init(client_proto, &initiator);
+  server_proto->state = proto_init(server_proto, &no_initiator);
+
+  tt_assert(client_proto);
+  tt_assert(server_proto);
+  tt_assert(client_proto->state);
+  tt_assert(server_proto->state);
+
  end:
-  if (proto1)
-    protocol_state_free(proto1);
-  if (proto2)
-    protocol_state_free(proto2);
+  if (client_proto->state)
+    proto_destroy(client_proto);
+  if (server_proto->state)
+    proto_destroy(server_proto);
 
 }
 
@@ -47,24 +55,33 @@ test_proto_handshake(void *data)
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  protocol_state_t *client_state, *server_state;
-  client_state = protocol_state_new(1);
-  server_state = protocol_state_new(0);
-  tt_assert(client_state);
-  tt_assert(server_state);
+  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+
+  int initiator = 1;
+  int no_initiator = 0;
+  client_proto->state = proto_init(client_proto, &initiator);
+  server_proto->state = proto_init(server_proto, &no_initiator);
+  tt_assert(client_proto);
+  tt_assert(server_proto);
+  tt_assert(client_proto->state);
+  tt_assert(server_proto->state);
+
+  obfs2_state_t *client_state = client_proto->state;
+  obfs2_state_t *server_state = server_proto->state;
 
   /* We create a client handshake message and pass it to output_buffer */
-  tt_int_op(0, <=, proto_send_initial_message(client_state, output_buffer)<0);
+  tt_int_op(0, <=, proto_handshake(client_proto, output_buffer)<0);
 
   /* We simulate the server receiving and processing the client's handshake message,
      by using proto_recv() on the output_buffer */
-  tt_int_op(0, <=, proto_recv(server_state, output_buffer, dummy_buffer) <0);
+  tt_int_op(0, <=, proto_recv(server_proto, output_buffer, dummy_buffer) <0);
 
   /* Now, we create the server's handshake and pass it to output_buffer */
-  tt_int_op(0, <=, proto_send_initial_message(server_state, output_buffer)<0);
+  tt_int_op(0, <=, proto_handshake(server_proto, output_buffer)<0);
 
   /* We simulate the client receiving and processing the server's handshake */
-  tt_int_op(0, <=, proto_recv(client_state, output_buffer, dummy_buffer) <0);
+  tt_int_op(0, <=, proto_recv(client_proto, output_buffer, dummy_buffer) <0);
 
   /* The handshake is now complete. We should have:
      client's send_crypto == server's recv_crypto
@@ -78,10 +95,10 @@ test_proto_handshake(void *data)
                           sizeof(crypt_t)));
 
  end:
-  if (client_state)
-    protocol_state_free(client_state);
-  if (server_state)
-    protocol_state_free(server_state);
+  if (client_proto->state)
+    proto_destroy(client_proto);
+  if (server_proto->state)
+    proto_destroy(server_proto);
 
   if (output_buffer)
     evbuffer_free(output_buffer);
@@ -97,20 +114,26 @@ test_proto_transfer(void *data)
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  protocol_state_t *client_state, *server_state;
-  client_state = protocol_state_new(1);
-  server_state = protocol_state_new(0);
-  tt_assert(client_state);
-  tt_assert(server_state);
+  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+
+  int initiator = 1;
+  int no_initiator = 0;
+  client_proto->state = proto_init(client_proto, &initiator);
+  server_proto->state = proto_init(server_proto, &no_initiator);
+  tt_assert(client_proto);
+  tt_assert(server_proto);
+  tt_assert(client_proto->state);
+  tt_assert(server_proto->state);
 
   int n;
   struct evbuffer_iovec v[2];
 
   /* Handshake */
-  tt_int_op(0, <=, proto_send_initial_message(client_state, output_buffer)<0);
-  tt_int_op(0, <=, proto_recv(server_state, output_buffer, dummy_buffer) <0);
-  tt_int_op(0, <=, proto_send_initial_message(server_state, output_buffer)<0);
-  tt_int_op(0, <=, proto_recv(client_state, output_buffer, dummy_buffer) <0);
+  tt_int_op(0, <=, proto_handshake(client_proto, output_buffer)<0);
+  tt_int_op(0, <=, proto_recv(server_proto, output_buffer, dummy_buffer) <0);
+  tt_int_op(0, <=, proto_handshake(server_proto, output_buffer)<0);
+  tt_int_op(0, <=, proto_recv(client_proto, output_buffer, dummy_buffer) <0);
   /* End of Handshake */
 
   /* Now let's pass some data around. */
@@ -119,9 +142,9 @@ test_proto_transfer(void *data)
 
   /* client -> server */
   evbuffer_add(dummy_buffer, msg1, 54);
-  proto_send(client_state, dummy_buffer, output_buffer);
+  proto_send(client_proto, dummy_buffer, output_buffer);
 
-  tt_int_op(0, <=, proto_recv(server_state, output_buffer, dummy_buffer));
+  tt_int_op(0, <=, proto_recv(server_proto, output_buffer, dummy_buffer));
 
   n = evbuffer_peek(dummy_buffer, -1, NULL, &v[0], 2);
 
@@ -134,18 +157,18 @@ test_proto_transfer(void *data)
 
   /* client <- server */
   evbuffer_add(dummy_buffer, msg2, 55);
-  tt_int_op(0, <=, proto_send(server_state, dummy_buffer, output_buffer));
+  tt_int_op(0, <=, proto_send(server_proto, dummy_buffer, output_buffer));
 
-  tt_int_op(0, <=, proto_recv(client_state, output_buffer, dummy_buffer));
+  tt_int_op(0, <=, proto_recv(client_proto, output_buffer, dummy_buffer));
 
   n = evbuffer_peek(dummy_buffer, -1, NULL, &v[1], 2);
   tt_int_op(0, ==, strncmp(msg2, v[1].iov_base, 55));
 
  end:
-  if (client_state)
-    protocol_state_free(client_state);
-  if (server_state)
-    protocol_state_free(server_state);
+  if (client_proto->state)
+    proto_destroy(client_proto);
+  if (server_proto->state)
+    proto_destroy(server_proto);
 
   if (output_buffer)
     evbuffer_free(output_buffer);
@@ -166,17 +189,28 @@ test_proto_transfer(void *data)
 static void
 test_proto_splitted_handshake(void *data)
 {
+  obfs2_state_t *client_state = NULL;
+  obfs2_state_t *server_state = NULL;
+
   struct evbuffer *output_buffer = NULL;
   struct evbuffer *dummy_buffer = NULL;
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  protocol_state_t *client_state;
-  protocol_state_t *server_state;
-  client_state = protocol_state_new(1);
-  server_state = protocol_state_new(0);
-  tt_assert(client_state);
-  tt_assert(server_state);
+  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+
+  int initiator = 1;
+  int no_initiator = 0;
+  client_proto->state = proto_init(client_proto, &initiator);
+  server_proto->state = proto_init(server_proto, &no_initiator);
+  tt_assert(client_proto);
+  tt_assert(server_proto);
+  tt_assert(client_proto->state);
+  tt_assert(server_proto->state);
+
+  client_state = client_proto->state;
+  server_state = server_proto->state;
 
   uint32_t magic = htonl(OBFUSCATE_MAGIC_VALUE);
   uint32_t plength1, plength1_msg1, plength1_msg2, send_plength1;
@@ -208,7 +242,7 @@ test_proto_splitted_handshake(void *data)
   evbuffer_add(output_buffer, msgclient_1, OBFUSCATE_SEED_LENGTH+8+plength1_msg1);
 
   /* Server receives handshake part 1 */
-  tt_int_op(0, <=, proto_recv(server_state, output_buffer, dummy_buffer));
+  tt_int_op(0, <=, proto_recv(server_proto, output_buffer, dummy_buffer));
 
   tt_assert(server_state->state == ST_WAIT_FOR_PADDING);
 
@@ -220,7 +254,7 @@ test_proto_splitted_handshake(void *data)
   evbuffer_add(output_buffer, msgclient_2, plength1_msg2);
 
   /* Server receives handshake part 2 */
-  tt_int_op(0, <=, proto_recv(server_state, output_buffer, dummy_buffer));
+  tt_int_op(0, <=, proto_recv(server_proto, output_buffer, dummy_buffer));
 
   tt_assert(server_state->state == ST_OPEN);
 
@@ -249,7 +283,7 @@ test_proto_splitted_handshake(void *data)
   evbuffer_add(output_buffer, msgserver_1, OBFUSCATE_SEED_LENGTH+8);
 
   /* Client receives handshake part 1 */
-  tt_int_op(0, <=, proto_recv(client_state, output_buffer, dummy_buffer));
+  tt_int_op(0, <=, proto_recv(client_proto, output_buffer, dummy_buffer));
 
   tt_assert(client_state->state == ST_WAIT_FOR_PADDING);
 
@@ -261,7 +295,7 @@ test_proto_splitted_handshake(void *data)
   evbuffer_add(output_buffer, msgserver_2, plength2);
 
   /* Client receives handshake part 2 */
-  tt_int_op(0, <=, proto_recv(client_state, output_buffer, dummy_buffer));
+  tt_int_op(0, <=, proto_recv(client_proto, output_buffer, dummy_buffer));
 
   tt_assert(client_state->state == ST_OPEN);
 
@@ -278,9 +312,9 @@ test_proto_splitted_handshake(void *data)
 
  end:
   if (client_state)
-    protocol_state_free(client_state);
+    proto_destroy(client_proto);
   if (server_state)
-    protocol_state_free(server_state);
+    proto_destroy(server_proto);
 
   if (output_buffer)
     evbuffer_free(output_buffer);
@@ -295,17 +329,28 @@ test_proto_splitted_handshake(void *data)
 static void
 test_proto_wrong_handshake_magic(void *data)
 {
+  obfs2_state_t *client_state = NULL;
+  obfs2_state_t *server_state = NULL;
+
   struct evbuffer *output_buffer = NULL;
   struct evbuffer *dummy_buffer = NULL;
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
 
-  protocol_state_t *client_state;
-  protocol_state_t *server_state;
-  client_state = protocol_state_new(1);
-  server_state = protocol_state_new(0);
-  tt_assert(client_state);
-  tt_assert(server_state);
+  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+
+  int initiator = 1;
+  int no_initiator = 0;
+  client_proto->state = proto_init(client_proto, &initiator);
+  server_proto->state = proto_init(server_proto, &no_initiator);
+  tt_assert(client_proto);
+  tt_assert(server_proto);
+  tt_assert(client_proto->state);
+  tt_assert(server_proto->state);
+
+  client_state = client_proto->state;
+  server_state = server_proto->state;
 
   uint32_t wrong_magic = 0xD15EA5E;
 
@@ -328,84 +373,21 @@ test_proto_wrong_handshake_magic(void *data)
 
   evbuffer_add(output_buffer, msg, OBFUSCATE_SEED_LENGTH+8+plength);
 
-  tt_int_op(-1, ==, proto_recv(server_state, output_buffer, dummy_buffer));
-
-  tt_assert(server_state->state == ST_WAIT_FOR_KEY);
-
- end:
-  if (client_state)
-    protocol_state_free(client_state);
-  if (server_state)
-    protocol_state_free(server_state);
-
-  if (output_buffer)
-    evbuffer_free(output_buffer);
-  if (dummy_buffer)
-    evbuffer_free(dummy_buffer);
-}
-
-#if 0
-/*
-  Erroneous handshake test:
-  Normal plength field but actual padding larger than
-  OBFUSCATE_MAX_PADDING.
-
-  XXXX This won't actually fail.  If we send extra padding, it gets treated as
-  part of the message.  Decrypting it will give odd results, but this protocol
-  doesn't actually get you integrity.
-*/
-static void
-test_proto_wrong_handshake_padding(void *data)
-{
-  struct evbuffer *output_buffer = NULL;
-  struct evbuffer *dummy_buffer = NULL;
-  output_buffer = evbuffer_new();
-  dummy_buffer = evbuffer_new();
-
-  protocol_state_t *client_state;
-  protocol_state_t *server_state;
-  client_state = protocol_state_new(1);
-  server_state = protocol_state_new(0);
-  tt_assert(client_state);
-  tt_assert(server_state);
-
-  uchar bigmsg[OBFUSCATE_MAX_PADDING + 1 + OBFUSCATE_SEED_LENGTH + 8];
-  uint32_t actual_plength, fake_plength, send_plength;
-
-  const uchar *seed;
-  seed = client_state->initiator_seed;
-  uint32_t magic = htonl(OBFUSCATE_MAGIC_VALUE);
-
-  actual_plength = OBFUSCATE_MAX_PADDING + 1U;
-  fake_plength = 666U;
-  send_plength = htonl(fake_plength);
-
-  memcpy(bigmsg, seed, OBFUSCATE_SEED_LENGTH);
-  memcpy(bigmsg+OBFUSCATE_SEED_LENGTH, &magic, 4);
-  memcpy(bigmsg+OBFUSCATE_SEED_LENGTH+4, &send_plength, 4);
-  tt_int_op(0, >=, random_bytes(bigmsg+OBFUSCATE_SEED_LENGTH+8, actual_plength));
-
-  stream_crypt(client_state->send_padding_crypto,
-               bigmsg+OBFUSCATE_SEED_LENGTH, 8+actual_plength);
-
-  evbuffer_add(output_buffer, bigmsg, OBFUSCATE_SEED_LENGTH+8+actual_plength);
-
-  tt_int_op(-1, ==, proto_recv(server_state, output_buffer, dummy_buffer));
+  tt_int_op(-1, ==, proto_recv(server_proto, output_buffer, dummy_buffer));
 
   tt_assert(server_state->state == ST_WAIT_FOR_KEY);
 
  end:
   if (client_state)
-    protocol_state_free(client_state);
+    proto_destroy(client_proto);
   if (server_state)
-    protocol_state_free(server_state);
+    proto_destroy(server_proto);
 
   if (output_buffer)
     evbuffer_free(output_buffer);
   if (dummy_buffer)
     evbuffer_free(dummy_buffer);
 }
-#endif
 
 /* Erroneous handshake test:
    plength field larger than OBFUSCATE_MAX_PADDING
@@ -413,17 +395,26 @@ test_proto_wrong_handshake_padding(void *data)
 static void
 test_proto_wrong_handshake_plength(void *data)
 {
+  obfs2_state_t *client_state = NULL;
+  obfs2_state_t *server_state = NULL;
   struct evbuffer *output_buffer = NULL;
   struct evbuffer *dummy_buffer = NULL;
   output_buffer = evbuffer_new();
   dummy_buffer = evbuffer_new();
-
-  protocol_state_t *client_state;
-  protocol_state_t *server_state;
-  client_state = protocol_state_new(1);
-  server_state = protocol_state_new(0);
-  tt_assert(client_state);
-  tt_assert(server_state);
+  
+  struct protocol_t *client_proto = set_up_protocol(BRL_PROTOCOL);
+  struct protocol_t *server_proto = set_up_protocol(BRL_PROTOCOL);
+  int initiator = 1;
+  int no_initiator = 0;
+  client_proto->state = proto_init(client_proto, &initiator);
+  server_proto->state = proto_init(server_proto, &no_initiator);
+  tt_assert(client_proto);
+  tt_assert(server_proto);
+  tt_assert(client_proto->state);
+  tt_assert(server_proto->state);
+
+  client_state = client_proto->state;
+  server_state = server_proto->state;
 
   uchar msg[OBFUSCATE_MAX_PADDING + OBFUSCATE_SEED_LENGTH + 8 + 1];
   uint32_t magic = htonl(OBFUSCATE_MAGIC_VALUE);
@@ -444,15 +435,15 @@ test_proto_wrong_handshake_plength(void *data)
 
   evbuffer_add(output_buffer, msg, OBFUSCATE_SEED_LENGTH+8+plength);
 
-  tt_int_op(-1, ==, proto_recv(server_state, output_buffer, dummy_buffer));
+  tt_int_op(-1, ==, proto_recv(server_proto, output_buffer, dummy_buffer));
 
   tt_assert(server_state->state == ST_WAIT_FOR_KEY);
 
  end:
   if (client_state)
-    protocol_state_free(client_state);
+    proto_destroy(client_proto);
   if (server_state)
-    protocol_state_free(server_state);
+    proto_destroy(server_proto);
 
   if (output_buffer)
     evbuffer_free(output_buffer);
@@ -476,4 +467,3 @@ struct testcase_t protocol_tests[] = {
   T(wrong_handshake_plength, 0),
   END_OF_TESTCASES
 };
-#endif





More information about the tor-commits mailing list