tls.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. #include <config.h>
  2. #ifdef WITH_TLS
  3. # ifndef IN_TLS_C
  4. # define IN_TLS_C 1
  5. # endif
  6. # include "ftpd.h"
  7. # include "tls.h"
  8. # include "ftpwho-update.h"
  9. # include "globals.h"
  10. # include "messages.h"
  11. # include "alt_arc4random.h"
  12. # include "tls_extcert.h"
  13. static void tls_error(const int line, int err)
  14. {
  15. if (err == 0) {
  16. err = ERR_get_error();
  17. }
  18. if (err != 0) {
  19. logfile(LOG_ERR, "TLS [%s](%d): %s",
  20. cert_file, line, ERR_error_string(err, NULL));
  21. }
  22. _EXIT(EXIT_FAILURE);
  23. }
  24. static int validate_sni_name(const char * const sni_name)
  25. {
  26. static const char *valid_chars =
  27. "abcdefghijklmnopqrstuvwxyz.-0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  28. const char *pnt = sni_name;
  29. if (strlen(sni_name) > 255) {
  30. return -1;
  31. }
  32. while (*pnt != 0) {
  33. if (strchr(valid_chars, *pnt) == NULL) {
  34. return -1;
  35. }
  36. pnt++;
  37. }
  38. return 0;
  39. }
  40. static int tls_create_new_context(const char *cert_file,
  41. const char *key_file);
  42. static int ssl_servername_cb(SSL *cnx, int *al, void *arg)
  43. {
  44. CertResult result;
  45. const char *sni_name;
  46. (void) al;
  47. (void) arg;
  48. if ((sni_name = SSL_get_servername(cnx, TLSEXT_NAMETYPE_host_name))
  49. == NULL || *sni_name == 0 || validate_sni_name(sni_name) != 0) {
  50. return SSL_TLSEXT_ERR_NOACK;
  51. }
  52. logfile(LOG_INFO, "SNI: [%s]", sni_name);
  53. if (chrooted != 0 || loggedin != 0) {
  54. return SSL_TLSEXT_ERR_NOACK;
  55. }
  56. if (use_extcert == 0) {
  57. return SSL_TLSEXT_ERR_OK;
  58. }
  59. memset(&result, 0, sizeof result);
  60. tls_extcert_get(&result, sni_name);
  61. if (result.cert_ok != 1) {
  62. die(400, LOG_ERR, "Cert handler not ready");
  63. }
  64. if (result.action == CERT_ACTION_DENY) {
  65. die(400, LOG_INFO, MSG_LOGOUT);
  66. }
  67. if (result.action == CERT_ACTION_DEFAULT) {
  68. return SSL_TLSEXT_ERR_OK;
  69. }
  70. if (result.cert_file == NULL) {
  71. if (result.action == CERT_ACTION_STRICT) {
  72. die(400, LOG_ERR, "Missing certificate");
  73. } else {
  74. return SSL_TLSEXT_ERR_OK;
  75. }
  76. }
  77. if (result.key_file == NULL) {
  78. result.key_file = result.cert_file;
  79. }
  80. SSL_CTX_free(tls_ctx);
  81. tls_ctx = NULL;
  82. if (tls_create_new_context(result.cert_file, result.key_file) != 0) {
  83. if (result.action != CERT_ACTION_FALLBACK) {
  84. die(400, LOG_ERR, "Invalid certificate");
  85. }
  86. if (tls_create_new_context(cert_file, key_file) != 0) {
  87. die(400, LOG_ERR, "SSL error");
  88. }
  89. }
  90. if ((client_sni_name = strdup(sni_name)) == NULL) {
  91. die_mem();
  92. }
  93. if (tls_cnx != NULL) {
  94. const long ctx_options = SSL_CTX_get_options(tls_ctx);
  95. SSL_set_SSL_CTX(tls_cnx, tls_ctx);
  96. # ifdef SSL_CTRL_CLEAR_OPTIONS
  97. SSL_clear_options(tls_cnx,
  98. SSL_get_options(tls_cnx) & ~ctx_options);
  99. # endif
  100. SSL_set_options(tls_cnx, ctx_options);
  101. }
  102. if (tls_data_cnx != NULL) {
  103. const long ctx_options = SSL_CTX_get_options(tls_ctx);
  104. SSL_set_SSL_CTX(tls_data_cnx, tls_ctx);
  105. # ifdef SSL_CTRL_CLEAR_OPTIONS
  106. SSL_clear_options(tls_data_cnx,
  107. SSL_get_options(tls_cnx) & ~ctx_options);
  108. # endif
  109. SSL_set_options(tls_data_cnx, ctx_options);
  110. }
  111. return SSL_TLSEXT_ERR_OK;
  112. }
  113. static void ssl_info_cb(const SSL *cnx, int where, int ret)
  114. {
  115. (void) ret;
  116. if ((where & SSL_CB_HANDSHAKE_DONE) != 0) {
  117. if (cnx == tls_cnx) {
  118. tls_cnx_handshook = 1;
  119. } else if (cnx == tls_data_cnx) {
  120. tls_data_cnx_handshook = 1;
  121. }
  122. }
  123. }
  124. static int tls_init_ecdh_curve(void)
  125. {
  126. #ifdef SSL_CTRL_SET_ECDH_AUTO
  127. SSL_CTX_ctrl(tls_ctx, SSL_CTRL_SET_ECDH_AUTO, 1, NULL);
  128. return 0;
  129. #else
  130. # ifndef SSL_OP_SINGLE_ECDH_USE
  131. errno = ENOTSUP;
  132. return -1;
  133. # else
  134. const char *curve_name;
  135. EC_KEY *curve;
  136. int nid;
  137. curve_name = TLS_DEFAULT_ECDH_CURVE;
  138. if ((nid = OBJ_sn2nid(curve_name)) == NID_undef) {
  139. logfile(LOG_INFO, "Curve [%s] not supported", curve_name);
  140. errno = ENOTSUP;
  141. return -1;
  142. }
  143. if ((curve = EC_KEY_new_by_curve_name(nid)) == NULL) {
  144. logfile(LOG_INFO, "Curve [%s] is not usable", curve_name);
  145. errno = ENOTSUP;
  146. return -1;
  147. }
  148. SSL_CTX_set_options(tls_ctx, SSL_OP_SINGLE_ECDH_USE);
  149. SSL_CTX_set_tmp_ecdh(tls_ctx, curve);
  150. EC_KEY_free(curve);
  151. return 0;
  152. # endif
  153. #endif
  154. }
  155. #ifndef SSL_CTRL_SET_DH_AUTO
  156. static int tls_load_dhparams_default(void)
  157. {
  158. # ifdef HAVE_DH_GET_2048_256
  159. DH *dh;
  160. if ((dh = DH_get_2048_256()) == NULL) {
  161. die_mem();
  162. }
  163. # else
  164. # if BN_BITS2 == 64
  165. static const BN_ULONG dh2048_256_p[] = {
  166. 0xDB094AE91E1A1597ULL, 0x693877FAD7EF09CAULL, 0x6116D2276E11715FULL,
  167. 0xA4B54330C198AF12ULL, 0x75F26375D7014103ULL, 0xC3A3960A54E710C3ULL,
  168. 0xDED4010ABD0BE621ULL, 0xC0B857F689962856ULL, 0xB3CA3F7971506026ULL,
  169. 0x1CCACB83E6B486F6ULL, 0x67E144E514056425ULL, 0xF6A167B5A41825D9ULL,
  170. 0x3AD8347796524D8EULL, 0xF13C6D9A51BFA4ABULL, 0x2D52526735488A0EULL,
  171. 0xB63ACAE1CAA6B790ULL, 0x4FDB70C581B23F76ULL, 0xBC39A0BF12307F5CULL,
  172. 0xB941F54EB1E59BB8ULL, 0x6C5BFC11D45F9088ULL, 0x22E0B1EF4275BF7BULL,
  173. 0x91F9E6725B4758C0ULL, 0x5A8A9D306BCF67EDULL, 0x209E0C6497517ABDULL,
  174. 0x3BF4296D830E9A7CULL, 0x16C3D91134096FAAULL, 0xFAF7DF4561B2AA30ULL,
  175. 0xE00DF8F1D61957D4ULL, 0x5D2CEED4435E3B00ULL, 0x8CEEF608660DD0F2ULL,
  176. 0xFFBBD19C65195999ULL, 0x87A8E61DB4B6663CULL
  177. };
  178. static const BN_ULONG dh2048_256_g[] = {
  179. 0x664B4C0F6CC41659ULL, 0x5E2327CFEF98C582ULL, 0xD647D148D4795451ULL,
  180. 0x2F63078490F00EF8ULL, 0x184B523D1DB246C3ULL, 0xC7891428CDC67EB6ULL,
  181. 0x7FD028370DF92B52ULL, 0xB3353BBB64E0EC37ULL, 0xECD06E1557CD0915ULL,
  182. 0xB7D2BBD2DF016199ULL, 0xC8484B1E052588B9ULL, 0xDB2A3B7313D3FE14ULL,
  183. 0xD052B985D182EA0AULL, 0xA4BD1BFFE83B9C80ULL, 0xDFC967C1FB3F2E55ULL,
  184. 0xB5045AF2767164E1ULL, 0x1D14348F6F2F9193ULL, 0x64E67982428EBC83ULL,
  185. 0x8AC376D282D6ED38ULL, 0x777DE62AAAB8A862ULL, 0xDDF463E5E9EC144BULL,
  186. 0x0196F931C77A57F2ULL, 0xA55AE31341000A65ULL, 0x901228F8C28CBB18ULL,
  187. 0xBC3773BF7E8C6F62ULL, 0xBE3A6C1B0C6B47B1ULL, 0xFF4FED4AAC0BB555ULL,
  188. 0x10DBC15077BE463FULL, 0x07F4793A1A0BA125ULL, 0x4CA7B18F21EF2054ULL,
  189. 0x2E77506660EDBD48ULL, 0x3FB32C9B73134D0BULL
  190. };
  191. static const BN_ULONG dh2048_256_q[] = {
  192. 0xA308B0FE64F5FBD3ULL, 0x99B1A47D1EB3750BULL, 0xB447997640129DA2ULL,
  193. 0x8CF83642A709A097ULL
  194. };
  195. # elif BN_BITS2 == 32
  196. static const BN_ULONG dh2048_256_p[] = {
  197. 0x1E1A1597, 0xDB094AE9, 0xD7EF09CA, 0x693877FA, 0x6E11715F, 0x6116D227,
  198. 0xC198AF12, 0xA4B54330, 0xD7014103, 0x75F26375, 0x54E710C3, 0xC3A3960A,
  199. 0xBD0BE621, 0xDED4010A, 0x89962856, 0xC0B857F6, 0x71506026, 0xB3CA3F79,
  200. 0xE6B486F6, 0x1CCACB83, 0x14056425, 0x67E144E5, 0xA41825D9, 0xF6A167B5,
  201. 0x96524D8E, 0x3AD83477, 0x51BFA4AB, 0xF13C6D9A, 0x35488A0E, 0x2D525267,
  202. 0xCAA6B790, 0xB63ACAE1, 0x81B23F76, 0x4FDB70C5, 0x12307F5C, 0xBC39A0BF,
  203. 0xB1E59BB8, 0xB941F54E, 0xD45F9088, 0x6C5BFC11, 0x4275BF7B, 0x22E0B1EF,
  204. 0x5B4758C0, 0x91F9E672, 0x6BCF67ED, 0x5A8A9D30, 0x97517ABD, 0x209E0C64,
  205. 0x830E9A7C, 0x3BF4296D, 0x34096FAA, 0x16C3D911, 0x61B2AA30, 0xFAF7DF45,
  206. 0xD61957D4, 0xE00DF8F1, 0x435E3B00, 0x5D2CEED4, 0x660DD0F2, 0x8CEEF608,
  207. 0x65195999, 0xFFBBD19C, 0xB4B6663C, 0x87A8E61D
  208. };
  209. static const BN_ULONG dh2048_256_g[] = {
  210. 0x6CC41659, 0x664B4C0F, 0xEF98C582, 0x5E2327CF, 0xD4795451, 0xD647D148,
  211. 0x90F00EF8, 0x2F630784, 0x1DB246C3, 0x184B523D, 0xCDC67EB6, 0xC7891428,
  212. 0x0DF92B52, 0x7FD02837, 0x64E0EC37, 0xB3353BBB, 0x57CD0915, 0xECD06E15,
  213. 0xDF016199, 0xB7D2BBD2, 0x052588B9, 0xC8484B1E, 0x13D3FE14, 0xDB2A3B73,
  214. 0xD182EA0A, 0xD052B985, 0xE83B9C80, 0xA4BD1BFF, 0xFB3F2E55, 0xDFC967C1,
  215. 0x767164E1, 0xB5045AF2, 0x6F2F9193, 0x1D14348F, 0x428EBC83, 0x64E67982,
  216. 0x82D6ED38, 0x8AC376D2, 0xAAB8A862, 0x777DE62A, 0xE9EC144B, 0xDDF463E5,
  217. 0xC77A57F2, 0x0196F931, 0x41000A65, 0xA55AE313, 0xC28CBB18, 0x901228F8,
  218. 0x7E8C6F62, 0xBC3773BF, 0x0C6B47B1, 0xBE3A6C1B, 0xAC0BB555, 0xFF4FED4A,
  219. 0x77BE463F, 0x10DBC150, 0x1A0BA125, 0x07F4793A, 0x21EF2054, 0x4CA7B18F,
  220. 0x60EDBD48, 0x2E775066, 0x73134D0B, 0x3FB32C9B
  221. };
  222. static const BN_ULONG dh2048_256_q[] = {
  223. 0x64F5FBD3, 0xA308B0FE, 0x1EB3750B, 0x99B1A47D, 0x40129DA2, 0xB4479976,
  224. 0xA709A097, 0x8CF83642
  225. };
  226. # else
  227. # error "unsupported BN_BITS2"
  228. # endif
  229. static const BIGNUM p = {
  230. (BN_ULONG *) dh2048_256_p,
  231. sizeof(dh2048_256_p) / sizeof(BN_ULONG),
  232. sizeof(dh2048_256_p) / sizeof(BN_ULONG),
  233. 0, BN_FLG_STATIC_DATA
  234. };
  235. static const BIGNUM g = {
  236. (BN_ULONG *) dh2048_256_g,
  237. sizeof(dh2048_256_g) / sizeof(BN_ULONG),
  238. sizeof(dh2048_256_g) / sizeof(BN_ULONG),
  239. 0, BN_FLG_STATIC_DATA
  240. };
  241. static const BIGNUM q = {
  242. (BN_ULONG *) dh2048_256_q,
  243. sizeof(dh2048_256_q) / sizeof(BN_ULONG),
  244. sizeof(dh2048_256_q) / sizeof(BN_ULONG),
  245. 0, BN_FLG_STATIC_DATA
  246. };
  247. DH *dh;
  248. if ((dh = DH_new()) == NULL) {
  249. die_mem();
  250. }
  251. dh->p = BN_dup(&p);
  252. dh->g = BN_dup(&g);
  253. dh->q = BN_dup(&q);
  254. if (dh->p == NULL || dh->g == NULL || dh->q == NULL) {
  255. DH_free(dh);
  256. die_mem();
  257. }
  258. # endif
  259. SSL_CTX_set_tmp_dh(tls_ctx, dh);
  260. DH_free(dh);
  261. # ifdef SSL_OP_SINGLE_DH_USE
  262. SSL_CTX_set_options(tls_ctx, SSL_OP_SINGLE_DH_USE);
  263. # endif
  264. return 0;
  265. }
  266. #endif
  267. static int tls_load_dhparams(void)
  268. {
  269. BIO *bio;
  270. DH *dh;
  271. if ((bio = BIO_new_file(TLS_DHPARAMS_FILE, "r")) == NULL) {
  272. logfile(LOG_DEBUG,
  273. "Couldn't load the DH parameters file " TLS_DHPARAMS_FILE);
  274. errno = ENOENT;
  275. return -1;
  276. }
  277. if ((dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)) == NULL) {
  278. die(400, LOG_ERR, "Invalid DH parameters file " TLS_DHPARAMS_FILE);
  279. }
  280. SSL_CTX_set_tmp_dh(tls_ctx, dh);
  281. DH_free(dh);
  282. BIO_free(bio);
  283. return 0;
  284. }
  285. static void tls_init_dhparams(void)
  286. {
  287. # ifdef SSL_CTRL_SET_DH_AUTO
  288. if (tls_load_dhparams() != 0) {
  289. SSL_CTX_ctrl(tls_ctx, SSL_CTRL_SET_DH_AUTO, 1, NULL);
  290. }
  291. # else
  292. if (tls_load_dhparams() != 0) {
  293. tls_load_dhparams_default();
  294. }
  295. # endif
  296. }
  297. static void tls_init_cache(void)
  298. {
  299. static const char *tls_ctx_id = "pure-ftpd";
  300. SSL_CTX_set_session_cache_mode(tls_ctx, SSL_SESS_CACHE_SERVER);
  301. SSL_CTX_set_session_id_context(tls_ctx, (unsigned char *) tls_ctx_id,
  302. (unsigned int) strlen(tls_ctx_id));
  303. SSL_CTX_sess_set_cache_size(tls_ctx, 10);
  304. SSL_CTX_set_timeout(tls_ctx, 60 * 60L);
  305. }
  306. static void tls_init_options(void)
  307. {
  308. static int passes;
  309. # ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
  310. SSL_CTX_set_options(tls_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
  311. # endif
  312. # ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
  313. SSL_CTX_set_options(tls_ctx, SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
  314. # endif
  315. SSL_CTX_set_options(tls_ctx, SSL_OP_NO_SSLv2);
  316. SSL_CTX_set_options(tls_ctx, SSL_OP_NO_SSLv3);
  317. # ifdef SSL_OP_NO_TLSv1
  318. SSL_CTX_set_options(tls_ctx, SSL_OP_NO_TLSv1);
  319. # endif
  320. # ifdef SSL_OP_NO_TLSv1_1
  321. SSL_CTX_set_options(tls_ctx, SSL_OP_NO_TLSv1_1);
  322. # endif
  323. # ifdef SSL_OP_NO_TLSv1_2
  324. SSL_CTX_clear_options(tls_ctx, SSL_OP_NO_TLSv1_2);
  325. # endif
  326. # ifdef SSL_OP_NO_TLSv1_3
  327. SSL_CTX_clear_options(tls_ctx, SSL_OP_NO_TLSv1_3);
  328. # endif
  329. if (tlsciphersuite != NULL) {
  330. if (SSL_CTX_set_cipher_list(tls_ctx, tlsciphersuite) != 1) {
  331. logfile(LOG_ERR, MSG_TLS_CIPHER_FAILED, tlsciphersuite);
  332. _EXIT(EXIT_FAILURE);
  333. }
  334. }
  335. SSL_CTX_set_info_callback(tls_ctx, ssl_info_cb);
  336. if (passes == 0) {
  337. SSL_CTX_set_tlsext_servername_callback(tls_ctx, ssl_servername_cb);
  338. passes++;
  339. }
  340. SSL_CTX_set_verify_depth(tls_ctx, MAX_CERTIFICATE_DEPTH);
  341. }
  342. static void tls_load_cert_file(const char * const cert_file,
  343. const char * const key_file)
  344. {
  345. if (SSL_CTX_use_certificate_chain_file(tls_ctx, cert_file) != 1) {
  346. die(421, LOG_ERR,
  347. MSG_FILE_DOESNT_EXIST ": [%s]", cert_file);
  348. }
  349. if (SSL_CTX_use_PrivateKey_file(tls_ctx, key_file,
  350. SSL_FILETYPE_PEM) != 1) {
  351. die(421, LOG_ERR,
  352. MSG_FILE_DOESNT_EXIST ": [%s]", key_file);
  353. }
  354. if (SSL_CTX_check_private_key(tls_ctx) != 1) {
  355. tls_error(__LINE__, 0);
  356. }
  357. }
  358. static void tls_init_client_cert_verification(const char *cert_file)
  359. {
  360. if (cert_file == NULL) {
  361. tls_error(__LINE__, 0);
  362. }
  363. SSL_CTX_set_verify(tls_ctx, SSL_VERIFY_FAIL_IF_NO_PEER_CERT |
  364. SSL_VERIFY_PEER, NULL);
  365. if (SSL_CTX_load_verify_locations(tls_ctx, cert_file, NULL) != 1) {
  366. tls_error(__LINE__, 0);
  367. }
  368. }
  369. static int tls_create_new_context(const char *cert_file,
  370. const char *key_file)
  371. {
  372. # ifdef HAVE_TLS_SERVER_METHOD
  373. if ((tls_ctx = SSL_CTX_new(TLS_server_method())) == NULL) {
  374. tls_error(__LINE__, 0);
  375. }
  376. # else
  377. if ((tls_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) {
  378. tls_error(__LINE__, 0);
  379. }
  380. # endif
  381. tls_init_options();
  382. tls_init_cache();
  383. tls_load_cert_file(cert_file, key_file);
  384. if (ssl_verify_client_cert) {
  385. tls_init_client_cert_verification(cert_file);
  386. }
  387. tls_init_ecdh_curve();
  388. tls_init_dhparams();
  389. return 0;
  390. }
  391. static void tls_init_rnd(void)
  392. {
  393. unsigned int rnd;
  394. while (RAND_status() == 0) {
  395. rnd = zrand();
  396. RAND_seed(&rnd, (int) sizeof rnd);
  397. }
  398. }
  399. int tls_init_library(void)
  400. {
  401. tls_cnx = NULL;
  402. tls_data_cnx = NULL;
  403. tls_ctx = NULL;
  404. # if (OPENSSL_VERSION_NUMBER < 0x10100000L) || !defined(OPENSSL_INIT_LOAD_SSL_STRINGS)
  405. SSL_library_init();
  406. SSL_load_error_strings();
  407. OpenSSL_add_all_algorithms();
  408. # else
  409. OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS |
  410. OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
  411. OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS |
  412. OPENSSL_INIT_ADD_ALL_DIGESTS |
  413. OPENSSL_INIT_LOAD_CONFIG, NULL);
  414. # endif
  415. tls_init_rnd();
  416. tls_create_new_context(cert_file, key_file);
  417. tls_cnx_handshook = 0;
  418. tls_data_cnx_handshook = 0;
  419. return 0;
  420. }
  421. void tls_free_library(void)
  422. {
  423. if (tls_data_cnx != NULL) {
  424. tls_close_session(&tls_data_cnx);
  425. }
  426. if (tls_cnx != NULL) {
  427. SSL_free(tls_cnx);
  428. tls_cnx = NULL;
  429. }
  430. if (tls_ctx != NULL) {
  431. SSL_CTX_free(tls_ctx);
  432. tls_ctx = NULL;
  433. }
  434. # if OPENSSL_API_COMPAT < 0x10100000L
  435. EVP_cleanup();
  436. # endif
  437. }
  438. int tls_init_new_session(void)
  439. {
  440. const SSL_CIPHER *cipher;
  441. int ret;
  442. int ret_;
  443. if (tls_ctx == NULL || (tls_cnx = SSL_new(tls_ctx)) == NULL) {
  444. tls_error(__LINE__, 0);
  445. }
  446. if (SSL_set_fd(tls_cnx, clientfd) != 1) {
  447. tls_error(__LINE__, 0);
  448. }
  449. SSL_set_accept_state(tls_cnx);
  450. for (;;) {
  451. ret = SSL_accept(tls_cnx);
  452. if (ret != 1) {
  453. ret_ = SSL_get_error(tls_cnx, ret);
  454. if (ret == -1 &&
  455. (ret_ == SSL_ERROR_WANT_READ ||
  456. ret_ == SSL_ERROR_WANT_WRITE)) {
  457. continue;
  458. }
  459. die(400, LOG_WARNING, MSG_TLS_NEEDED);
  460. }
  461. break;
  462. }
  463. if ((cipher = SSL_get_current_cipher(tls_cnx)) != NULL) {
  464. int strength_bits = SSL_CIPHER_get_bits(cipher, NULL);
  465. logfile(LOG_INFO, MSG_TLS_INFO, SSL_CIPHER_get_version(cipher),
  466. SSL_CIPHER_get_name(cipher), strength_bits);
  467. if (strength_bits < MINIMAL_CIPHER_STRENGTH_BITS) {
  468. die(534, LOG_ERR, MSG_TLS_WEAK);
  469. }
  470. }
  471. return 0;
  472. }
  473. int tls_init_data_session(const int fd, const int passive)
  474. {
  475. const SSL_CIPHER *cipher;
  476. int ret;
  477. int ret_;
  478. (void) passive;
  479. if (tls_ctx == NULL) {
  480. logfile(LOG_ERR, MSG_TLS_NO_CTX);
  481. tls_error(__LINE__, 0);
  482. }
  483. if (tls_data_cnx != NULL) {
  484. tls_close_session(&tls_data_cnx);
  485. } else if ((tls_data_cnx = SSL_new(tls_ctx)) == NULL) {
  486. tls_error(__LINE__, 0);
  487. }
  488. if (SSL_set_fd(tls_data_cnx, fd) != 1) {
  489. tls_error(__LINE__, 0);
  490. }
  491. SSL_set_accept_state(tls_data_cnx);
  492. for (;;) {
  493. ret = SSL_accept(tls_data_cnx);
  494. if (ret <= 0) {
  495. ret_ = SSL_get_error(tls_data_cnx, ret);
  496. if (ret == -1 && (ret_ == SSL_ERROR_WANT_READ ||
  497. ret_ == SSL_ERROR_WANT_WRITE)) {
  498. continue;
  499. }
  500. logfile(LOG_INFO, MSG_LOGOUT);
  501. _EXIT(EXIT_FAILURE);
  502. }
  503. break;
  504. }
  505. if ((cipher = SSL_get_current_cipher(tls_data_cnx)) != NULL) {
  506. int strength_bits = SSL_CIPHER_get_bits(cipher, NULL);
  507. logfile(LOG_INFO, MSG_TLS_INFO, SSL_CIPHER_get_version(cipher),
  508. SSL_CIPHER_get_name(cipher), strength_bits);
  509. if (strength_bits < MINIMAL_CIPHER_STRENGTH_BITS) {
  510. die(534, LOG_ERR, MSG_TLS_WEAK);
  511. }
  512. }
  513. return 0;
  514. }
  515. void tls_close_session(SSL ** const cnx)
  516. {
  517. unsigned int retries = 10U;
  518. unsigned int max_shutdowns = 2;
  519. if (*cnx == NULL) {
  520. return;
  521. }
  522. retry:
  523. switch (SSL_shutdown(*cnx)) {
  524. case 0:
  525. if (--max_shutdowns > 0) {
  526. goto retry;
  527. }
  528. case 1:
  529. break;
  530. default: {
  531. switch (SSL_get_error(*cnx, -1)) {
  532. case SSL_ERROR_WANT_READ:
  533. case SSL_ERROR_WANT_WRITE: {
  534. struct pollfd pfd;
  535. pfd.fd = SSL_get_fd(*cnx);
  536. pfd.events = POLLIN | POLLOUT | POLLERR | POLLHUP;
  537. pfd.revents = 0;
  538. if (poll(&pfd, 1U, idletime * 1000UL) > 0 && retries-- > 0U) {
  539. goto retry;
  540. }
  541. }
  542. }
  543. if (SSL_clear(*cnx) == 1) {
  544. break;
  545. }
  546. tls_error(__LINE__, 0);
  547. }
  548. }
  549. if (*cnx == tls_cnx) {
  550. tls_cnx_handshook = 0;
  551. } else if (*cnx == tls_data_cnx) {
  552. tls_data_cnx_handshook = 0;
  553. }
  554. SSL_free(*cnx);
  555. *cnx = NULL;
  556. }
  557. #endif