aboutsummaryrefslogtreecommitdiff
path: root/src/test/test_socks.c
diff options
context:
space:
mode:
authorrl1987 <rl1987@sdf.lonestar.org>2019-01-26 10:55:53 +0200
committerrl1987 <rl1987@sdf.lonestar.org>2019-01-26 11:06:33 +0200
commit790150e57a98221fbb4cfdc5c34b3395808416b4 (patch)
treeb7fc50e05c424374ba1252c271584cb0dadad136 /src/test/test_socks.c
parent712a622fcecd43a7a50c7b35a9811f1210aeadb8 (diff)
downloadtor-790150e57a98221fbb4cfdc5c34b3395808416b4.tar.gz
tor-790150e57a98221fbb4cfdc5c34b3395808416b4.zip
Allow empty username/password in SOCKS5 username/password auth message
Diffstat (limited to 'src/test/test_socks.c')
-rw-r--r--src/test/test_socks.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/test/test_socks.c b/src/test/test_socks.c
index 2832d42fc1..783f4726ee 100644
--- a/src/test/test_socks.c
+++ b/src/test/test_socks.c
@@ -479,6 +479,44 @@ test_socks_5_authenticate(void *ptr)
;
}
+/** Perform SOCKS 5 authentication with empty username/password fields.
+ * Technically this violates RfC 1929, but some client software will send
+ * this kind of message to Tor.
+ * */
+static void
+test_socks_5_authenticate_empty_user_pass(void *ptr)
+{
+ SOCKS_TEST_INIT();
+
+ /* SOCKS 5 Negotiate username/password authentication */
+ ADD_DATA(buf, "\x05\x01\x02");
+
+ tt_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
+
+ /* SOCKS 5 Send username/password auth message with empty user/pass fields */
+ ADD_DATA(buf, "\x01\x00\x00");
+ tt_assert(!fetch_from_buf_socks(buf, socks,
+ get_options()->TestSocks,
+ get_options()->SafeSocks));
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(1,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
+
+ tt_int_op(0,OP_EQ, socks->usernamelen);
+ tt_int_op(0,OP_EQ, socks->passwordlen);
+
+ done:
+ ;
+}
/** Perform SOCKS 5 authentication and send data all in one go */
static void
test_socks_5_authenticate_with_data(void *ptr)
@@ -1035,6 +1073,7 @@ struct testcase_t socks_tests[] = {
SOCKSENT(5_auth_unsupported_version),
SOCKSENT(5_auth_before_negotiation),
SOCKSENT(5_authenticate),
+ SOCKSENT(5_authenticate_empty_user_pass),
SOCKSENT(5_authenticate_with_data),
SOCKSENT(5_malformed_commands),
SOCKSENT(5_bad_arguments),