TLSSocket.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "TLSSocket.h"
  2. #include "X509Bundle.h"
  3. /**
  4. * Platform TLSSocket implementation for the mbedtls
  5. */
  6. bell::TLSSocket::TLSSocket() {
  7. this->isClosed = false;
  8. mbedtls_net_init(&server_fd);
  9. mbedtls_ssl_init(&ssl);
  10. mbedtls_ssl_config_init(&conf);
  11. if (bell::X509Bundle::shouldVerify()) {
  12. bell::X509Bundle::attach(&conf);
  13. }
  14. mbedtls_ctr_drbg_init(&ctr_drbg);
  15. mbedtls_entropy_init(&entropy);
  16. const char* pers = "euphonium";
  17. int ret;
  18. if ((ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
  19. (const unsigned char*)pers, strlen(pers))) !=
  20. 0) {
  21. BELL_LOG(error, "http_tls",
  22. "failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret);
  23. throw std::runtime_error("mbedtls_ctr_drbg_seed failed");
  24. }
  25. }
  26. void bell::TLSSocket::open(const std::string& hostUrl, uint16_t port) {
  27. int ret;
  28. if ((ret = mbedtls_net_connect(&server_fd, hostUrl.c_str(),
  29. std::to_string(port).c_str(),
  30. MBEDTLS_NET_PROTO_TCP)) != 0) {
  31. BELL_LOG(error, "http_tls", "failed! connect returned %d\n", ret);
  32. }
  33. if ((ret = mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,
  34. MBEDTLS_SSL_TRANSPORT_STREAM,
  35. MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
  36. BELL_LOG(error, "http_tls", "failed! config returned %d\n", ret);
  37. throw std::runtime_error("mbedtls_ssl_config_defaults failed");
  38. }
  39. // Only verify if the X509 bundle is present
  40. if (bell::X509Bundle::shouldVerify()) {
  41. mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);
  42. } else {
  43. mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_NONE);
  44. }
  45. mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
  46. mbedtls_ssl_setup(&ssl, &conf);
  47. if ((ret = mbedtls_ssl_set_hostname(&ssl, hostUrl.c_str())) != 0) {
  48. throw std::runtime_error("mbedtls_ssl_set_hostname failed");
  49. }
  50. mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv,
  51. NULL);
  52. while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
  53. if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
  54. BELL_LOG(error, "http_tls", "failed! config returned %d\n", ret);
  55. throw std::runtime_error("mbedtls_ssl_handshake error");
  56. }
  57. }
  58. }
  59. size_t bell::TLSSocket::read(uint8_t* buf, size_t len) {
  60. return mbedtls_ssl_read(&ssl, buf, len);
  61. }
  62. size_t bell::TLSSocket::write(uint8_t* buf, size_t len) {
  63. return mbedtls_ssl_write(&ssl, buf, len);
  64. }
  65. size_t bell::TLSSocket::poll() {
  66. return mbedtls_ssl_get_bytes_avail(&ssl);
  67. }
  68. bool bell::TLSSocket::isOpen() {
  69. return !isClosed;
  70. }
  71. void bell::TLSSocket::close() {
  72. if (!isClosed) {
  73. mbedtls_net_free(&server_fd);
  74. mbedtls_ssl_free(&ssl);
  75. mbedtls_ssl_config_free(&conf);
  76. mbedtls_ctr_drbg_free(&ctr_drbg);
  77. mbedtls_entropy_free(&entropy);
  78. this->isClosed = true;
  79. }
  80. }