test_socks.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. /* Copyright (c) 2001-2004, Roger Dingledine.
  2. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
  3. * Copyright (c) 2007-2017, The Tor Project, Inc. */
  4. /* See LICENSE for licensing information */
  5. #include "or.h"
  6. #include "buffers.h"
  7. #include "config.h"
  8. #include "test.h"
  9. typedef struct socks_test_data_t {
  10. socks_request_t *req;
  11. buf_t *buf;
  12. } socks_test_data_t;
  13. static void *
  14. socks_test_setup(const struct testcase_t *testcase)
  15. {
  16. socks_test_data_t *data = tor_malloc(sizeof(socks_test_data_t));
  17. (void)testcase;
  18. data->buf = buf_new_with_capacity(256);
  19. data->req = socks_request_new();
  20. config_register_addressmaps(get_options());
  21. return data;
  22. }
  23. static int
  24. socks_test_cleanup(const struct testcase_t *testcase, void *ptr)
  25. {
  26. socks_test_data_t *data = ptr;
  27. (void)testcase;
  28. buf_free(data->buf);
  29. socks_request_free(data->req);
  30. tor_free(data);
  31. return 1;
  32. }
  33. static const struct testcase_setup_t socks_setup = {
  34. socks_test_setup, socks_test_cleanup
  35. };
  36. #define SOCKS_TEST_INIT() \
  37. socks_test_data_t *testdata = ptr; \
  38. buf_t *buf = testdata->buf; \
  39. socks_request_t *socks = testdata->req;
  40. #define ADD_DATA(buf, s) \
  41. write_to_buf(s, sizeof(s)-1, buf)
  42. static void
  43. socks_request_clear(socks_request_t *socks)
  44. {
  45. tor_free(socks->username);
  46. tor_free(socks->password);
  47. memset(socks, 0, sizeof(socks_request_t));
  48. }
  49. /** Perform unsupported SOCKS 4 commands */
  50. static void
  51. test_socks_4_unsupported_commands(void *ptr)
  52. {
  53. SOCKS_TEST_INIT();
  54. /* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */
  55. ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00");
  56. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  57. get_options()->SafeSocks),
  58. OP_EQ, -1);
  59. tt_int_op(4,OP_EQ, socks->socks_version);
  60. tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
  61. done:
  62. ;
  63. }
  64. /** Perform supported SOCKS 4 commands */
  65. static void
  66. test_socks_4_supported_commands(void *ptr)
  67. {
  68. SOCKS_TEST_INIT();
  69. tt_int_op(0,OP_EQ, buf_datalen(buf));
  70. /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */
  71. ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00");
  72. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  73. get_options()->SafeSocks),
  74. OP_EQ, 1);
  75. tt_int_op(4,OP_EQ, socks->socks_version);
  76. tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
  77. tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command);
  78. tt_str_op("2.2.2.3",OP_EQ, socks->address);
  79. tt_int_op(4370,OP_EQ, socks->port);
  80. tt_assert(socks->got_auth == 0);
  81. tt_assert(! socks->username);
  82. tt_int_op(0,OP_EQ, buf_datalen(buf));
  83. socks_request_clear(socks);
  84. /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/
  85. ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00");
  86. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  87. get_options()->SafeSocks),
  88. OP_EQ, 1);
  89. tt_int_op(4,OP_EQ, socks->socks_version);
  90. tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
  91. tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command);
  92. tt_str_op("2.2.2.4",OP_EQ, socks->address);
  93. tt_int_op(4370,OP_EQ, socks->port);
  94. tt_assert(socks->got_auth == 1);
  95. tt_assert(socks->username);
  96. tt_int_op(2,OP_EQ, socks->usernamelen);
  97. tt_mem_op("me",OP_EQ, socks->username, 2);
  98. tt_int_op(0,OP_EQ, buf_datalen(buf));
  99. socks_request_clear(socks);
  100. /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */
  101. ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00");
  102. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  103. get_options()->SafeSocks),
  104. OP_EQ, 1);
  105. tt_int_op(4,OP_EQ, socks->socks_version);
  106. tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
  107. tt_str_op("torproject.org",OP_EQ, socks->address);
  108. tt_int_op(0,OP_EQ, buf_datalen(buf));
  109. done:
  110. ;
  111. }
  112. /** Perform unsupported SOCKS 5 commands */
  113. static void
  114. test_socks_5_unsupported_commands(void *ptr)
  115. {
  116. SOCKS_TEST_INIT();
  117. /* SOCKS 5 Send unsupported BIND [02] command */
  118. ADD_DATA(buf, "\x05\x02\x00\x01");
  119. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  120. get_options()->SafeSocks),OP_EQ, 0);
  121. tt_int_op(0,OP_EQ, buf_datalen(buf));
  122. tt_int_op(5,OP_EQ, socks->socks_version);
  123. tt_int_op(2,OP_EQ, socks->replylen);
  124. tt_int_op(5,OP_EQ, socks->reply[0]);
  125. tt_int_op(0,OP_EQ, socks->reply[1]);
  126. ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01");
  127. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  128. get_options()->SafeSocks),OP_EQ, -1);
  129. tt_int_op(5,OP_EQ,socks->socks_version);
  130. tt_int_op(10,OP_EQ,socks->replylen);
  131. tt_int_op(5,OP_EQ,socks->reply[0]);
  132. tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
  133. tt_int_op(1,OP_EQ,socks->reply[3]);
  134. buf_clear(buf);
  135. socks_request_clear(socks);
  136. /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */
  137. ADD_DATA(buf, "\x05\x02\x00\x01");
  138. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  139. get_options()->SafeSocks),OP_EQ, 0);
  140. tt_int_op(5,OP_EQ, socks->socks_version);
  141. tt_int_op(2,OP_EQ, socks->replylen);
  142. tt_int_op(5,OP_EQ, socks->reply[0]);
  143. tt_int_op(0,OP_EQ, socks->reply[1]);
  144. ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01");
  145. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  146. get_options()->SafeSocks),OP_EQ, -1);
  147. tt_int_op(5,OP_EQ,socks->socks_version);
  148. tt_int_op(10,OP_EQ,socks->replylen);
  149. tt_int_op(5,OP_EQ,socks->reply[0]);
  150. tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
  151. tt_int_op(1,OP_EQ,socks->reply[3]);
  152. done:
  153. ;
  154. }
  155. /** Perform supported SOCKS 5 commands */
  156. static void
  157. test_socks_5_supported_commands(void *ptr)
  158. {
  159. SOCKS_TEST_INIT();
  160. /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
  161. ADD_DATA(buf, "\x05\x01\x00");
  162. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  163. get_options()->SafeSocks),OP_EQ, 0);
  164. tt_int_op(5,OP_EQ, socks->socks_version);
  165. tt_int_op(2,OP_EQ, socks->replylen);
  166. tt_int_op(5,OP_EQ, socks->reply[0]);
  167. tt_int_op(0,OP_EQ, socks->reply[1]);
  168. ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
  169. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  170. get_options()->SafeSocks),OP_EQ, 1);
  171. tt_str_op("2.2.2.2",OP_EQ, socks->address);
  172. tt_int_op(4369,OP_EQ, socks->port);
  173. tt_int_op(0,OP_EQ, buf_datalen(buf));
  174. socks_request_clear(socks);
  175. /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */
  176. ADD_DATA(buf, "\x05\x01\x00");
  177. ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11");
  178. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  179. get_options()->SafeSocks),OP_EQ, 1);
  180. tt_int_op(5,OP_EQ, socks->socks_version);
  181. tt_int_op(2,OP_EQ, socks->replylen);
  182. tt_int_op(5,OP_EQ, socks->reply[0]);
  183. tt_int_op(0,OP_EQ, socks->reply[1]);
  184. tt_str_op("torproject.org",OP_EQ, socks->address);
  185. tt_int_op(4369,OP_EQ, socks->port);
  186. tt_int_op(0,OP_EQ, buf_datalen(buf));
  187. socks_request_clear(socks);
  188. /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */
  189. ADD_DATA(buf, "\x05\x01\x00");
  190. ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02");
  191. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  192. get_options()->SafeSocks),
  193. OP_EQ, 1);
  194. tt_int_op(5,OP_EQ, socks->socks_version);
  195. tt_int_op(2,OP_EQ, socks->replylen);
  196. tt_int_op(5,OP_EQ, socks->reply[0]);
  197. tt_int_op(0,OP_EQ, socks->reply[1]);
  198. tt_str_op("torproject.org",OP_EQ, socks->address);
  199. tt_int_op(0,OP_EQ, buf_datalen(buf));
  200. socks_request_clear(socks);
  201. /* SOCKS 5 Should NOT reject RESOLVE [F0] request for IPv4 address
  202. * string if SafeSocks is enabled. */
  203. ADD_DATA(buf, "\x05\x01\x00");
  204. ADD_DATA(buf, "\x05\xF0\x00\x03\x07");
  205. ADD_DATA(buf, "8.8.8.8");
  206. ADD_DATA(buf, "\x11\x11");
  207. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),
  208. OP_EQ, 1);
  209. tt_str_op("8.8.8.8", OP_EQ, socks->address);
  210. tt_int_op(4369, OP_EQ, socks->port);
  211. tt_int_op(0, OP_EQ, buf_datalen(buf));
  212. socks_request_clear(socks);
  213. /* SOCKS 5 should NOT reject RESOLVE [F0] reject for IPv6 address
  214. * string if SafeSocks is enabled. */
  215. ADD_DATA(buf, "\x05\x01\x00");
  216. ADD_DATA(buf, "\x05\xF0\x00\x03\x27");
  217. ADD_DATA(buf, "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
  218. ADD_DATA(buf, "\x01\x02");
  219. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),
  220. OP_EQ, -1);
  221. tt_str_op("2001:0db8:85a3:0000:0000:8a2e:0370:7334", OP_EQ, socks->address);
  222. tt_int_op(258, OP_EQ, socks->port);
  223. tt_int_op(0, OP_EQ, buf_datalen(buf));
  224. socks_request_clear(socks);
  225. /* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */
  226. ADD_DATA(buf, "\x05\x01\x00");
  227. ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03");
  228. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  229. get_options()->SafeSocks),
  230. OP_EQ, 1);
  231. tt_int_op(5,OP_EQ, socks->socks_version);
  232. tt_int_op(2,OP_EQ, socks->replylen);
  233. tt_int_op(5,OP_EQ, socks->reply[0]);
  234. tt_int_op(0,OP_EQ, socks->reply[1]);
  235. tt_str_op("2.2.2.5",OP_EQ, socks->address);
  236. tt_int_op(0,OP_EQ, buf_datalen(buf));
  237. done:
  238. ;
  239. }
  240. /** Perform SOCKS 5 authentication */
  241. static void
  242. test_socks_5_no_authenticate(void *ptr)
  243. {
  244. SOCKS_TEST_INIT();
  245. /*SOCKS 5 No Authentication */
  246. ADD_DATA(buf,"\x05\x01\x00");
  247. tt_assert(!fetch_from_buf_socks(buf, socks,
  248. get_options()->TestSocks,
  249. get_options()->SafeSocks));
  250. tt_int_op(2,OP_EQ, socks->replylen);
  251. tt_int_op(5,OP_EQ, socks->reply[0]);
  252. tt_int_op(SOCKS_NO_AUTH,OP_EQ, socks->reply[1]);
  253. tt_int_op(0,OP_EQ, buf_datalen(buf));
  254. /*SOCKS 5 Send username/password anyway - pretend to be broken */
  255. ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01");
  256. tt_assert(!fetch_from_buf_socks(buf, socks,
  257. get_options()->TestSocks,
  258. get_options()->SafeSocks));
  259. tt_int_op(5,OP_EQ, socks->socks_version);
  260. tt_int_op(2,OP_EQ, socks->replylen);
  261. tt_int_op(1,OP_EQ, socks->reply[0]);
  262. tt_int_op(0,OP_EQ, socks->reply[1]);
  263. tt_int_op(2,OP_EQ, socks->usernamelen);
  264. tt_int_op(2,OP_EQ, socks->passwordlen);
  265. tt_mem_op("\x01\x01",OP_EQ, socks->username, 2);
  266. tt_mem_op("\x01\x01",OP_EQ, socks->password, 2);
  267. done:
  268. ;
  269. }
  270. /** Perform SOCKS 5 authentication */
  271. static void
  272. test_socks_5_authenticate(void *ptr)
  273. {
  274. SOCKS_TEST_INIT();
  275. /* SOCKS 5 Negotiate username/password authentication */
  276. ADD_DATA(buf, "\x05\x01\x02");
  277. tt_assert(!fetch_from_buf_socks(buf, socks,
  278. get_options()->TestSocks,
  279. get_options()->SafeSocks));
  280. tt_int_op(2,OP_EQ, socks->replylen);
  281. tt_int_op(5,OP_EQ, socks->reply[0]);
  282. tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]);
  283. tt_int_op(5,OP_EQ, socks->socks_version);
  284. tt_int_op(0,OP_EQ, buf_datalen(buf));
  285. /* SOCKS 5 Send username/password */
  286. ADD_DATA(buf, "\x01\x02me\x08mypasswd");
  287. tt_assert(!fetch_from_buf_socks(buf, socks,
  288. get_options()->TestSocks,
  289. get_options()->SafeSocks));
  290. tt_int_op(5,OP_EQ, socks->socks_version);
  291. tt_int_op(2,OP_EQ, socks->replylen);
  292. tt_int_op(1,OP_EQ, socks->reply[0]);
  293. tt_int_op(0,OP_EQ, socks->reply[1]);
  294. tt_int_op(2,OP_EQ, socks->usernamelen);
  295. tt_int_op(8,OP_EQ, socks->passwordlen);
  296. tt_mem_op("me",OP_EQ, socks->username, 2);
  297. tt_mem_op("mypasswd",OP_EQ, socks->password, 8);
  298. done:
  299. ;
  300. }
  301. /** Perform SOCKS 5 authentication and send data all in one go */
  302. static void
  303. test_socks_5_authenticate_with_data(void *ptr)
  304. {
  305. SOCKS_TEST_INIT();
  306. /* SOCKS 5 Negotiate username/password authentication */
  307. ADD_DATA(buf, "\x05\x01\x02");
  308. tt_assert(!fetch_from_buf_socks(buf, socks,
  309. get_options()->TestSocks,
  310. get_options()->SafeSocks));
  311. tt_int_op(2,OP_EQ, socks->replylen);
  312. tt_int_op(5,OP_EQ, socks->reply[0]);
  313. tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]);
  314. tt_int_op(5,OP_EQ, socks->socks_version);
  315. tt_int_op(0,OP_EQ, buf_datalen(buf));
  316. /* SOCKS 5 Send username/password */
  317. /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
  318. ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
  319. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  320. get_options()->SafeSocks),
  321. OP_EQ, 1);
  322. tt_int_op(5,OP_EQ, socks->socks_version);
  323. tt_int_op(2,OP_EQ, socks->replylen);
  324. tt_int_op(1,OP_EQ, socks->reply[0]);
  325. tt_int_op(0,OP_EQ, socks->reply[1]);
  326. tt_str_op("2.2.2.2",OP_EQ, socks->address);
  327. tt_int_op(4369,OP_EQ, socks->port);
  328. tt_int_op(2,OP_EQ, socks->usernamelen);
  329. tt_int_op(3,OP_EQ, socks->passwordlen);
  330. tt_mem_op("me",OP_EQ, socks->username, 2);
  331. tt_mem_op("you",OP_EQ, socks->password, 3);
  332. done:
  333. ;
  334. }
  335. /** Perform SOCKS 5 authentication before method negotiated */
  336. static void
  337. test_socks_5_auth_before_negotiation(void *ptr)
  338. {
  339. SOCKS_TEST_INIT();
  340. /* SOCKS 5 Send username/password */
  341. ADD_DATA(buf, "\x01\x02me\x02me");
  342. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  343. get_options()->SafeSocks),
  344. OP_EQ, -1);
  345. tt_int_op(0,OP_EQ, socks->socks_version);
  346. tt_int_op(0,OP_EQ, socks->replylen);
  347. tt_int_op(0,OP_EQ, socks->reply[0]);
  348. tt_int_op(0,OP_EQ, socks->reply[1]);
  349. done:
  350. ;
  351. }
  352. /** Perform malformed SOCKS 5 commands */
  353. static void
  354. test_socks_5_malformed_commands(void *ptr)
  355. {
  356. SOCKS_TEST_INIT();
  357. /* XXX: Stringified address length > MAX_SOCKS_ADDR_LEN will never happen */
  358. /** SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369, with SafeSocks set
  359. */
  360. ADD_DATA(buf, "\x05\x01\x00");
  361. ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
  362. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),
  363. OP_EQ, -1);
  364. tt_int_op(5,OP_EQ,socks->socks_version);
  365. tt_int_op(10,OP_EQ,socks->replylen);
  366. tt_int_op(5,OP_EQ,socks->reply[0]);
  367. tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]);
  368. tt_int_op(1,OP_EQ,socks->reply[3]);
  369. buf_clear(buf);
  370. socks_request_clear(socks);
  371. /* SOCKS 5 Send RESOLVE_PTR [F1] for FQDN torproject.org */
  372. ADD_DATA(buf, "\x05\x01\x00");
  373. ADD_DATA(buf, "\x05\xF1\x00\x03\x0Etorproject.org\x11\x11");
  374. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  375. get_options()->SafeSocks),OP_EQ, -1);
  376. tt_int_op(5,OP_EQ,socks->socks_version);
  377. tt_int_op(10,OP_EQ,socks->replylen);
  378. tt_int_op(5,OP_EQ,socks->reply[0]);
  379. tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
  380. tt_int_op(1,OP_EQ,socks->reply[3]);
  381. buf_clear(buf);
  382. socks_request_clear(socks);
  383. /* XXX: len + 1 > MAX_SOCKS_ADDR_LEN (FQDN request) will never happen */
  384. /* SOCKS 5 Send CONNECT [01] to FQDN """"".com */
  385. ADD_DATA(buf, "\x05\x01\x00");
  386. ADD_DATA(buf, "\x05\x01\x00\x03\x09\"\"\"\"\".com\x11\x11");
  387. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  388. get_options()->SafeSocks),OP_EQ, -1);
  389. tt_int_op(5,OP_EQ,socks->socks_version);
  390. tt_int_op(10,OP_EQ,socks->replylen);
  391. tt_int_op(5,OP_EQ,socks->reply[0]);
  392. tt_int_op(SOCKS5_GENERAL_ERROR,OP_EQ,socks->reply[1]);
  393. tt_int_op(1,OP_EQ,socks->reply[3]);
  394. buf_clear(buf);
  395. socks_request_clear(socks);
  396. /* SOCKS 5 Send CONNECT [01] to address type 0x23 */
  397. ADD_DATA(buf, "\x05\x01\x00");
  398. ADD_DATA(buf, "\x05\x01\x00\x23\x02\x02\x02\x02\x11\x11");
  399. tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
  400. get_options()->SafeSocks),OP_EQ, -1);
  401. tt_int_op(5,OP_EQ,socks->socks_version);
  402. tt_int_op(10,OP_EQ,socks->replylen);
  403. tt_int_op(5,OP_EQ,socks->reply[0]);
  404. tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
  405. tt_int_op(1,OP_EQ,socks->reply[3]);
  406. done:
  407. ;
  408. }
  409. #define SOCKSENT(name) \
  410. { #name, test_socks_##name, TT_FORK, &socks_setup, NULL }
  411. struct testcase_t socks_tests[] = {
  412. SOCKSENT(4_unsupported_commands),
  413. SOCKSENT(4_supported_commands),
  414. SOCKSENT(5_unsupported_commands),
  415. SOCKSENT(5_supported_commands),
  416. SOCKSENT(5_no_authenticate),
  417. SOCKSENT(5_auth_before_negotiation),
  418. SOCKSENT(5_authenticate),
  419. SOCKSENT(5_authenticate_with_data),
  420. SOCKSENT(5_malformed_commands),
  421. END_OF_TESTCASES
  422. };