test_controller.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. struct testcase_t controller_tests[] = {
  136. { "add_onion_helper_keyarg", test_add_onion_helper_keyarg, 0, NULL, NULL },
  137. { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0,
  138. NULL, NULL },
  139. END_OF_TESTCASES
  140. };