test_tortls.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. /* Copyright (c) 2010-2018, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define TORTLS_PRIVATE
  4. #define TOR_X509_PRIVATE
  5. #define LOG_PRIVATE
  6. #include "orconfig.h"
  7. #ifdef _WIN32
  8. #include <winsock2.h>
  9. #endif
  10. #include <math.h>
  11. #include <stddef.h>
  12. #include "lib/cc/compat_compiler.h"
  13. #include "core/or/or.h"
  14. #include "lib/log/log.h"
  15. #include "app/config/config.h"
  16. #include "lib/crypt_ops/compat_openssl.h"
  17. #include "lib/tls/x509.h"
  18. #include "lib/tls/x509_internal.h"
  19. #include "lib/tls/tortls.h"
  20. #include "lib/tls/tortls_st.h"
  21. #include "lib/tls/tortls_internal.h"
  22. #include "lib/encoding/pem.h"
  23. #include "app/config/or_state_st.h"
  24. #include "test/test.h"
  25. #include "test/log_test_helpers.h"
  26. #include "test/test_tortls.h"
  27. #include "tinytest.h"
  28. const char* notCompletelyValidCertString =
  29. "-----BEGIN CERTIFICATE-----\n"
  30. "MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG\n"
  31. "A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE\n"
  32. "MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl\n"
  33. "YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw\n"
  34. "ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE\n"
  35. "CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs\n"
  36. "ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD\n"
  37. "+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9\n"
  38. "MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1\n"
  39. "C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ\n"
  40. "kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf\n"
  41. "jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr\n"
  42. "evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=\n"
  43. "-----END CERTIFICATE-----\n";
  44. const char* validCertString = "-----BEGIN CERTIFICATE-----\n"
  45. "MIIDpTCCAY0CAg3+MA0GCSqGSIb3DQEBBQUAMF4xCzAJBgNVBAYTAlVTMREwDwYD\n"
  46. "VQQIDAhJbGxpbm9pczEQMA4GA1UEBwwHQ2hpY2FnbzEUMBIGA1UECgwLVG9yIFRl\n"
  47. "c3RpbmcxFDASBgNVBAMMC1RvciBUZXN0aW5nMB4XDTE1MDkwNjEzMzk1OVoXDTQz\n"
  48. "MDEyMjEzMzk1OVowVjELMAkGA1UEBhMCVVMxEDAOBgNVBAcMB0NoaWNhZ28xFDAS\n"
  49. "BgNVBAoMC1RvciBUZXN0aW5nMR8wHQYDVQQDDBZ0ZXN0aW5nLnRvcnByb2plY3Qu\n"
  50. "b3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoT6uyVVhWyOF3wkHjjYbd\n"
  51. "nKaykyRv4JVtKQdZ4OpEErmX1zw4MmyzpQNV6iR4bQnWiyLfzyVJMZDIC/WILBfX\n"
  52. "w2Pza/yuLgUvDc3twMuhOACzOQVO8PrEF/aVv2+hbCCy2udXvKhnYn+CCXl3ozc8\n"
  53. "XcKYvujTXDyvGWY3xwAjlQIDAQABMA0GCSqGSIb3DQEBBQUAA4ICAQCUvnhzQWuQ\n"
  54. "MrN+pERkE+zcTI/9dGS90rUMMLgu8VDNqTa0TUQh8uO0EQ6uDvI8Js6e8tgwS0BR\n"
  55. "UBahqb7ZHv+rejGCBr5OudqD+x4STiiuPNJVs86JTLN8SpM9CHjIBH5WCCN2KOy3\n"
  56. "mevNoRcRRyYJzSFULCunIK6FGulszigMYGscrO4oiTkZiHPh9KvWT40IMiHfL+Lw\n"
  57. "EtEWiLex6064LcA2YQ1AMuSZyCexks63lcfaFmQbkYOKqXa1oLkIRuDsOaSVjTfe\n"
  58. "vec+X6jvf12cFTKS5WIeqkKF2Irt+dJoiHEGTe5RscUMN/f+gqHPzfFz5dR23sxo\n"
  59. "g+HC6MZHlFkLAOx3wW6epPS8A/m1mw3zMPoTnb2U2YYt8T0dJMMlUn/7Y1sEAa+a\n"
  60. "dSTMaeUf6VnJ//11m454EZl1to9Z7oJOgqmFffSrdD4BGIWe8f7hhW6L1Enmqe/J\n"
  61. "BKL3wbzZh80O1W0bndAwhnEEhlzneFY84cbBo9pmVxpODHkUcStpr5Z7pBDrcL21\n"
  62. "Ss/aB/1YrsVXhdvJdOGxl3Mnl9dUY57CympLGlT8f0pPS6GAKOelECOhFMHmJd8L\n"
  63. "dj3XQSmKtYHevZ6IvuMXSlB/fJvSjSlkCuLo5+kJoaqPuRu+i/S1qxeRy3CBwmnE\n"
  64. "LdSNdcX4N79GQJ996PA8+mUCQG7YRtK+WA==\n"
  65. "-----END CERTIFICATE-----\n";
  66. const char* caCertString = "-----BEGIN CERTIFICATE-----\n"
  67. "MIIFjzCCA3egAwIBAgIJAKd5WgyfPMYRMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV\n"
  68. "BAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczEQMA4GA1UEBwwHQ2hpY2FnbzEUMBIG\n"
  69. "A1UECgwLVG9yIFRlc3RpbmcxFDASBgNVBAMMC1RvciBUZXN0aW5nMB4XDTE1MDkw\n"
  70. "NjEzMzc0MVoXDTQzMDEyMjEzMzc0MVowXjELMAkGA1UEBhMCVVMxETAPBgNVBAgM\n"
  71. "CElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRQwEgYDVQQKDAtUb3IgVGVzdGlu\n"
  72. "ZzEUMBIGA1UEAwwLVG9yIFRlc3RpbmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\n"
  73. "ggIKAoICAQCpLMUEiLW5leUgBZoEJms2V7lZRhIAjnJBhVMHD0e3UubNknmaQoxf\n"
  74. "ARz3rvqOaRd0JlV+qM9qE0DjiYcCVP1cAfqAo9d83uS1vwY3YMVJzADlaIiHfyVW\n"
  75. "uEgBy0vvkeUBqaua24dYlcwsemOiXYLu41yM1wkcGHW1AhBNHppY6cznb8TyLgNM\n"
  76. "2x3SGUdzc5XMyAFx51faKGBA3wjs+Hg1PLY7d30nmCgEOBavpm5I1disM/0k+Mcy\n"
  77. "YmAKEo/iHJX/rQzO4b9znP69juLlR8PDBUJEVIG/CYb6+uw8MjjUyiWXYoqfVmN2\n"
  78. "hm/lH8b6rXw1a2Aa3VTeD0DxaWeacMYHY/i01fd5n7hCoDTRNdSw5KJ0L3Z0SKTu\n"
  79. "0lzffKzDaIfyZGlpW5qdouACkWYzsaitQOePVE01PIdO30vUfzNTFDfy42ccx3Di\n"
  80. "59UCu+IXB+eMtrBfsok0Qc63vtF1linJgjHW1z/8ujk8F7/qkOfODhk4l7wngc2A\n"
  81. "EmwWFIFoGaiTEZHB9qteXr4unbXZ0AHpM02uGGwZEGohjFyebEb73M+J57WKKAFb\n"
  82. "PqbLcGUksL1SHNBNAJcVLttX55sO4nbidOS/kA3m+F1R04MBTyQF9qA6YDDHqdI3\n"
  83. "h/3pw0Z4fxVouTYT4/NfRnX4JTP4u+7Mpcoof28VME0qWqD1LnRhFQIDAQABo1Aw\n"
  84. "TjAdBgNVHQ4EFgQUMoAgIXH7pZ3QMRwTjT+DM9Yo/v0wHwYDVR0jBBgwFoAUMoAg\n"
  85. "IXH7pZ3QMRwTjT+DM9Yo/v0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC\n"
  86. "AgEAUJxacjXR9sT+Xs6ISFiUsyd0T6WVKMnV46xrYJHirGfx+krWHrjxMY+ZtxYD\n"
  87. "DBDGlo11Qc4v6QrclNf5QUBfIiGQsP9Cm6hHcQ+Tpg9HHCgSqG1YNPwCPReCR4br\n"
  88. "BLvLfrfkcBL2IWM0PdQdCze+59DBfipsULD2mEn9fjYRXQEwb2QWtQ9qRc20Yb/x\n"
  89. "Q4b/+CvUodLkaq7B8MHz0BV8HHcBoph6DYaRmO/N+hPauIuSp6XyaGYcEefGKVKj\n"
  90. "G2+fcsdyXsoijNdL8vNKwm4j2gVwCBnw16J00yfFoV46YcbfqEdJB2je0XSvwXqt\n"
  91. "14AOTngxso2h9k9HLtrfpO1ZG/B5AcCMs1lzbZ2fp5DPHtjvvmvA2RJqgo3yjw4W\n"
  92. "4DHAuTglYFlC3mDHNfNtcGP20JvepcQNzNP2UzwcpOc94hfKikOFw+gf9Vf1qd0y\n"
  93. "h/Sk6OZHn2+JVUPiWHIQV98Vtoh4RmUZDJD+b55ia3fQGTGzt4z1XFzQYSva5sfs\n"
  94. "wocS/papthqWldQU7x+3wofNd5CNU1x6WKXG/yw30IT/4F8ADJD6GeygNT8QJYvt\n"
  95. "u/8lAkbOy6B9xGmSvr0Kk1oq9P2NshA6kalxp1Oz/DTNDdL4AeBXV3JmM6WWCjGn\n"
  96. "Yy1RT69d0rwYc5u/vnqODz1IjvT90smsrkBumGt791FAFeg=\n"
  97. "-----END CERTIFICATE-----\n";
  98. tor_x509_cert_impl_t *
  99. read_cert_from(const char *str)
  100. {
  101. size_t len = strlen(str);
  102. uint8_t *raw_cert = tor_malloc(len);
  103. size_t true_len = pem_decode(raw_cert, len, str, len, "CERTIFICATE");
  104. tor_x509_cert_t *cert = tor_x509_cert_decode(raw_cert, true_len);
  105. tor_free(raw_cert);
  106. if (! cert) {
  107. return NULL;
  108. }
  109. tor_x509_cert_impl_t *res = tor_x509_cert_impl_dup_(cert->cert);
  110. tor_x509_cert_free(cert);
  111. return res;
  112. }
  113. static tor_x509_cert_impl_t *
  114. fixed_try_to_extract_certs_from_tls_cert_out_result = NULL;
  115. static tor_x509_cert_impl_t *
  116. fixed_try_to_extract_certs_from_tls_id_cert_out_result = NULL;
  117. static void
  118. fixed_try_to_extract_certs_from_tls(int severity, tor_tls_t *tls,
  119. tor_x509_cert_impl_t **cert_out,
  120. tor_x509_cert_impl_t **id_cert_out)
  121. {
  122. (void) severity;
  123. (void) tls;
  124. *cert_out = fixed_try_to_extract_certs_from_tls_cert_out_result;
  125. *id_cert_out = fixed_try_to_extract_certs_from_tls_id_cert_out_result;
  126. }
  127. static void
  128. test_tortls_errno_to_tls_error(void *data)
  129. {
  130. (void) data;
  131. tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ECONNRESET)),OP_EQ,
  132. TOR_TLS_ERROR_CONNRESET);
  133. tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ETIMEDOUT)),OP_EQ,
  134. TOR_TLS_ERROR_TIMEOUT);
  135. tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(EHOSTUNREACH)),OP_EQ,
  136. TOR_TLS_ERROR_NO_ROUTE);
  137. tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ENETUNREACH)),OP_EQ,
  138. TOR_TLS_ERROR_NO_ROUTE);
  139. tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ECONNREFUSED)),OP_EQ,
  140. TOR_TLS_ERROR_CONNREFUSED);
  141. tt_int_op(tor_errno_to_tls_error(0),OP_EQ,TOR_TLS_ERROR_MISC);
  142. done:
  143. (void)1;
  144. }
  145. static void
  146. test_tortls_err_to_string(void *data)
  147. {
  148. (void) data;
  149. tt_str_op(tor_tls_err_to_string(1),OP_EQ,"[Not an error.]");
  150. tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_MISC),OP_EQ,"misc error");
  151. tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_IO),OP_EQ,"unexpected close");
  152. tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_CONNREFUSED),OP_EQ,
  153. "connection refused");
  154. tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_CONNRESET),OP_EQ,
  155. "connection reset");
  156. tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_NO_ROUTE),OP_EQ,
  157. "host unreachable");
  158. tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_TIMEOUT),OP_EQ,
  159. "connection timed out");
  160. tt_str_op(tor_tls_err_to_string(TOR_TLS_CLOSE),OP_EQ,"closed");
  161. tt_str_op(tor_tls_err_to_string(TOR_TLS_WANTREAD),OP_EQ,"want to read");
  162. tt_str_op(tor_tls_err_to_string(TOR_TLS_WANTWRITE),OP_EQ,"want to write");
  163. tt_str_op(tor_tls_err_to_string(-100),OP_EQ,"(unknown error code)");
  164. done:
  165. (void)1;
  166. }
  167. #ifdef ENABLE_OPENSSL
  168. static int
  169. mock_tls_cert_matches_key(const tor_tls_t *tls, const tor_x509_cert_t *cert)
  170. {
  171. (void) tls;
  172. (void) cert; // XXXX look at this.
  173. return 1;
  174. }
  175. static void
  176. test_tortls_tor_tls_get_error(void *data)
  177. {
  178. (void) data;
  179. MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key);
  180. crypto_pk_t *key1 = NULL, *key2 = NULL;
  181. key1 = pk_generate(2);
  182. key2 = pk_generate(3);
  183. tor_tls_t *tls = NULL;
  184. tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
  185. key1, key2, 86400), OP_EQ, 0);
  186. tls = tor_tls_new(-1, 0);
  187. setup_capture_of_logs(LOG_WARN);
  188. tor_tls_get_error(tls, 0, 0,
  189. (const char *)"in unit test", LOG_WARN, LD_GENERAL);
  190. expect_single_log_msg_containing("unexpected close while in unit test");
  191. done:
  192. UNMOCK(tor_tls_cert_matches_key);
  193. NS_UNMOCK(logv);
  194. crypto_pk_free(key1);
  195. crypto_pk_free(key2);
  196. tor_tls_free(tls);
  197. }
  198. #endif
  199. static void
  200. test_tortls_x509_cert_get_id_digests(void *ignored)
  201. {
  202. (void)ignored;
  203. tor_x509_cert_t *cert;
  204. common_digests_t *d;
  205. const common_digests_t *res;
  206. cert = tor_malloc_zero(sizeof(tor_x509_cert_t));
  207. d = tor_malloc_zero(sizeof(common_digests_t));
  208. d->d[0][0] = 42;
  209. res = tor_x509_cert_get_id_digests(cert);
  210. tt_assert(!res);
  211. cert->pkey_digests_set = 1;
  212. cert->pkey_digests = *d;
  213. res = tor_x509_cert_get_id_digests(cert);
  214. tt_int_op(res->d[0][0], OP_EQ, 42);
  215. done:
  216. tor_free(cert);
  217. tor_free(d);
  218. }
  219. static void
  220. test_tortls_get_my_certs(void *ignored)
  221. {
  222. (void)ignored;
  223. int ret;
  224. tor_tls_context_t *ctx;
  225. const tor_x509_cert_t *link_cert_out = NULL;
  226. const tor_x509_cert_t *id_cert_out = NULL;
  227. ctx = tor_malloc_zero(sizeof(tor_tls_context_t));
  228. client_tls_context = NULL;
  229. ret = tor_tls_get_my_certs(0, NULL, NULL);
  230. tt_int_op(ret, OP_EQ, -1);
  231. server_tls_context = NULL;
  232. ret = tor_tls_get_my_certs(1, NULL, NULL);
  233. tt_int_op(ret, OP_EQ, -1);
  234. client_tls_context = ctx;
  235. ret = tor_tls_get_my_certs(0, NULL, NULL);
  236. tt_int_op(ret, OP_EQ, 0);
  237. client_tls_context = ctx;
  238. ret = tor_tls_get_my_certs(0, &link_cert_out, &id_cert_out);
  239. tt_int_op(ret, OP_EQ, 0);
  240. server_tls_context = ctx;
  241. ret = tor_tls_get_my_certs(1, &link_cert_out, &id_cert_out);
  242. tt_int_op(ret, OP_EQ, 0);
  243. done:
  244. (void)1;
  245. }
  246. #ifdef ENABLE_OPENSSL
  247. static void
  248. test_tortls_get_forced_write_size(void *ignored)
  249. {
  250. (void)ignored;
  251. long ret;
  252. tor_tls_t *tls;
  253. tls = tor_malloc_zero(sizeof(tor_tls_t));
  254. tls->wantwrite_n = 43;
  255. ret = tor_tls_get_forced_write_size(tls);
  256. tt_int_op(ret, OP_EQ, 43);
  257. done:
  258. tor_free(tls);
  259. }
  260. static void
  261. test_tortls_used_v1_handshake(void *ignored)
  262. {
  263. (void)ignored;
  264. int ret;
  265. tor_tls_t *tls;
  266. tls = tor_malloc_zero(sizeof(tor_tls_t));
  267. // These tests assume both V2 handshake server and client are enabled
  268. tls->wasV2Handshake = 0;
  269. ret = tor_tls_used_v1_handshake(tls);
  270. tt_int_op(ret, OP_EQ, 1);
  271. tls->wasV2Handshake = 1;
  272. ret = tor_tls_used_v1_handshake(tls);
  273. tt_int_op(ret, OP_EQ, 0);
  274. done:
  275. tor_free(tls);
  276. }
  277. static void
  278. test_tortls_server_got_renegotiate(void *ignored)
  279. {
  280. (void)ignored;
  281. int ret;
  282. tor_tls_t *tls;
  283. tls = tor_malloc_zero(sizeof(tor_tls_t));
  284. tls->got_renegotiate = 1;
  285. ret = tor_tls_server_got_renegotiate(tls);
  286. tt_int_op(ret, OP_EQ, 1);
  287. done:
  288. tor_free(tls);
  289. }
  290. #endif
  291. static void
  292. test_tortls_evaluate_ecgroup_for_tls(void *ignored)
  293. {
  294. (void)ignored;
  295. int ret;
  296. ret = evaluate_ecgroup_for_tls(NULL);
  297. tt_int_op(ret, OP_EQ, 1);
  298. ret = evaluate_ecgroup_for_tls("foobar");
  299. tt_int_op(ret, OP_EQ, 0);
  300. ret = evaluate_ecgroup_for_tls("P256");
  301. tt_int_op(ret, OP_EQ, 1);
  302. ret = evaluate_ecgroup_for_tls("P224");
  303. // tt_int_op(ret, OP_EQ, 1); This varies between machines
  304. tt_assert(ret == 0 || ret == 1);
  305. done:
  306. (void)0;
  307. }
  308. static void
  309. test_tortls_double_init(void *arg)
  310. {
  311. (void) arg;
  312. /* If we call tor_tls_context_init() a second time, nothing should go
  313. * wrong.
  314. */
  315. crypto_pk_t *pk1 = NULL, *pk2 = NULL;
  316. pk1 = pk_generate(2);
  317. pk2 = pk_generate(0);
  318. int r = tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
  319. pk1, pk2, 86400);
  320. tt_int_op(r, OP_EQ, 0);
  321. r = tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
  322. pk2, pk1, 86400);
  323. tt_int_op(r, OP_EQ, 0);
  324. /* For a public server context, these are the same */
  325. tt_ptr_op(tor_tls_context_get(0), OP_EQ, tor_tls_context_get(1));
  326. done:
  327. crypto_pk_free(pk1);
  328. crypto_pk_free(pk2);
  329. }
  330. static void
  331. test_tortls_bridge_init(void *arg)
  332. {
  333. (void)arg;
  334. crypto_pk_t *pk1 = NULL, *pk2 = NULL;
  335. pk1 = pk_generate(2);
  336. pk2 = pk_generate(0);
  337. /* If we pass in a server identity key but not the
  338. TOR_TLS_CTX_IS_PUBLIC_SERVER flag, we should get a bridge-style
  339. configuration, with two distinct contexts. */
  340. int r = tor_tls_context_init(0 /* flags */, pk1, pk2, 86400);
  341. tt_int_op(r, OP_EQ, 0);
  342. tt_ptr_op(tor_tls_context_get(0), OP_NE, tor_tls_context_get(1));
  343. done:
  344. crypto_pk_free(pk1);
  345. crypto_pk_free(pk2);
  346. }
  347. static void
  348. test_tortls_address(void *arg)
  349. {
  350. (void)arg;
  351. tor_tls_t *tls = NULL;
  352. crypto_pk_t *pk1=NULL, *pk2=NULL;
  353. pk1 = pk_generate(2);
  354. pk2 = pk_generate(0);
  355. int r = tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
  356. pk1, pk2, 86400);
  357. tt_int_op(r, OP_EQ, 0);
  358. tls = tor_tls_new(-1, 0);
  359. tls->state = TOR_TLS_ST_OPEN;
  360. tor_tls_set_logged_address(tls, "zombo.com");
  361. /* This write should fail, since the fd is -1. */
  362. setup_capture_of_logs(LOG_INFO);
  363. int n = tor_tls_write(tls, "welcome", 7);
  364. tt_int_op(n, OP_LT, 0);
  365. expect_log_msg_containing("with zombo.com");
  366. done:
  367. teardown_capture_of_logs();
  368. tor_tls_free(tls);
  369. crypto_pk_free(pk1);
  370. crypto_pk_free(pk2);
  371. }
  372. static void
  373. test_tortls_is_server(void *arg)
  374. {
  375. (void)arg;
  376. crypto_pk_t *pk1=NULL, *pk2=NULL;
  377. tor_tls_t *tls1=NULL, *tls2=NULL;
  378. pk1 = pk_generate(2);
  379. pk2 = pk_generate(0);
  380. int r = tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
  381. pk1, pk2, 86400);
  382. tt_int_op(r, OP_EQ, 0);
  383. tls1 = tor_tls_new(-1, 0);
  384. tls2 = tor_tls_new(-1, 1);
  385. tt_assert(! tor_tls_is_server(tls1));
  386. tt_assert(tor_tls_is_server(tls2));
  387. done:
  388. tor_tls_free(tls1);
  389. tor_tls_free(tls2);
  390. crypto_pk_free(pk1);
  391. crypto_pk_free(pk2);
  392. }
  393. static void
  394. test_tortls_verify(void *ignored)
  395. {
  396. (void)ignored;
  397. int ret;
  398. tor_tls_t *tls;
  399. crypto_pk_t *k = NULL;
  400. tor_x509_cert_impl_t *cert1 = NULL, *cert2 = NULL, *invalidCert = NULL,
  401. *validCert = NULL, *caCert = NULL;
  402. validCert = read_cert_from(validCertString);
  403. caCert = read_cert_from(caCertString);
  404. invalidCert = read_cert_from(notCompletelyValidCertString);
  405. tls = tor_malloc_zero(sizeof(tor_tls_t));
  406. MOCK(try_to_extract_certs_from_tls, fixed_try_to_extract_certs_from_tls);
  407. fixed_try_to_extract_certs_from_tls_cert_out_result = cert1;
  408. ret = tor_tls_verify(LOG_WARN, tls, &k);
  409. tt_int_op(ret, OP_EQ, -1);
  410. fixed_try_to_extract_certs_from_tls_id_cert_out_result = cert2;
  411. ret = tor_tls_verify(LOG_WARN, tls, &k);
  412. tt_int_op(ret, OP_EQ, -1);
  413. fixed_try_to_extract_certs_from_tls_cert_out_result = invalidCert;
  414. fixed_try_to_extract_certs_from_tls_id_cert_out_result = invalidCert;
  415. ret = tor_tls_verify(LOG_WARN, tls, &k);
  416. tt_int_op(ret, OP_EQ, -1);
  417. fixed_try_to_extract_certs_from_tls_cert_out_result = validCert;
  418. fixed_try_to_extract_certs_from_tls_id_cert_out_result = caCert;
  419. ret = tor_tls_verify(LOG_WARN, tls, &k);
  420. tt_int_op(ret, OP_EQ, 0);
  421. tt_assert(k);
  422. done:
  423. UNMOCK(try_to_extract_certs_from_tls);
  424. if (cert1)
  425. tor_x509_cert_impl_free_(cert1);
  426. if (cert2)
  427. tor_x509_cert_impl_free_(cert2);
  428. tor_free(tls);
  429. crypto_pk_free(k);
  430. }
  431. #define LOCAL_TEST_CASE(name, flags) \
  432. { #name, test_tortls_##name, (flags|TT_FORK), NULL, NULL }
  433. struct testcase_t tortls_tests[] = {
  434. LOCAL_TEST_CASE(errno_to_tls_error, 0),
  435. LOCAL_TEST_CASE(err_to_string, 0),
  436. LOCAL_TEST_CASE(x509_cert_get_id_digests, 0),
  437. LOCAL_TEST_CASE(get_my_certs, TT_FORK),
  438. #ifdef ENABLE_OPENSSL
  439. LOCAL_TEST_CASE(tor_tls_get_error, 0),
  440. LOCAL_TEST_CASE(get_forced_write_size, 0),
  441. LOCAL_TEST_CASE(used_v1_handshake, TT_FORK),
  442. LOCAL_TEST_CASE(server_got_renegotiate, 0),
  443. #endif
  444. LOCAL_TEST_CASE(evaluate_ecgroup_for_tls, 0),
  445. LOCAL_TEST_CASE(double_init, TT_FORK),
  446. LOCAL_TEST_CASE(address, TT_FORK),
  447. LOCAL_TEST_CASE(is_server, 0),
  448. LOCAL_TEST_CASE(bridge_init, TT_FORK),
  449. LOCAL_TEST_CASE(verify, TT_FORK),
  450. END_OF_TESTCASES
  451. };