[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [obfsproxy/master] Added IPv6 SOCKS5 unit tests



commit aefb1ef5ecf0cd522aafc91ac93834dfa05ff70e
Author: George Kadianakis <desnacked@xxxxxxxxx>
Date:   Mon May 23 17:41:53 2011 +0200

    Added IPv6 SOCKS5 unit tests
---
 src/test/unittest_socks.c |  141 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 106 insertions(+), 35 deletions(-)

diff --git a/src/test/unittest_socks.c b/src/test/unittest_socks.c
index 017e624..9e971d8 100644
--- a/src/test/unittest_socks.c
+++ b/src/test/unittest_socks.c
@@ -13,8 +13,14 @@
 #include "../util.h"
 #include "../protocols/obfs2.h"
 
+/**
+   This unit test tests the negotiation phase of the SOCKS5 protocol.
+   It sends broken 'Method Negotiation Packets' and it verifies that
+   the SOCKS server detected the errors. It also sends some correct
+   packets and it expects the server to like them.
+*/
 static void
-test_socks_send_negotiation(void *data)
+test_socks_socks5_send_negotiation(void *data)
 {
   struct evbuffer *dest = NULL;
   struct evbuffer *source = NULL;
@@ -120,6 +126,13 @@ test_socks_send_negotiation(void *data)
     evbuffer_free(dest);
 }
 
+/**
+   This unit test tests the 'Client Request' phase of the SOCKS5
+   protocol.
+   It sends broken 'Client Request' packets and it verifies that
+   the SOCKS server detected the errors. It also sends some correct
+   packets and it expects the server to like them.
+*/
 static void
 test_socks_socks5_request(void *data)
 {
@@ -133,7 +146,8 @@ test_socks_socks5_request(void *data)
   state = socks_state_new();
   tt_assert(state);
 
-  const uint32_t addr = htonl(0x7f000001); /* 127.0.0.1 */
+  const uint32_t addr_ipv4 = htonl(0x7f000001); /* 127.0.0.1 */
+  const uint8_t addr_ipv6[16] = {0,13,0,1,0,5,0,14,0,10,0,5,0,14,0,0}; /* d:1:5:e:a:5:e:0 */
   const uint16_t port = htons(80);    /* 80 */
 
   /* First test:
@@ -143,7 +157,7 @@ test_socks_socks5_request(void *data)
   req1[0] = 1;
   req1[1] = 0;
   req1[2] = 1;
-  memcpy(req1+3,&addr,4);
+  memcpy(req1+3,&addr_ipv4,4);
 
   evbuffer_add(source, "\x05", 1);
   evbuffer_add(source, req1, 7);
@@ -160,7 +174,7 @@ test_socks_socks5_request(void *data)
   req2[1] = 0;
   req2[2] = 3;
   req2[3] = 15;
-  memcpy(req1+4,&addr,3);
+  memcpy(req1+4,&addr_ipv4,3);
 
   evbuffer_add(source, "\x05", 1);
   evbuffer_add(source, req2, 7);
@@ -171,12 +185,12 @@ test_socks_socks5_request(void *data)
   tt_int_op(0, ==, evbuffer_drain(source, buffer_len));
 
   /* Third test:
-     Correct IPV4 req packet. */
+     Correct IPv4 req packet. */
   uchar req3[9];
   req3[0] = 1;
   req3[1] = 0;
   req3[2] = 1;
-  memcpy(req3+3,&addr,4);
+  memcpy(req3+3,&addr_ipv4,4);
   memcpy(req3+7,&port,2);
 
   evbuffer_add(source, "\x05", 1);
@@ -190,46 +204,65 @@ test_socks_socks5_request(void *data)
   tt_int_op(0, ==, evbuffer_drain(source, buffer_len));
 
   /* Fourth test:
-     Correct FQDN req packet. */
-  const char fqdn[17] = "www.test.example";
+     Correct IPv6 req packet. */
   uchar req4[24];
   req4[0] = 5;
   req4[1] = 1;
   req4[2] = 0;
-  req4[3] = 3;
-  req4[4] = strlen(fqdn);
-  strcpy((char *)req4+5,fqdn);
-  memcpy(req4+5+strlen(fqdn),&port,2);
+  req4[3] = SOCKS5_ATYP_IPV6;
+  memcpy(req4+4,&addr_ipv6,16);
+  memcpy(req4+20,&port,2);
 
-  evbuffer_add(source, req4, 24);
+  evbuffer_add(source,req4,22);
   tt_int_op(1, ==, socks5_handle_request(source,&pr1));
-  tt_assert(strcmp(pr1.addr, "www.test.example") == 0);
+  tt_str_op(pr1.addr, ==, "d:1:5:e:a:5:e:0");
   tt_int_op(pr1.port, ==, 80);
 
-  /* Third test:
-     Small request packet */
-  uchar req5[3];
+  /* emptying source buffer before next test  */
+  buffer_len = evbuffer_get_length(source);
+  tt_int_op(0, ==, evbuffer_drain(source, buffer_len));
+
+  /* Fifth test:
+     Correct FQDN req packet. */
+  const char fqdn[17] = "www.test.example";
+  uchar req5[24];
   req5[0] = 5;
   req5[1] = 1;
   req5[2] = 0;
+  req5[3] = 3;
+  req5[4] = strlen(fqdn);
+  strcpy((char *)req5+5,fqdn);
+  memcpy(req5+5+strlen(fqdn),&port,2);
+
+  evbuffer_add(source, req5, 24);
+  tt_int_op(1, ==, socks5_handle_request(source,&pr1));
+  tt_assert(strcmp(pr1.addr, "www.test.example") == 0);
+  tt_int_op(pr1.port, ==, 80);
 
-  evbuffer_add(source,req5,3);
+  /* Sixth test:
+     Small request packet */
+  uchar req6[3];
+  req6[0] = 5;
+  req6[1] = 1;
+  req6[2] = 0;
+
+  evbuffer_add(source,req6,3);
   tt_int_op(0, ==, socks5_handle_request(source,&pr1));
 
   /* emptying source buffer before next test  */
   buffer_len = evbuffer_get_length(source);
   tt_int_op(0, ==, evbuffer_drain(source, buffer_len));
 
-  /* Fourth test:
+  /* Seventh test:
      Wrong Reserved field */
-  uchar req6[5];
-  req6[0] = 5;
-  req6[1] = 1;
-  req6[2] = 1;
-  req6[3] = 42;
-  req6[4] = 42;
-
-  evbuffer_add(source,req6,5);
+  uchar req7[5];
+  req7[0] = 5;
+  req7[1] = 1;
+  req7[2] = 1;
+  req7[3] = 42;
+  req7[4] = 42;
+
+  evbuffer_add(source,req7,5);
   tt_int_op(-1, ==, socks5_handle_request(source,&pr1));
 
   /* emptying source buffer before next test  */
@@ -246,6 +279,12 @@ test_socks_socks5_request(void *data)
     evbuffer_free(dest);
 }
 
+/**
+   This unit test tests the 'Server reply' phase of the SOCKS5
+   protocol.  
+   We ask the server to send us 'Server reply' packets to different
+   requests and with different status codes, and check if the server
+   composed the packets well. */
 static void
 test_socks_socks5_request_reply(void *data)
 {
@@ -260,6 +299,10 @@ test_socks_socks5_request_reply(void *data)
   strcpy(state->parsereq.addr, "127.0.0.1");
   state->parsereq.port = 7357;
 
+  /* First test:
+     We ask the server to send us a reply on an IPv4 request with
+     succesful status.
+  */
   tt_int_op(1, ==, socks5_send_reply(reply_dest,
                                      state, SOCKS5_REP_SUCCESS));
 
@@ -276,23 +319,51 @@ test_socks_socks5_request_reply(void *data)
   size_t buffer_len = evbuffer_get_length(reply_dest);
   tt_int_op(0, ==, evbuffer_drain(reply_dest, buffer_len));
 
+  /* Second test:
+     We ask the server to send us a reply on an IPv6 request with 
+     succesful status.
+  */
+  state->parsereq.af = AF_INET6;
+  strcpy(state->parsereq.addr, "d:1:5:e:a:5:e:0");
+  
+  tt_int_op(1, ==, socks5_send_reply(reply_dest,
+                                     state, SOCKS5_REP_SUCCESS));
+
+  uchar rep2[255];
+  evbuffer_remove(reply_dest,rep2,255);
+  
+  tt_assert(rep2[3] = SOCKS5_ATYP_IPV6);
+  /* Test returned address against inet_pton(d:1:5:e:a:5:e:0) */
+  tt_int_op(0, ==, memcmp(rep2+4,
+                          "\x00\x0d\x00\x01\x00\x05\x00\x0e\x00"
+                          "\x0a\x00\x05\x00\x0e\x00\x00",  
+                          16));
+  tt_int_op(0, ==, memcmp(rep2+4+16, "\x1c\xbd", 2));
+
+  /* emptying reply_dest buffer before next test  */
+  buffer_len = evbuffer_get_length(reply_dest);
+  tt_int_op(0, ==, evbuffer_drain(reply_dest, buffer_len));
+
+  /* Third test :
+     We ask the server to send us a reply on an FQDN request with
+     failure status.
+  */
   const char *fqdn = "www.test.example";
   state->parsereq.af = AF_UNSPEC;
   strcpy(state->parsereq.addr, fqdn);
-  state->parsereq.port = 7357;
 
   tt_int_op(-1, ==, socks5_send_reply(reply_dest,
                                      state, SOCKS5_REP_FAIL));
 
-  uchar rep2[255];
-  evbuffer_remove(reply_dest,rep2,255);
+  uchar rep3[255];
+  evbuffer_remove(reply_dest,rep3,255);
 
-  tt_assert(rep2[3] == SOCKS5_ATYP_FQDN);
-  tt_assert(rep2[4] == strlen(fqdn));
+  tt_assert(rep3[3] == SOCKS5_ATYP_FQDN);
+  tt_assert(rep3[4] == strlen(fqdn));
   /* check fqdn */
-  tt_int_op(0, ==, memcmp(rep2+5,fqdn,strlen(fqdn)));
+  tt_int_op(0, ==, memcmp(rep3+5,fqdn,strlen(fqdn)));
   /* check port */
-  tt_int_op(0, ==, memcmp(rep2+5+strlen(fqdn),"\x1c\xbd",2));
+  tt_int_op(0, ==, memcmp(rep3+5+strlen(fqdn),"\x1c\xbd",2));
 
  end:
   if (state)
@@ -307,7 +378,7 @@ test_socks_socks5_request_reply(void *data)
   { #name, test_socks_##name, (flags), NULL, NULL }
 
 struct testcase_t socks_tests[] = {
-  T(send_negotiation, 0),
+  T(socks5_send_negotiation, 0),
   T(socks5_request, 0),
   T(socks5_request_reply, 0),
   END_OF_TESTCASES



_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits