diff --git a/p2p/base/dtls_transport.cc b/p2p/base/dtls_transport.cc index 60d41a8441..66968415fd 100644 --- a/p2p/base/dtls_transport.cc +++ b/p2p/base/dtls_transport.cc @@ -355,7 +355,7 @@ std::unique_ptr DtlsTransport::GetRemoteSSLCertChain() } bool DtlsTransport::ExportSrtpKeyingMaterial( - rtc::ZeroOnFreeBuffer& keying_material) { + rtc::ZeroOnFreeBuffer& keying_material) { return dtls_ ? dtls_->ExportSrtpKeyingMaterial(keying_material) : false; } @@ -368,7 +368,7 @@ bool DtlsTransport::ExportKeyingMaterial(absl::string_view label, RTC_DCHECK(!context); RTC_DCHECK_EQ(context_len, 0u); RTC_DCHECK_EQ(use_context, false); - rtc::ZeroOnFreeBuffer temporary_result(result_len); + rtc::ZeroOnFreeBuffer temporary_result(result_len); if (ExportSrtpKeyingMaterial(temporary_result)) { std::memcpy(result, temporary_result.data(), result_len); return true; diff --git a/p2p/base/dtls_transport.h b/p2p/base/dtls_transport.h index a317275c9d..e33766f388 100644 --- a/p2p/base/dtls_transport.h +++ b/p2p/base/dtls_transport.h @@ -180,7 +180,7 @@ class DtlsTransport : public DtlsTransportInternal { // method extracts the keys negotiated during the DTLS handshake, for use in // external encryption. DTLS-SRTP uses this to extract the needed SRTP keys. bool ExportSrtpKeyingMaterial( - rtc::ZeroOnFreeBuffer& keying_material) override; + rtc::ZeroOnFreeBuffer& keying_material) override; [[deprecated("Use ExportSrtpKeyingMaterial instead")]] bool ExportKeyingMaterial(absl::string_view label, diff --git a/p2p/base/dtls_transport_internal.h b/p2p/base/dtls_transport_internal.h index 69881dd9c6..4a182c2398 100644 --- a/p2p/base/dtls_transport_internal.h +++ b/p2p/base/dtls_transport_internal.h @@ -90,7 +90,7 @@ class DtlsTransportInternal : public rtc::PacketTransportInternal { // Allows key material to be extracted for external encryption. virtual bool ExportSrtpKeyingMaterial( - rtc::ZeroOnFreeBuffer& keying_material) = 0; + rtc::ZeroOnFreeBuffer& keying_material) = 0; [[deprecated("Use ExportSrtpKeyingMaterial instead")]] virtual bool ExportKeyingMaterial(absl::string_view label, diff --git a/p2p/base/dtls_transport_unittest.cc b/p2p/base/dtls_transport_unittest.cc index c57942113a..d7f7c608de 100644 --- a/p2p/base/dtls_transport_unittest.cc +++ b/p2p/base/dtls_transport_unittest.cc @@ -469,15 +469,14 @@ TEST_F(DtlsTransportTest, KeyingMaterialExporter) { int key_len; int salt_len; EXPECT_TRUE(rtc::GetSrtpKeyAndSaltLengths(crypto_suite, &key_len, &salt_len)); - rtc::ZeroOnFreeBuffer client1_out(2 * (key_len + salt_len)); - rtc::ZeroOnFreeBuffer client2_out(2 * (key_len + salt_len)); + rtc::ZeroOnFreeBuffer client1_out(2 * (key_len + salt_len)); + rtc::ZeroOnFreeBuffer client2_out(2 * (key_len + salt_len)); EXPECT_TRUE(client1_.dtls_transport()->ExportSrtpKeyingMaterial(client1_out)); EXPECT_TRUE(client2_.dtls_transport()->ExportSrtpKeyingMaterial(client2_out)); EXPECT_EQ(client1_out, client2_out); // Legacy variant using the deprecated API. - rtc::ZeroOnFreeBuffer client1_out_legacy(2 * - (key_len + salt_len)); + rtc::ZeroOnFreeBuffer client1_out_legacy(2 * (key_len + salt_len)); EXPECT_TRUE(client1_.dtls_transport()->ExportKeyingMaterial( "EXTRACTOR-dtls_srtp", nullptr, 0, false, client1_out_legacy.data(), client1_out_legacy.size())); diff --git a/p2p/base/fake_dtls_transport.h b/p2p/base/fake_dtls_transport.h index f885165d9d..e68b5e5df8 100644 --- a/p2p/base/fake_dtls_transport.h +++ b/p2p/base/fake_dtls_transport.h @@ -229,7 +229,7 @@ class FakeDtlsTransport : public DtlsTransportInternal { return std::make_unique(remote_cert_->Clone()); } bool ExportSrtpKeyingMaterial( - rtc::ZeroOnFreeBuffer& keying_material) override { + rtc::ZeroOnFreeBuffer& keying_material) override { if (do_dtls_) { std::memset(keying_material.data(), 0xff, keying_material.size()); } diff --git a/pc/dtls_srtp_transport.cc b/pc/dtls_srtp_transport.cc index 7d1cb99061..264f3afddc 100644 --- a/pc/dtls_srtp_transport.cc +++ b/pc/dtls_srtp_transport.cc @@ -155,8 +155,8 @@ void DtlsSrtpTransport::SetupRtpDtlsSrtp() { } int selected_crypto_suite; - rtc::ZeroOnFreeBuffer send_key; - rtc::ZeroOnFreeBuffer recv_key; + rtc::ZeroOnFreeBuffer send_key; + rtc::ZeroOnFreeBuffer recv_key; if (!ExtractParams(rtp_dtls_transport_, &selected_crypto_suite, &send_key, &recv_key) || @@ -184,8 +184,8 @@ void DtlsSrtpTransport::SetupRtcpDtlsSrtp() { } int selected_crypto_suite; - rtc::ZeroOnFreeBuffer rtcp_send_key; - rtc::ZeroOnFreeBuffer rtcp_recv_key; + rtc::ZeroOnFreeBuffer rtcp_send_key; + rtc::ZeroOnFreeBuffer rtcp_recv_key; if (!ExtractParams(rtcp_dtls_transport_, &selected_crypto_suite, &rtcp_send_key, &rtcp_recv_key) || !SetRtcpParams(selected_crypto_suite, rtcp_send_key, send_extension_ids, @@ -198,8 +198,8 @@ void DtlsSrtpTransport::SetupRtcpDtlsSrtp() { bool DtlsSrtpTransport::ExtractParams( cricket::DtlsTransportInternal* dtls_transport, int* selected_crypto_suite, - rtc::ZeroOnFreeBuffer* send_key, - rtc::ZeroOnFreeBuffer* recv_key) { + rtc::ZeroOnFreeBuffer* send_key, + rtc::ZeroOnFreeBuffer* recv_key) { if (!dtls_transport || !dtls_transport->IsDtlsActive()) { return false; } @@ -222,7 +222,7 @@ bool DtlsSrtpTransport::ExtractParams( } // OK, we're now doing DTLS (RFC 5764) - rtc::ZeroOnFreeBuffer dtls_buffer(key_len * 2 + salt_len * 2); + rtc::ZeroOnFreeBuffer dtls_buffer(key_len * 2 + salt_len * 2); // RFC 5705 exporter using the RFC 5764 parameters if (!dtls_transport->ExportSrtpKeyingMaterial(dtls_buffer)) { @@ -232,16 +232,16 @@ bool DtlsSrtpTransport::ExtractParams( } // Sync up the keys with the DTLS-SRTP interface - rtc::ZeroOnFreeBuffer client_write_key(key_len + salt_len); - rtc::ZeroOnFreeBuffer server_write_key(key_len + salt_len); - size_t offset = 0; - memcpy(&client_write_key[0], &dtls_buffer[offset], key_len); - offset += key_len; - memcpy(&server_write_key[0], &dtls_buffer[offset], key_len); - offset += key_len; - memcpy(&client_write_key[key_len], &dtls_buffer[offset], salt_len); - offset += salt_len; - memcpy(&server_write_key[key_len], &dtls_buffer[offset], salt_len); + // https://datatracker.ietf.org/doc/html/rfc5764#section-4.2 + // The keying material is in the format: + // client_write_key|server_write_key|client_write_salt|server_write_salt + rtc::ZeroOnFreeBuffer client_write_key(&dtls_buffer[0], key_len, + key_len + salt_len); + rtc::ZeroOnFreeBuffer server_write_key(&dtls_buffer[key_len], + key_len, key_len + salt_len); + client_write_key.AppendData(&dtls_buffer[key_len + key_len], salt_len); + server_write_key.AppendData(&dtls_buffer[key_len + key_len + salt_len], + salt_len); rtc::SSLRole role; if (!dtls_transport->GetDtlsRole(&role)) { diff --git a/pc/dtls_srtp_transport.h b/pc/dtls_srtp_transport.h index 12c2ffc87e..2b379f55e6 100644 --- a/pc/dtls_srtp_transport.h +++ b/pc/dtls_srtp_transport.h @@ -64,8 +64,8 @@ class DtlsSrtpTransport : public SrtpTransport { void SetupRtcpDtlsSrtp(); bool ExtractParams(cricket::DtlsTransportInternal* dtls_transport, int* selected_crypto_suite, - rtc::ZeroOnFreeBuffer* send_key, - rtc::ZeroOnFreeBuffer* recv_key); + rtc::ZeroOnFreeBuffer* send_key, + rtc::ZeroOnFreeBuffer* recv_key); void SetDtlsTransport(cricket::DtlsTransportInternal* new_dtls_transport, cricket::DtlsTransportInternal** old_dtls_transport); void SetRtpDtlsTransport(cricket::DtlsTransportInternal* rtp_dtls_transport); diff --git a/pc/dtls_srtp_transport_integrationtest.cc b/pc/dtls_srtp_transport_integrationtest.cc index 6c01af5b43..b9a2bb2cbd 100644 --- a/pc/dtls_srtp_transport_integrationtest.cc +++ b/pc/dtls_srtp_transport_integrationtest.cc @@ -9,7 +9,6 @@ */ #include -#include #include "call/rtp_demuxer.h" #include "media/base/fake_rtp.h" @@ -128,24 +127,20 @@ class DtlsSrtpTransportIntegrationTest : public ::testing::Test { &salt_len)); // Extract the keys. The order depends on the role! - rtc::ZeroOnFreeBuffer dtls_buffer(key_len * 2 + - salt_len * 2); + rtc::ZeroOnFreeBuffer dtls_buffer(key_len * 2 + salt_len * 2); ASSERT_TRUE(server_dtls_transport_->ExportSrtpKeyingMaterial(dtls_buffer)); - rtc::ZeroOnFreeBuffer send_key(key_len + salt_len); - rtc::ZeroOnFreeBuffer recv_key(key_len + salt_len); - size_t offset = 0; - std::memcpy(&recv_key[0], &dtls_buffer[offset], key_len); - offset += key_len; - std::memcpy(&send_key[0], &dtls_buffer[offset], key_len); - offset += key_len; - std::memcpy(&recv_key[key_len], &dtls_buffer[offset], salt_len); - offset += salt_len; - std::memcpy(&send_key[key_len], &dtls_buffer[offset], salt_len); + rtc::ZeroOnFreeBuffer client_write_key( + &dtls_buffer[0], key_len, key_len + salt_len); + rtc::ZeroOnFreeBuffer server_write_key( + &dtls_buffer[key_len], key_len, key_len + salt_len); + client_write_key.AppendData(&dtls_buffer[key_len + key_len], salt_len); + server_write_key.AppendData(&dtls_buffer[key_len + key_len + salt_len], + salt_len); - EXPECT_TRUE(srtp_transport_.SetRtpParams(selected_crypto_suite, send_key, - {}, selected_crypto_suite, - recv_key, {})); + EXPECT_TRUE(srtp_transport_.SetRtpParams( + selected_crypto_suite, server_write_key, {}, selected_crypto_suite, + client_write_key, {})); } rtc::CopyOnWriteBuffer CreateRtpPacket() { diff --git a/rtc_base/openssl_stream_adapter.cc b/rtc_base/openssl_stream_adapter.cc index 380bb4a99e..4ee85684f7 100644 --- a/rtc_base/openssl_stream_adapter.cc +++ b/rtc_base/openssl_stream_adapter.cc @@ -384,7 +384,7 @@ bool OpenSSLStreamAdapter::GetSslVersionBytes(int* version) const { } bool OpenSSLStreamAdapter::ExportSrtpKeyingMaterial( - rtc::ZeroOnFreeBuffer& keying_material) { + rtc::ZeroOnFreeBuffer& keying_material) { // Arguments are: // keying material/len -- a buffer to hold the keying material. // label -- the exporter label. diff --git a/rtc_base/openssl_stream_adapter.h b/rtc_base/openssl_stream_adapter.h index 5eb1cd7968..a664d082f3 100644 --- a/rtc_base/openssl_stream_adapter.h +++ b/rtc_base/openssl_stream_adapter.h @@ -110,7 +110,7 @@ class OpenSSLStreamAdapter final : public SSLStreamAdapter { bool GetSslVersionBytes(int* version) const override; // Key Extractor interface bool ExportSrtpKeyingMaterial( - rtc::ZeroOnFreeBuffer& keying_material) override; + rtc::ZeroOnFreeBuffer& keying_material) override; [[deprecated("Use ExportSrtpKeyingMaterial instead")]] bool ExportKeyingMaterial(absl::string_view label, const uint8_t* context, diff --git a/rtc_base/ssl_stream_adapter.h b/rtc_base/ssl_stream_adapter.h index f6a603a0e9..ece5b44ac5 100644 --- a/rtc_base/ssl_stream_adapter.h +++ b/rtc_base/ssl_stream_adapter.h @@ -199,7 +199,7 @@ class SSLStreamAdapter : public StreamInterface { // Key Exporter interface from RFC 5705 virtual bool ExportSrtpKeyingMaterial( - rtc::ZeroOnFreeBuffer& keying_material) = 0; + rtc::ZeroOnFreeBuffer& keying_material) = 0; [[deprecated("Use ExportSrtpKeyingMaterial instead")]] virtual bool ExportKeyingMaterial(absl::string_view label, const uint8_t* context, diff --git a/rtc_base/ssl_stream_adapter_unittest.cc b/rtc_base/ssl_stream_adapter_unittest.cc index 7f340b0e51..2fd9c92043 100644 --- a/rtc_base/ssl_stream_adapter_unittest.cc +++ b/rtc_base/ssl_stream_adapter_unittest.cc @@ -1392,15 +1392,15 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSExporter) { int salt_len; ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(selected_crypto_suite, &key_len, &salt_len)); - rtc::ZeroOnFreeBuffer client_out(2 * (key_len + salt_len)); - rtc::ZeroOnFreeBuffer server_out(2 * (key_len + salt_len)); + rtc::ZeroOnFreeBuffer client_out(2 * (key_len + salt_len)); + rtc::ZeroOnFreeBuffer server_out(2 * (key_len + salt_len)); EXPECT_TRUE(client_ssl_->ExportSrtpKeyingMaterial(client_out)); EXPECT_TRUE(server_ssl_->ExportSrtpKeyingMaterial(server_out)); EXPECT_EQ(client_out, server_out); // Legacy variant. - rtc::ZeroOnFreeBuffer legacy_out(2 * (key_len + salt_len)); + rtc::ZeroOnFreeBuffer legacy_out(2 * (key_len + salt_len)); EXPECT_TRUE(client_ssl_->ExportKeyingMaterial("EXTRACTOR-dtls_srtp", nullptr, 0, false, legacy_out.data(), legacy_out.size()));