verifiedtlstransport.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /**
  2. * Copyright (c) 2020 Paul-Louis Ageneau
  3. *
  4. * This Source Code Form is subject to the terms of the Mozilla Public
  5. * License, v. 2.0. If a copy of the MPL was not distributed with this
  6. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
  7. */
  8. #include "verifiedtlstransport.hpp"
  9. #include "common.hpp"
  10. #if RTC_ENABLE_WEBSOCKET
  11. namespace rtc::impl {
  12. static const string PemBeginCertificateTag = "-----BEGIN CERTIFICATE-----";
  13. VerifiedTlsTransport::VerifiedTlsTransport(
  14. variant<shared_ptr<TcpTransport>, shared_ptr<HttpProxyTransport>> lower, string host,
  15. certificate_ptr certificate, state_callback callback, [[maybe_unused]] optional<string> cacert)
  16. : TlsTransport(std::move(lower), std::move(host), std::move(certificate), std::move(callback)) {
  17. PLOG_DEBUG << "Setting up TLS certificate verification";
  18. #if USE_GNUTLS
  19. gnutls_session_set_verify_cert(mSession, mHost->c_str(), 0);
  20. #elif USE_MBEDTLS
  21. mbedtls_ssl_conf_authmode(&mConf, MBEDTLS_SSL_VERIFY_REQUIRED);
  22. mbedtls_x509_crt_init(&mCaCert);
  23. try {
  24. if (cacert) {
  25. if (cacert->find(PemBeginCertificateTag) == string::npos) {
  26. // *cacert is a file path
  27. mbedtls::check(mbedtls_x509_crt_parse_file(&mCaCert, cacert->c_str()));
  28. } else {
  29. // *cacert is a PEM content
  30. mbedtls::check(mbedtls_x509_crt_parse(
  31. &mCaCert, reinterpret_cast<const unsigned char *>(cacert->c_str()),
  32. cacert->size()));
  33. }
  34. mbedtls_ssl_conf_ca_chain(&mConf, &mCaCert, NULL);
  35. }
  36. } catch (...) {
  37. mbedtls_x509_crt_free(&mCaCert);
  38. throw;
  39. }
  40. #else
  41. if (cacert) {
  42. SSL_CTX_load_verify_file(mCtx, reinterpret_cast<const char *>(cacert->c_str()));
  43. }
  44. SSL_set_verify(mSsl, SSL_VERIFY_PEER, NULL);
  45. SSL_set_verify_depth(mSsl, 4);
  46. #endif
  47. }
  48. VerifiedTlsTransport::~VerifiedTlsTransport() {
  49. stop();
  50. #if USE_MBEDTLS
  51. mbedtls_x509_crt_free(&mCaCert);
  52. #endif
  53. }
  54. } // namespace rtc::impl
  55. #endif