You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ssl_util.c 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  1. /*-
  2. * Copyright 2016 Vsevolod Stakhov
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "config.h"
  17. #include "libutil/util.h"
  18. #include "libserver/logger.h"
  19. #include "ssl_util.h"
  20. #include "unix-std.h"
  21. #include <openssl/ssl.h>
  22. #include <openssl/err.h>
  23. #include <openssl/rand.h>
  24. #include <openssl/conf.h>
  25. #include <openssl/x509v3.h>
  26. enum rspamd_ssl_state {
  27. ssl_conn_reset = 0,
  28. ssl_conn_init,
  29. ssl_conn_connected,
  30. ssl_next_read,
  31. ssl_next_write,
  32. ssl_next_shutdown,
  33. };
  34. enum rspamd_ssl_shutdown {
  35. ssl_shut_default = 0,
  36. ssl_shut_unclean,
  37. };
  38. struct rspamd_ssl_connection {
  39. gint fd;
  40. enum rspamd_ssl_state state;
  41. enum rspamd_ssl_shutdown shut;
  42. gboolean verify_peer;
  43. SSL *ssl;
  44. gchar *hostname;
  45. struct rspamd_io_ev *ev;
  46. struct rspamd_io_ev *shut_ev;
  47. struct ev_loop *event_loop;
  48. rspamd_ssl_handler_t handler;
  49. rspamd_ssl_error_handler_t err_handler;
  50. gpointer handler_data;
  51. gchar log_tag[8];
  52. };
  53. #define msg_debug_ssl(...) rspamd_conditional_debug_fast (NULL, NULL, \
  54. rspamd_ssl_log_id, "ssl", conn->log_tag, \
  55. G_STRFUNC, \
  56. __VA_ARGS__)
  57. static void rspamd_ssl_event_handler (gint fd, short what, gpointer ud);
  58. INIT_LOG_MODULE(ssl)
  59. static GQuark
  60. rspamd_ssl_quark (void)
  61. {
  62. return g_quark_from_static_string ("rspamd-ssl");
  63. }
  64. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
  65. #ifndef X509_get_notBefore
  66. #define X509_get_notBefore(x) X509_get0_notBefore(x)
  67. #endif
  68. #ifndef X509_get_notAfter
  69. #define X509_get_notAfter(x) X509_get0_notAfter(x)
  70. #endif
  71. #ifndef ASN1_STRING_data
  72. #define ASN1_STRING_data(x) ASN1_STRING_get0_data(x)
  73. #endif
  74. #endif
  75. /* $OpenBSD: tls_verify.c,v 1.14 2015/09/29 10:17:04 deraadt Exp $ */
  76. /*
  77. * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org>
  78. *
  79. * Permission to use, copy, modify, and distribute this software for any
  80. * purpose with or without fee is hereby granted, provided that the above
  81. * copyright notice and this permission notice appear in all copies.
  82. *
  83. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  84. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  85. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  86. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  87. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  88. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  89. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  90. */
  91. static gboolean
  92. rspamd_tls_match_name (const char *cert_name, const char *name)
  93. {
  94. const char *cert_domain, *domain, *next_dot;
  95. if (g_ascii_strcasecmp (cert_name, name) == 0) {
  96. return TRUE;
  97. }
  98. /* Wildcard match? */
  99. if (cert_name[0] == '*') {
  100. /*
  101. * Valid wildcards:
  102. * - "*.domain.tld"
  103. * - "*.sub.domain.tld"
  104. * - etc.
  105. * Reject "*.tld".
  106. * No attempt to prevent the use of eg. "*.co.uk".
  107. */
  108. cert_domain = &cert_name[1];
  109. /* Disallow "*" */
  110. if (cert_domain[0] == '\0') {
  111. return FALSE;
  112. }
  113. /* Disallow "*foo" */
  114. if (cert_domain[0] != '.') {
  115. return FALSE;
  116. }
  117. /* Disallow "*.." */
  118. if (cert_domain[1] == '.') {
  119. return FALSE;
  120. }
  121. next_dot = strchr (&cert_domain[1], '.');
  122. /* Disallow "*.bar" */
  123. if (next_dot == NULL) {
  124. return FALSE;
  125. }
  126. /* Disallow "*.bar.." */
  127. if (next_dot[1] == '.') {
  128. return FALSE;
  129. }
  130. domain = strchr (name, '.');
  131. /* No wildcard match against a name with no host part. */
  132. if (name[0] == '.') {
  133. return FALSE;
  134. }
  135. /* No wildcard match against a name with no domain part. */
  136. if (domain == NULL || strlen (domain) == 1) {
  137. return FALSE;
  138. }
  139. if (g_ascii_strcasecmp (cert_domain, domain) == 0) {
  140. return TRUE;
  141. }
  142. }
  143. return FALSE;
  144. }
  145. /* See RFC 5280 section 4.2.1.6 for SubjectAltName details. */
  146. static gboolean
  147. rspamd_tls_check_subject_altname (X509 *cert, const char *name)
  148. {
  149. STACK_OF(GENERAL_NAME) *altname_stack = NULL;
  150. int addrlen, type;
  151. int count, i;
  152. union {
  153. struct in_addr ip4;
  154. struct in6_addr ip6;
  155. } addrbuf;
  156. gboolean ret = FALSE;
  157. altname_stack = X509_get_ext_d2i (cert, NID_subject_alt_name, NULL, NULL);
  158. if (altname_stack == NULL) {
  159. return FALSE;
  160. }
  161. if (inet_pton (AF_INET, name, &addrbuf) == 1) {
  162. type = GEN_IPADD;
  163. addrlen = 4;
  164. }
  165. else if (inet_pton (AF_INET6, name, &addrbuf) == 1) {
  166. type = GEN_IPADD;
  167. addrlen = 16;
  168. }
  169. else {
  170. type = GEN_DNS;
  171. addrlen = 0;
  172. }
  173. count = sk_GENERAL_NAME_num (altname_stack);
  174. for (i = 0; i < count; i++) {
  175. GENERAL_NAME *altname;
  176. altname = sk_GENERAL_NAME_value (altname_stack, i);
  177. if (altname->type != type) {
  178. continue;
  179. }
  180. if (type == GEN_DNS) {
  181. const char *data;
  182. int format, len;
  183. format = ASN1_STRING_type (altname->d.dNSName);
  184. if (format == V_ASN1_IA5STRING) {
  185. data = (const char *)ASN1_STRING_data (altname->d.dNSName);
  186. len = ASN1_STRING_length (altname->d.dNSName);
  187. if (len < 0 || len != (gint)strlen (data)) {
  188. ret = FALSE;
  189. break;
  190. }
  191. /*
  192. * Per RFC 5280 section 4.2.1.6:
  193. * " " is a legal domain name, but that
  194. * dNSName must be rejected.
  195. */
  196. if (strcmp (data, " ") == 0) {
  197. ret = FALSE;
  198. break;
  199. }
  200. if (rspamd_tls_match_name (data, name)) {
  201. ret = TRUE;
  202. break;
  203. }
  204. }
  205. }
  206. else if (type == GEN_IPADD) {
  207. const char *data;
  208. int datalen;
  209. datalen = ASN1_STRING_length (altname->d.iPAddress);
  210. data = (const char *)ASN1_STRING_data (altname->d.iPAddress);
  211. if (datalen < 0) {
  212. ret = FALSE;
  213. break;
  214. }
  215. /*
  216. * Per RFC 5280 section 4.2.1.6:
  217. * IPv4 must use 4 octets and IPv6 must use 16 octets.
  218. */
  219. if (datalen == addrlen && memcmp (data, &addrbuf, addrlen) == 0) {
  220. ret = TRUE;
  221. break;
  222. }
  223. }
  224. }
  225. sk_GENERAL_NAME_pop_free (altname_stack, GENERAL_NAME_free);
  226. return ret;
  227. }
  228. static gboolean
  229. rspamd_tls_check_common_name (X509 *cert, const char *name)
  230. {
  231. X509_NAME *subject_name;
  232. char *common_name = NULL;
  233. union {
  234. struct in_addr ip4;
  235. struct in6_addr ip6;
  236. } addrbuf;
  237. int common_name_len;
  238. gboolean ret = FALSE;
  239. subject_name = X509_get_subject_name (cert);
  240. if (subject_name == NULL) {
  241. goto out;
  242. }
  243. common_name_len = X509_NAME_get_text_by_NID (subject_name, NID_commonName, NULL, 0);
  244. if (common_name_len < 0) {
  245. goto out;
  246. }
  247. common_name = g_malloc0 (common_name_len + 1);
  248. X509_NAME_get_text_by_NID (subject_name, NID_commonName, common_name,
  249. common_name_len + 1);
  250. /* NUL bytes in CN? */
  251. if (common_name_len != (gint)strlen (common_name)) {
  252. goto out;
  253. }
  254. if (inet_pton (AF_INET, name, &addrbuf) == 1
  255. || inet_pton (AF_INET6, name, &addrbuf) == 1) {
  256. /*
  257. * We don't want to attempt wildcard matching against IP
  258. * addresses, so perform a simple comparison here.
  259. */
  260. if (strcmp (common_name, name) == 0) {
  261. ret = TRUE;
  262. }
  263. else {
  264. ret = FALSE;
  265. }
  266. goto out;
  267. }
  268. if (rspamd_tls_match_name (common_name, name)) {
  269. ret = TRUE;
  270. }
  271. out:
  272. g_free (common_name);
  273. return ret;
  274. }
  275. static gboolean
  276. rspamd_tls_check_name (X509 *cert, const char *name)
  277. {
  278. gboolean ret;
  279. ret = rspamd_tls_check_subject_altname (cert, name);
  280. if (ret) {
  281. return ret;
  282. }
  283. return rspamd_tls_check_common_name (cert, name);
  284. }
  285. static gboolean
  286. rspamd_ssl_peer_verify (struct rspamd_ssl_connection *c)
  287. {
  288. X509 *server_cert;
  289. glong ver_err;
  290. GError *err = NULL;
  291. ver_err = SSL_get_verify_result (c->ssl);
  292. if (ver_err != X509_V_OK) {
  293. g_set_error (&err, rspamd_ssl_quark (), ver_err, "certificate validation "
  294. "failed: %s", X509_verify_cert_error_string (ver_err));
  295. c->err_handler (c->handler_data, err);
  296. g_error_free (err);
  297. return FALSE;
  298. }
  299. /* Get server's certificate */
  300. server_cert = SSL_get_peer_certificate (c->ssl);
  301. if (server_cert == NULL) {
  302. g_set_error (&err, rspamd_ssl_quark (), ver_err, "peer certificate is absent");
  303. c->err_handler (c->handler_data, err);
  304. g_error_free (err);
  305. return FALSE;
  306. }
  307. if (c->hostname) {
  308. if (!rspamd_tls_check_name (server_cert, c->hostname)) {
  309. X509_free (server_cert);
  310. g_set_error (&err, rspamd_ssl_quark (), ver_err, "peer certificate fails "
  311. "hostname verification for %s", c->hostname);
  312. c->err_handler (c->handler_data, err);
  313. g_error_free (err);
  314. return FALSE;
  315. }
  316. }
  317. X509_free (server_cert);
  318. return TRUE;
  319. }
  320. static void
  321. rspamd_tls_set_error (gint retcode, const gchar *stage, GError **err)
  322. {
  323. GString *reason;
  324. gchar buf[120];
  325. gint err_code = 0, last_err = 0;
  326. reason = g_string_sized_new (sizeof (buf));
  327. if (retcode == SSL_ERROR_SYSCALL) {
  328. rspamd_printf_gstring (reason, "syscall fail: %s", strerror (errno));
  329. err_code = errno;
  330. }
  331. else {
  332. while ((err_code = ERR_get_error()) != 0) {
  333. last_err = err_code;
  334. ERR_error_string (err_code, buf);
  335. rspamd_printf_gstring (reason, "ssl error: %s,", buf);
  336. }
  337. err_code = last_err;
  338. if (reason->len > 0 && reason->str[reason->len - 1] == ',') {
  339. reason->str[reason->len - 1] = '\0';
  340. reason->len --;
  341. }
  342. }
  343. g_set_error (err, rspamd_ssl_quark (), err_code,
  344. "ssl %s error: %s", stage, reason->str);
  345. g_string_free (reason, TRUE);
  346. }
  347. static void
  348. rspamd_ssl_connection_dtor (struct rspamd_ssl_connection *conn)
  349. {
  350. SSL_free (conn->ssl);
  351. if (conn->hostname) {
  352. g_free (conn->hostname);
  353. }
  354. if (conn->shut_ev) {
  355. rspamd_ev_watcher_stop (conn->event_loop, conn->shut_ev);
  356. g_free (conn->shut_ev);
  357. }
  358. close (conn->fd);
  359. g_free (conn);
  360. }
  361. static void
  362. rspamd_ssl_shutdown (struct rspamd_ssl_connection *conn)
  363. {
  364. gint ret = 0, nret, retries;
  365. static const gint max_retries = 5;
  366. /*
  367. * Fucking openssl...
  368. * From the manual, 0 means: "The shutdown is not yet finished.
  369. * Call SSL_shutdown() for a second time,
  370. * if a bidirectional shutdown shall be performed.
  371. * The output of SSL_get_error(3) may be misleading,
  372. * as an erroneous SSL_ERROR_SYSCALL may be flagged
  373. * even though no error occurred."
  374. *
  375. * What is `second`, what if `second` also returns 0?
  376. * What a retarded behaviour!
  377. */
  378. for (retries = 0; retries < max_retries; retries ++) {
  379. ret = SSL_shutdown (conn->ssl);
  380. if (ret != 0) {
  381. break;
  382. }
  383. }
  384. if (ret == 1) {
  385. /* All done */
  386. msg_debug_ssl ("ssl shutdown: all done");
  387. rspamd_ssl_connection_dtor (conn);
  388. }
  389. else if (ret < 0) {
  390. short what;
  391. nret = SSL_get_error (conn->ssl, ret);
  392. conn->state = ssl_next_shutdown;
  393. if (nret == SSL_ERROR_WANT_READ) {
  394. msg_debug_ssl ("ssl shutdown: need read");
  395. what = EV_READ;
  396. }
  397. else if (nret == SSL_ERROR_WANT_WRITE) {
  398. msg_debug_ssl ("ssl shutdown: need write");
  399. what = EV_WRITE;
  400. }
  401. else {
  402. /* Cannot do anything else, fatal error */
  403. GError *err = NULL;
  404. rspamd_tls_set_error (nret, "final shutdown", &err);
  405. msg_debug_ssl ("ssl shutdown: fatal error: %e; retries=%d; ret=%d",
  406. err, retries, ret);
  407. g_error_free (err);
  408. rspamd_ssl_connection_dtor (conn);
  409. return;
  410. }
  411. /* As we own fd, we can try to perform shutdown one more time */
  412. /* BUGON: but we DO NOT own conn->ev, and it's a big issue */
  413. static const ev_tstamp shutdown_time = 5.0;
  414. if (conn->shut_ev == NULL) {
  415. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  416. conn->shut_ev = g_malloc0 (sizeof (*conn->shut_ev));
  417. rspamd_ev_watcher_init (conn->shut_ev, conn->fd, what,
  418. rspamd_ssl_event_handler, conn);
  419. rspamd_ev_watcher_start (conn->event_loop, conn->shut_ev, shutdown_time);
  420. /* XXX: can it be done safely ? */
  421. conn->ev = conn->shut_ev;
  422. }
  423. else {
  424. rspamd_ev_watcher_reschedule (conn->event_loop, conn->shut_ev, what);
  425. }
  426. conn->state = ssl_next_shutdown;
  427. }
  428. else if (ret == 0) {
  429. /* What can we do here?? */
  430. msg_debug_ssl ("ssl shutdown: openssl failed to initiate shutdown after "
  431. "%d attempts!", max_retries);
  432. rspamd_ssl_connection_dtor (conn);
  433. }
  434. }
  435. static void
  436. rspamd_ssl_event_handler (gint fd, short what, gpointer ud)
  437. {
  438. struct rspamd_ssl_connection *conn = ud;
  439. gint ret;
  440. GError *err = NULL;
  441. if (what == EV_TIMER) {
  442. if (conn->state == ssl_next_shutdown) {
  443. /* No way to restore, just terminate */
  444. rspamd_ssl_connection_dtor (conn);
  445. }
  446. else {
  447. conn->shut = ssl_shut_unclean;
  448. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  449. g_set_error (&err, rspamd_ssl_quark (), ETIMEDOUT,
  450. "ssl connection timed out");
  451. conn->err_handler (conn->handler_data, err);
  452. g_error_free (err);
  453. }
  454. return;
  455. }
  456. msg_debug_ssl ("ssl event; what=%d; c->state=%d", (int)what,
  457. (int)conn->state);
  458. switch (conn->state) {
  459. case ssl_conn_init:
  460. /* Continue connection */
  461. ret = SSL_connect (conn->ssl);
  462. if (ret == 1) {
  463. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  464. /* Verify certificate */
  465. if ((!conn->verify_peer) || rspamd_ssl_peer_verify (conn)) {
  466. msg_debug_ssl ("ssl connect: connected");
  467. conn->state = ssl_conn_connected;
  468. conn->handler (fd, EV_WRITE, conn->handler_data);
  469. }
  470. else {
  471. return;
  472. }
  473. }
  474. else {
  475. ret = SSL_get_error (conn->ssl, ret);
  476. if (ret == SSL_ERROR_WANT_READ) {
  477. msg_debug_ssl ("ssl connect: need read");
  478. what = EV_READ;
  479. }
  480. else if (ret == SSL_ERROR_WANT_WRITE) {
  481. msg_debug_ssl ("ssl connect: need write");
  482. what = EV_WRITE;
  483. }
  484. else {
  485. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  486. rspamd_tls_set_error (ret, "connect", &err);
  487. conn->err_handler (conn->handler_data, err);
  488. g_error_free (err);
  489. return;
  490. }
  491. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  492. }
  493. break;
  494. case ssl_next_read:
  495. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, EV_READ);
  496. conn->state = ssl_conn_connected;
  497. conn->handler (fd, EV_READ, conn->handler_data);
  498. break;
  499. case ssl_next_write:
  500. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, EV_WRITE);
  501. conn->state = ssl_conn_connected;
  502. conn->handler (fd, EV_WRITE, conn->handler_data);
  503. break;
  504. case ssl_conn_connected:
  505. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  506. conn->state = ssl_conn_connected;
  507. conn->handler (fd, what, conn->handler_data);
  508. break;
  509. case ssl_next_shutdown:
  510. rspamd_ssl_shutdown (conn);
  511. break;
  512. default:
  513. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  514. g_set_error (&err, rspamd_ssl_quark (), EINVAL,
  515. "ssl bad state error: %d", conn->state);
  516. conn->err_handler (conn->handler_data, err);
  517. g_error_free (err);
  518. break;
  519. }
  520. }
  521. struct rspamd_ssl_connection *
  522. rspamd_ssl_connection_new (gpointer ssl_ctx, struct ev_loop *ev_base,
  523. gboolean verify_peer, const gchar *log_tag)
  524. {
  525. struct rspamd_ssl_connection *c;
  526. g_assert (ssl_ctx != NULL);
  527. c = g_malloc0 (sizeof (*c));
  528. c->ssl = SSL_new (ssl_ctx);
  529. c->event_loop = ev_base;
  530. c->verify_peer = verify_peer;
  531. if (log_tag) {
  532. rspamd_strlcpy (c->log_tag, log_tag, sizeof (log_tag));
  533. }
  534. else {
  535. rspamd_random_hex (c->log_tag, sizeof (log_tag) - 1);
  536. c->log_tag[sizeof (log_tag) - 1] = '\0';
  537. }
  538. return c;
  539. }
  540. gboolean
  541. rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd,
  542. const gchar *hostname, struct rspamd_io_ev *ev, ev_tstamp timeout,
  543. rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler,
  544. gpointer handler_data)
  545. {
  546. gint ret;
  547. g_assert (conn != NULL);
  548. if (conn->state != ssl_conn_reset) {
  549. return FALSE;
  550. }
  551. /* We dup fd to allow graceful closing */
  552. gint nfd = dup (fd);
  553. if (nfd == -1) {
  554. return FALSE;
  555. }
  556. conn->fd = nfd;
  557. conn->ev = ev;
  558. conn->handler = handler;
  559. conn->err_handler = err_handler;
  560. conn->handler_data = handler_data;
  561. if (SSL_set_fd (conn->ssl, conn->fd) != 1) {
  562. close (conn->fd);
  563. return FALSE;
  564. }
  565. if (hostname) {
  566. conn->hostname = g_strdup (hostname);
  567. #ifdef HAVE_SSL_TLSEXT_HOSTNAME
  568. SSL_set_tlsext_host_name (conn->ssl, conn->hostname);
  569. #endif
  570. }
  571. conn->state = ssl_conn_init;
  572. ret = SSL_connect (conn->ssl);
  573. if (ret == 1) {
  574. conn->state = ssl_conn_connected;
  575. msg_debug_ssl ("connected, start write event");
  576. rspamd_ev_watcher_stop (conn->event_loop, ev);
  577. rspamd_ev_watcher_init (ev, nfd, EV_WRITE, rspamd_ssl_event_handler, conn);
  578. rspamd_ev_watcher_start (conn->event_loop, ev, timeout);
  579. }
  580. else {
  581. ret = SSL_get_error (conn->ssl, ret);
  582. if (ret == SSL_ERROR_WANT_READ) {
  583. msg_debug_ssl ("not connected, want read");
  584. }
  585. else if (ret == SSL_ERROR_WANT_WRITE) {
  586. msg_debug_ssl ("not connected, want write");
  587. }
  588. else {
  589. GError *err = NULL;
  590. conn->shut = ssl_shut_unclean;
  591. rspamd_tls_set_error (ret, "initial connect", &err);
  592. msg_debug_ssl ("not connected, fatal error %e", err);
  593. g_error_free (err);
  594. return FALSE;
  595. }
  596. rspamd_ev_watcher_stop (conn->event_loop, ev);
  597. rspamd_ev_watcher_init (ev, nfd, EV_WRITE|EV_READ,
  598. rspamd_ssl_event_handler, conn);
  599. rspamd_ev_watcher_start (conn->event_loop, ev, timeout);
  600. }
  601. return TRUE;
  602. }
  603. gssize
  604. rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf,
  605. gsize buflen)
  606. {
  607. gint ret;
  608. short what;
  609. GError *err = NULL;
  610. g_assert (conn != NULL);
  611. if (conn->state != ssl_conn_connected && conn->state != ssl_next_read) {
  612. errno = EINVAL;
  613. g_set_error (&err, rspamd_ssl_quark (), ECONNRESET,
  614. "ssl state error: cannot read data");
  615. conn->shut = ssl_shut_unclean;
  616. conn->err_handler (conn->handler_data, err);
  617. g_error_free (err);
  618. return -1;
  619. }
  620. ret = SSL_read (conn->ssl, buf, buflen);
  621. msg_debug_ssl ("ssl read: %d", ret);
  622. if (ret > 0) {
  623. conn->state = ssl_conn_connected;
  624. return ret;
  625. }
  626. else if (ret == 0) {
  627. ret = SSL_get_error (conn->ssl, ret);
  628. if (ret == SSL_ERROR_ZERO_RETURN || ret == SSL_ERROR_SYSCALL) {
  629. conn->state = ssl_conn_reset;
  630. return 0;
  631. }
  632. else {
  633. conn->shut = ssl_shut_unclean;
  634. rspamd_tls_set_error (ret, "read", &err);
  635. conn->err_handler (conn->handler_data, err);
  636. g_error_free (err);
  637. errno = EINVAL;
  638. return -1;
  639. }
  640. }
  641. else {
  642. ret = SSL_get_error (conn->ssl, ret);
  643. conn->state = ssl_next_read;
  644. what = 0;
  645. if (ret == SSL_ERROR_WANT_READ) {
  646. msg_debug_ssl ("ssl read: need read");
  647. what |= EV_READ;
  648. }
  649. else if (ret == SSL_ERROR_WANT_WRITE) {
  650. msg_debug_ssl ("ssl read: need write");
  651. what |= EV_WRITE;
  652. }
  653. else {
  654. conn->shut = ssl_shut_unclean;
  655. rspamd_tls_set_error (ret, "read", &err);
  656. conn->err_handler (conn->handler_data, err);
  657. g_error_free (err);
  658. errno = EINVAL;
  659. return -1;
  660. }
  661. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  662. errno = EAGAIN;
  663. }
  664. return -1;
  665. }
  666. gssize
  667. rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf,
  668. gsize buflen)
  669. {
  670. gint ret;
  671. short what;
  672. GError *err = NULL;
  673. g_assert (conn != NULL);
  674. if (conn->state != ssl_conn_connected && conn->state != ssl_next_write) {
  675. errno = EINVAL;
  676. return -1;
  677. }
  678. ret = SSL_write (conn->ssl, buf, buflen);
  679. msg_debug_ssl ("ssl write: ret=%d, buflen=%z", ret, buflen);
  680. if (ret > 0) {
  681. conn->state = ssl_conn_connected;
  682. return ret;
  683. }
  684. else if (ret == 0) {
  685. ret = SSL_get_error (conn->ssl, ret);
  686. if (ret == SSL_ERROR_ZERO_RETURN) {
  687. rspamd_tls_set_error (ret, "write", &err);
  688. conn->err_handler (conn->handler_data, err);
  689. g_error_free (err);
  690. errno = ECONNRESET;
  691. conn->state = ssl_conn_reset;
  692. return -1;
  693. }
  694. else {
  695. conn->shut = ssl_shut_unclean;
  696. rspamd_tls_set_error (ret, "write", &err);
  697. conn->err_handler (conn->handler_data, err);
  698. g_error_free (err);
  699. errno = EINVAL;
  700. return -1;
  701. }
  702. }
  703. else {
  704. ret = SSL_get_error (conn->ssl, ret);
  705. conn->state = ssl_next_write;
  706. if (ret == SSL_ERROR_WANT_READ) {
  707. msg_debug_ssl ("ssl write: need read");
  708. what = EV_READ;
  709. }
  710. else if (ret == SSL_ERROR_WANT_WRITE) {
  711. msg_debug_ssl ("ssl write: need write");
  712. what = EV_WRITE;
  713. }
  714. else {
  715. conn->shut = ssl_shut_unclean;
  716. rspamd_tls_set_error (ret, "write", &err);
  717. conn->err_handler (conn->handler_data, err);
  718. g_error_free (err);
  719. errno = EINVAL;
  720. return -1;
  721. }
  722. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  723. errno = EAGAIN;
  724. }
  725. return -1;
  726. }
  727. gssize
  728. rspamd_ssl_writev (struct rspamd_ssl_connection *conn, struct iovec *iov,
  729. gsize iovlen)
  730. {
  731. /*
  732. * Static is needed to avoid issue:
  733. * https://github.com/openssl/openssl/issues/6865
  734. */
  735. static guchar ssl_buf[16384];
  736. guchar *p;
  737. struct iovec *cur;
  738. gsize i, remain;
  739. remain = sizeof (ssl_buf);
  740. p = ssl_buf;
  741. for (i = 0; i < iovlen; i ++) {
  742. cur = &iov[i];
  743. if (cur->iov_len > 0) {
  744. if (remain >= cur->iov_len) {
  745. memcpy (p, cur->iov_base, cur->iov_len);
  746. p += cur->iov_len;
  747. remain -= cur->iov_len;
  748. }
  749. else {
  750. memcpy (p, cur->iov_base, remain);
  751. p += remain;
  752. remain = 0;
  753. break;
  754. }
  755. }
  756. }
  757. return rspamd_ssl_write (conn, ssl_buf, p - ssl_buf);
  758. }
  759. /**
  760. * Removes connection data
  761. * @param conn
  762. */
  763. void
  764. rspamd_ssl_connection_free (struct rspamd_ssl_connection *conn)
  765. {
  766. if (conn) {
  767. if (conn->shut == ssl_shut_unclean) {
  768. /* Ignore return result and close socket */
  769. msg_debug_ssl ("unclean shutdown");
  770. SSL_set_quiet_shutdown (conn->ssl, 1);
  771. (void)SSL_shutdown (conn->ssl);
  772. rspamd_ssl_connection_dtor (conn);
  773. }
  774. else {
  775. msg_debug_ssl ("normal shutdown");
  776. rspamd_ssl_shutdown (conn);
  777. }
  778. }
  779. }
  780. gpointer
  781. rspamd_init_ssl_ctx (void)
  782. {
  783. SSL_CTX *ssl_ctx;
  784. gint ssl_options;
  785. rspamd_openssl_maybe_init ();
  786. ssl_ctx = SSL_CTX_new (SSLv23_method ());
  787. SSL_CTX_set_verify (ssl_ctx, SSL_VERIFY_PEER, NULL);
  788. SSL_CTX_set_verify_depth (ssl_ctx, 4);
  789. ssl_options = SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3;
  790. #ifdef SSL_OP_NO_COMPRESSION
  791. ssl_options |= SSL_OP_NO_COMPRESSION;
  792. #elif OPENSSL_VERSION_NUMBER >= 0x00908000L
  793. sk_SSL_COMP_zero (SSL_COMP_get_compression_methods ());
  794. #endif
  795. SSL_CTX_set_options (ssl_ctx, ssl_options);
  796. return ssl_ctx;
  797. }
  798. gpointer rspamd_init_ssl_ctx_noverify (void)
  799. {
  800. SSL_CTX *ssl_ctx_noverify;
  801. gint ssl_options;
  802. rspamd_openssl_maybe_init ();
  803. ssl_options = SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3;
  804. #ifdef SSL_OP_NO_COMPRESSION
  805. ssl_options |= SSL_OP_NO_COMPRESSION;
  806. #elif OPENSSL_VERSION_NUMBER >= 0x00908000L
  807. sk_SSL_COMP_zero (SSL_COMP_get_compression_methods ());
  808. #endif
  809. ssl_ctx_noverify = SSL_CTX_new (SSLv23_method ());
  810. SSL_CTX_set_verify (ssl_ctx_noverify, SSL_VERIFY_NONE, NULL);
  811. SSL_CTX_set_options (ssl_ctx_noverify, ssl_options);
  812. #ifdef SSL_SESS_CACHE_BOTH
  813. SSL_CTX_set_session_cache_mode (ssl_ctx_noverify, SSL_SESS_CACHE_BOTH);
  814. #endif
  815. return ssl_ctx_noverify;
  816. }