Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(672)

Unified Diff: webrtc/pc/mediasession.cc

Issue 2761143002: Support encrypted RTP extensions (RFC 6904) (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/pc/mediasession.cc
diff --git a/webrtc/pc/mediasession.cc b/webrtc/pc/mediasession.cc
index dbd32566d523d3d67d8ca3be8fee17e7190fcf9f..1f0b05f04554b7751d9e81cb101986d2748c7b34 100644
--- a/webrtc/pc/mediasession.cc
+++ b/webrtc/pc/mediasession.cc
@@ -945,6 +945,32 @@ static bool FindByUri(const RtpHeaderExtensions& extensions,
return false;
}
+static bool FindByUriPreferEncrypted(const RtpHeaderExtensions& extensions,
Taylor Brandstetter 2017/03/22 18:00:11 nit: This name sounds like it always prefers encry
joachim 2017/03/23 00:04:33 Done.
+ const webrtc::RtpExtension& ext_to_match,
+ bool prefer_encrypted,
+ webrtc::RtpExtension* found_extension) {
+ const webrtc::RtpExtension* regular_extension = nullptr;
+ for (RtpHeaderExtensions::const_iterator it = extensions.begin();
+ it != extensions.end(); ++it) {
+ // We assume that all URIs are given in a canonical format.
+ if (it->uri == ext_to_match.uri) {
+ if (!found_extension) {
+ return true;
+ }
+ if (!prefer_encrypted || it->encrypted) {
+ *found_extension = *it;
+ return true;
+ }
+ regular_extension = &(*it);
+ }
+ }
+ if (regular_extension) {
+ *found_extension = *regular_extension;
+ return true;
+ }
+ return false;
+}
+
// Iterates through |offered_extensions|, adding each one to |all_extensions|
// and |used_ids|, and resolving ID conflicts. If an offered extension has the
// same URI as one in |all_extensions|, it will re-use the same ID and won't be
@@ -984,15 +1010,35 @@ static void FindRtpHdrExtsToOffer(
}
}
+static void AddEncryptedHdrExts(RtpHeaderExtensions* extensions,
+ UsedRtpHeaderExtensionIds* used_ids) {
pthatcher1 2017/03/21 07:07:06 This should probably be called something like AddE
joachim 2017/03/23 00:04:33 Done.
+ RtpHeaderExtensions encrypted_extensions;
+ for (const webrtc::RtpExtension& extension : *extensions) {
+ if (extension.encrypted ||
+ !webrtc::RtpExtension::AllowEncrypt(extension.uri)) {
+ continue;
+ }
+
+ webrtc::RtpExtension encrypted(extension);
+ encrypted.encrypted = true;
+ used_ids->FindAndSetIdUsed(&encrypted);
+ encrypted_extensions.push_back(encrypted);
Taylor Brandstetter 2017/03/22 18:00:11 Is there a reason the separate "encrypted_extensio
joachim 2017/03/23 00:04:33 That could invalidate the iterator for "extensions
+ }
+ extensions->insert(extensions->end(), encrypted_extensions.begin(),
+ encrypted_extensions.end());
+}
+
static void NegotiateRtpHeaderExtensions(
const RtpHeaderExtensions& local_extensions,
const RtpHeaderExtensions& offered_extensions,
+ bool enable_rtp_header_encryption,
RtpHeaderExtensions* negotiated_extenstions) {
RtpHeaderExtensions::const_iterator ours;
for (ours = local_extensions.begin();
ours != local_extensions.end(); ++ours) {
webrtc::RtpExtension theirs;
- if (FindByUri(offered_extensions, *ours, &theirs)) {
+ if (FindByUriPreferEncrypted(offered_extensions, *ours,
+ enable_rtp_header_encryption, &theirs)) {
// We respond with their RTP header extension id.
negotiated_extenstions->push_back(theirs);
}
@@ -1027,6 +1073,7 @@ static bool CreateMediaContentAnswer(
const SecurePolicy& sdes_policy,
const CryptoParamsVec* current_cryptos,
const RtpHeaderExtensions& local_rtp_extenstions,
+ bool enable_rtp_header_encryption,
StreamParamsVec* current_streams,
bool add_legacy_stream,
bool bundle_enabled,
@@ -1038,6 +1085,7 @@ static bool CreateMediaContentAnswer(
RtpHeaderExtensions negotiated_rtp_extensions;
NegotiateRtpHeaderExtensions(local_rtp_extenstions,
offer->rtp_header_extensions(),
+ enable_rtp_header_encryption,
&negotiated_rtp_extensions);
answer->set_rtp_header_extensions(negotiated_rtp_extensions);
@@ -1605,6 +1653,10 @@ void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer(
&all_extensions, &used_ids);
FindRtpHdrExtsToOffer(video_rtp_header_extensions(), video_extensions,
&all_extensions, &used_ids);
+ if (enable_rtp_header_encryption_) {
+ AddEncryptedHdrExts(audio_extensions, &used_ids);
+ AddEncryptedHdrExts(video_extensions, &used_ids);
pthatcher1 2017/03/21 07:07:06 Why are we storing two copies of the header extens
Taylor Brandstetter 2017/03/22 18:00:11 I don't have a problem with storing two copies. Th
joachim 2017/03/23 00:04:33 I think this would just move the complexity to "Fi
joachim 2017/03/23 00:04:33 The encrypted extensions are using a different id,
+ }
}
bool MediaSessionDescriptionFactory::AddTransportOffer(
@@ -1878,6 +1930,7 @@ bool MediaSessionDescriptionFactory::AddAudioContentForAnswer(
sdes_policy,
GetCryptos(GetFirstAudioContentDescription(current_description)),
audio_rtp_extensions_,
+ enable_rtp_header_encryption_,
current_streams,
add_legacy_,
bundle_enabled,
@@ -1934,6 +1987,7 @@ bool MediaSessionDescriptionFactory::AddVideoContentForAnswer(
sdes_policy,
GetCryptos(GetFirstVideoContentDescription(current_description)),
video_rtp_extensions_,
+ enable_rtp_header_encryption_,
current_streams,
add_legacy_,
bundle_enabled,
@@ -1995,6 +2049,7 @@ bool MediaSessionDescriptionFactory::AddDataContentForAnswer(
sdes_policy,
GetCryptos(GetFirstDataContentDescription(current_description)),
RtpHeaderExtensions(),
+ enable_rtp_header_encryption_,
current_streams,
add_legacy_,
bundle_enabled,

Powered by Google App Engine
This is Rietveld 408576698