test_controller.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /* Copyright (c) 2015, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define CONTROL_PRIVATE
  4. #include "or.h"
  5. #include "control.h"
  6. #include "rendservice.h"
  7. #include "test.h"
  8. static void
  9. test_add_onion_helper_keyarg(void *arg)
  10. {
  11. crypto_pk_t *pk = NULL;
  12. crypto_pk_t *pk2 = NULL;
  13. const char *key_new_alg = NULL;
  14. char *key_new_blob = NULL;
  15. char *err_msg = NULL;
  16. char *encoded = NULL;
  17. char *arg_str = NULL;
  18. (void) arg;
  19. /* Test explicit RSA1024 key generation. */
  20. pk = add_onion_helper_keyarg("NEW:RSA1024", 0, &key_new_alg, &key_new_blob,
  21. &err_msg);
  22. tt_assert(pk);
  23. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  24. tt_assert(key_new_blob);
  25. tt_assert(!err_msg);
  26. /* Test "BEST" key generation (Assumes BEST = RSA1024). */
  27. crypto_pk_free(pk);
  28. tor_free(key_new_blob);
  29. pk = add_onion_helper_keyarg("NEW:BEST", 0, &key_new_alg, &key_new_blob,
  30. &err_msg);
  31. tt_assert(pk);
  32. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  33. tt_assert(key_new_blob);
  34. tt_assert(!err_msg);
  35. /* Test discarding the private key. */
  36. crypto_pk_free(pk);
  37. tor_free(key_new_blob);
  38. pk = add_onion_helper_keyarg("NEW:BEST", 1, &key_new_alg, &key_new_blob,
  39. &err_msg);
  40. tt_assert(pk);
  41. tt_assert(!key_new_alg);
  42. tt_assert(!key_new_blob);
  43. tt_assert(!err_msg);
  44. /* Test generating a invalid key type. */
  45. crypto_pk_free(pk);
  46. pk = add_onion_helper_keyarg("NEW:RSA512", 0, &key_new_alg, &key_new_blob,
  47. &err_msg);
  48. tt_assert(!pk);
  49. tt_assert(!key_new_alg);
  50. tt_assert(!key_new_blob);
  51. tt_assert(err_msg);
  52. /* Test loading a RSA1024 key. */
  53. tor_free(err_msg);
  54. pk = pk_generate(0);
  55. tt_int_op(0, OP_EQ, crypto_pk_base64_encode(pk, &encoded));
  56. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  57. pk2 = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  58. &err_msg);
  59. tt_assert(pk2);
  60. tt_assert(!key_new_alg);
  61. tt_assert(!key_new_blob);
  62. tt_assert(!err_msg);
  63. tt_assert(crypto_pk_cmp_keys(pk, pk2) == 0);
  64. /* Test loading a invalid key type. */
  65. tor_free(arg_str);
  66. crypto_pk_free(pk); pk = NULL;
  67. tor_asprintf(&arg_str, "RSA512:%s", encoded);
  68. pk = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  69. &err_msg);
  70. tt_assert(!pk);
  71. tt_assert(!key_new_alg);
  72. tt_assert(!key_new_blob);
  73. tt_assert(err_msg);
  74. /* Test loading a invalid key. */
  75. tor_free(arg_str);
  76. crypto_pk_free(pk); pk = NULL;
  77. tor_free(err_msg);
  78. encoded[strlen(encoded)/2] = '\0';
  79. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  80. pk = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  81. &err_msg);
  82. tt_assert(!pk);
  83. tt_assert(!key_new_alg);
  84. tt_assert(!key_new_blob);
  85. tt_assert(err_msg);
  86. done:
  87. crypto_pk_free(pk);
  88. crypto_pk_free(pk2);
  89. tor_free(key_new_blob);
  90. tor_free(err_msg);
  91. tor_free(encoded);
  92. tor_free(arg_str);
  93. }
  94. static void
  95. test_rend_service_parse_port_config(void *arg)
  96. {
  97. const char *sep = ",";
  98. rend_service_port_config_t *cfg = NULL;
  99. char *err_msg = NULL;
  100. (void)arg;
  101. /* Test "VIRTPORT" only. */
  102. cfg = rend_service_parse_port_config("80", sep, &err_msg);
  103. tt_assert(cfg);
  104. tt_assert(!err_msg);
  105. /* Test "VIRTPORT,TARGET" (Target is port). */
  106. rend_service_port_config_free(cfg);
  107. cfg = rend_service_parse_port_config("80,8080", sep, &err_msg);
  108. tt_assert(cfg);
  109. tt_assert(!err_msg);
  110. /* Test "VIRTPORT,TARGET" (Target is IPv4:port). */
  111. rend_service_port_config_free(cfg);
  112. cfg = rend_service_parse_port_config("80,192.0.2.1:8080", sep, &err_msg);
  113. tt_assert(cfg);
  114. tt_assert(!err_msg);
  115. /* Test "VIRTPORT,TARGET" (Target is IPv6:port). */
  116. rend_service_port_config_free(cfg);
  117. cfg = rend_service_parse_port_config("80,[2001:db8::1]:8080", sep, &err_msg);
  118. tt_assert(cfg);
  119. tt_assert(!err_msg);
  120. /* XXX: Someone should add tests for AF_UNIX targets if supported. */
  121. /* Test empty config. */
  122. rend_service_port_config_free(cfg);
  123. cfg = rend_service_parse_port_config("", sep, &err_msg);
  124. tt_assert(!cfg);
  125. tt_assert(err_msg);
  126. /* Test invalid port. */
  127. tor_free(err_msg);
  128. cfg = rend_service_parse_port_config("90001", sep, &err_msg);
  129. tt_assert(!cfg);
  130. tt_assert(err_msg);
  131. done:
  132. rend_service_port_config_free(cfg);
  133. tor_free(err_msg);
  134. }
  135. static void
  136. test_add_onion_helper_clientauth(void *arg)
  137. {
  138. rend_authorized_client_t *client = NULL;
  139. char *err_msg = NULL;
  140. int created = 0;
  141. (void)arg;
  142. /* Test "ClientName" only. */
  143. client = add_onion_helper_clientauth("alice", &created, &err_msg);
  144. tt_assert(client);
  145. tt_assert(created);
  146. tt_assert(!err_msg);
  147. rend_authorized_client_free(client);
  148. /* Test "ClientName:Blob" */
  149. client = add_onion_helper_clientauth("alice:475hGBHPlq7Mc0cRZitK/B",
  150. &created, &err_msg);
  151. tt_assert(client);
  152. tt_assert(!created);
  153. tt_assert(!err_msg);
  154. rend_authorized_client_free(client);
  155. /* Test invalid client names */
  156. client = add_onion_helper_clientauth("no*asterisks*allowed", &created,
  157. &err_msg);
  158. tt_assert(!client);
  159. tt_assert(err_msg);
  160. tor_free(err_msg);
  161. /* Test invalid auth cookie */
  162. client = add_onion_helper_clientauth("alice:12345", &created, &err_msg);
  163. tt_assert(!client);
  164. tt_assert(err_msg);
  165. tor_free(err_msg);
  166. /* Test invalid syntax */
  167. client = add_onion_helper_clientauth(":475hGBHPlq7Mc0cRZitK/B", &created,
  168. &err_msg);
  169. tt_assert(!client);
  170. tt_assert(err_msg);
  171. tor_free(err_msg);
  172. done:
  173. rend_authorized_client_free(client);
  174. tor_free(err_msg);
  175. }
  176. struct testcase_t controller_tests[] = {
  177. { "add_onion_helper_keyarg", test_add_onion_helper_keyarg, 0, NULL, NULL },
  178. { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0,
  179. NULL, NULL },
  180. { "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL,
  181. NULL },
  182. END_OF_TESTCASES
  183. };