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

Side by Side 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 if (it->uri == ext_to_match.uri) { 938 if (it->uri == ext_to_match.uri) {
939 if (found_extension != NULL) { 939 if (found_extension != NULL) {
940 *found_extension = *it; 940 *found_extension = *it;
941 } 941 }
942 return true; 942 return true;
943 } 943 }
944 } 944 }
945 return false; 945 return false;
946 } 946 }
947 947
948 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.
949 const webrtc::RtpExtension& ext_to_match,
950 bool prefer_encrypted,
951 webrtc::RtpExtension* found_extension) {
952 const webrtc::RtpExtension* regular_extension = nullptr;
953 for (RtpHeaderExtensions::const_iterator it = extensions.begin();
954 it != extensions.end(); ++it) {
955 // We assume that all URIs are given in a canonical format.
956 if (it->uri == ext_to_match.uri) {
957 if (!found_extension) {
958 return true;
959 }
960 if (!prefer_encrypted || it->encrypted) {
961 *found_extension = *it;
962 return true;
963 }
964 regular_extension = &(*it);
965 }
966 }
967 if (regular_extension) {
968 *found_extension = *regular_extension;
969 return true;
970 }
971 return false;
972 }
973
948 // Iterates through |offered_extensions|, adding each one to |all_extensions| 974 // Iterates through |offered_extensions|, adding each one to |all_extensions|
949 // and |used_ids|, and resolving ID conflicts. If an offered extension has the 975 // and |used_ids|, and resolving ID conflicts. If an offered extension has the
950 // same URI as one in |all_extensions|, it will re-use the same ID and won't be 976 // same URI as one in |all_extensions|, it will re-use the same ID and won't be
951 // treated as a conflict. 977 // treated as a conflict.
952 static void FindAndSetRtpHdrExtUsed(RtpHeaderExtensions* offered_extensions, 978 static void FindAndSetRtpHdrExtUsed(RtpHeaderExtensions* offered_extensions,
953 RtpHeaderExtensions* all_extensions, 979 RtpHeaderExtensions* all_extensions,
954 UsedRtpHeaderExtensionIds* used_ids) { 980 UsedRtpHeaderExtensionIds* used_ids) {
955 for (auto& extension : *offered_extensions) { 981 for (auto& extension : *offered_extensions) {
956 webrtc::RtpExtension existing; 982 webrtc::RtpExtension existing;
957 if (FindByUri(*all_extensions, extension, &existing)) { 983 if (FindByUri(*all_extensions, extension, &existing)) {
(...skipping 19 matching lines...) Expand all
977 offered_extensions->push_back(existing); 1003 offered_extensions->push_back(existing);
978 } else { 1004 } else {
979 used_ids->FindAndSetIdUsed(&reference_extension); 1005 used_ids->FindAndSetIdUsed(&reference_extension);
980 all_extensions->push_back(reference_extension); 1006 all_extensions->push_back(reference_extension);
981 offered_extensions->push_back(reference_extension); 1007 offered_extensions->push_back(reference_extension);
982 } 1008 }
983 } 1009 }
984 } 1010 }
985 } 1011 }
986 1012
1013 static void AddEncryptedHdrExts(RtpHeaderExtensions* extensions,
1014 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.
1015 RtpHeaderExtensions encrypted_extensions;
1016 for (const webrtc::RtpExtension& extension : *extensions) {
1017 if (extension.encrypted ||
1018 !webrtc::RtpExtension::AllowEncrypt(extension.uri)) {
1019 continue;
1020 }
1021
1022 webrtc::RtpExtension encrypted(extension);
1023 encrypted.encrypted = true;
1024 used_ids->FindAndSetIdUsed(&encrypted);
1025 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
1026 }
1027 extensions->insert(extensions->end(), encrypted_extensions.begin(),
1028 encrypted_extensions.end());
1029 }
1030
987 static void NegotiateRtpHeaderExtensions( 1031 static void NegotiateRtpHeaderExtensions(
988 const RtpHeaderExtensions& local_extensions, 1032 const RtpHeaderExtensions& local_extensions,
989 const RtpHeaderExtensions& offered_extensions, 1033 const RtpHeaderExtensions& offered_extensions,
1034 bool enable_rtp_header_encryption,
990 RtpHeaderExtensions* negotiated_extenstions) { 1035 RtpHeaderExtensions* negotiated_extenstions) {
991 RtpHeaderExtensions::const_iterator ours; 1036 RtpHeaderExtensions::const_iterator ours;
992 for (ours = local_extensions.begin(); 1037 for (ours = local_extensions.begin();
993 ours != local_extensions.end(); ++ours) { 1038 ours != local_extensions.end(); ++ours) {
994 webrtc::RtpExtension theirs; 1039 webrtc::RtpExtension theirs;
995 if (FindByUri(offered_extensions, *ours, &theirs)) { 1040 if (FindByUriPreferEncrypted(offered_extensions, *ours,
1041 enable_rtp_header_encryption, &theirs)) {
996 // We respond with their RTP header extension id. 1042 // We respond with their RTP header extension id.
997 negotiated_extenstions->push_back(theirs); 1043 negotiated_extenstions->push_back(theirs);
998 } 1044 }
999 } 1045 }
1000 } 1046 }
1001 1047
1002 static void StripCNCodecs(AudioCodecs* audio_codecs) { 1048 static void StripCNCodecs(AudioCodecs* audio_codecs) {
1003 AudioCodecs::iterator iter = audio_codecs->begin(); 1049 AudioCodecs::iterator iter = audio_codecs->begin();
1004 while (iter != audio_codecs->end()) { 1050 while (iter != audio_codecs->end()) {
1005 if (STR_CASE_CMP(iter->name.c_str(), kComfortNoiseCodecName) == 0) { 1051 if (STR_CASE_CMP(iter->name.c_str(), kComfortNoiseCodecName) == 0) {
(...skipping 14 matching lines...) Expand all
1020 // from the incoming session-initiate. If the negotiation fails, this 1066 // from the incoming session-initiate. If the negotiation fails, this
1021 // method returns false. The created content is added to the offer. 1067 // method returns false. The created content is added to the offer.
1022 template <class C> 1068 template <class C>
1023 static bool CreateMediaContentAnswer( 1069 static bool CreateMediaContentAnswer(
1024 const MediaContentDescriptionImpl<C>* offer, 1070 const MediaContentDescriptionImpl<C>* offer,
1025 const MediaSessionOptions& options, 1071 const MediaSessionOptions& options,
1026 const std::vector<C>& local_codecs, 1072 const std::vector<C>& local_codecs,
1027 const SecurePolicy& sdes_policy, 1073 const SecurePolicy& sdes_policy,
1028 const CryptoParamsVec* current_cryptos, 1074 const CryptoParamsVec* current_cryptos,
1029 const RtpHeaderExtensions& local_rtp_extenstions, 1075 const RtpHeaderExtensions& local_rtp_extenstions,
1076 bool enable_rtp_header_encryption,
1030 StreamParamsVec* current_streams, 1077 StreamParamsVec* current_streams,
1031 bool add_legacy_stream, 1078 bool add_legacy_stream,
1032 bool bundle_enabled, 1079 bool bundle_enabled,
1033 MediaContentDescriptionImpl<C>* answer) { 1080 MediaContentDescriptionImpl<C>* answer) {
1034 std::vector<C> negotiated_codecs; 1081 std::vector<C> negotiated_codecs;
1035 NegotiateCodecs(local_codecs, offer->codecs(), &negotiated_codecs); 1082 NegotiateCodecs(local_codecs, offer->codecs(), &negotiated_codecs);
1036 answer->AddCodecs(negotiated_codecs); 1083 answer->AddCodecs(negotiated_codecs);
1037 answer->set_protocol(offer->protocol()); 1084 answer->set_protocol(offer->protocol());
1038 RtpHeaderExtensions negotiated_rtp_extensions; 1085 RtpHeaderExtensions negotiated_rtp_extensions;
1039 NegotiateRtpHeaderExtensions(local_rtp_extenstions, 1086 NegotiateRtpHeaderExtensions(local_rtp_extenstions,
1040 offer->rtp_header_extensions(), 1087 offer->rtp_header_extensions(),
1088 enable_rtp_header_encryption,
1041 &negotiated_rtp_extensions); 1089 &negotiated_rtp_extensions);
1042 answer->set_rtp_header_extensions(negotiated_rtp_extensions); 1090 answer->set_rtp_header_extensions(negotiated_rtp_extensions);
1043 1091
1044 answer->set_rtcp_mux(options.rtcp_mux_enabled && offer->rtcp_mux()); 1092 answer->set_rtcp_mux(options.rtcp_mux_enabled && offer->rtcp_mux());
1045 if (answer->type() == cricket::MEDIA_TYPE_VIDEO) { 1093 if (answer->type() == cricket::MEDIA_TYPE_VIDEO) {
1046 answer->set_rtcp_reduced_size(offer->rtcp_reduced_size()); 1094 answer->set_rtcp_reduced_size(offer->rtcp_reduced_size());
1047 } 1095 }
1048 1096
1049 if (sdes_policy != SEC_DISABLED) { 1097 if (sdes_policy != SEC_DISABLED) {
1050 CryptoParams crypto; 1098 CryptoParams crypto;
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 FindAndSetRtpHdrExtUsed(video_extensions, &all_extensions, &used_ids); 1646 FindAndSetRtpHdrExtUsed(video_extensions, &all_extensions, &used_ids);
1599 } 1647 }
1600 } 1648 }
1601 1649
1602 // Add our default RTP header extensions that are not in 1650 // Add our default RTP header extensions that are not in
1603 // |current_description|. 1651 // |current_description|.
1604 FindRtpHdrExtsToOffer(audio_rtp_header_extensions(), audio_extensions, 1652 FindRtpHdrExtsToOffer(audio_rtp_header_extensions(), audio_extensions,
1605 &all_extensions, &used_ids); 1653 &all_extensions, &used_ids);
1606 FindRtpHdrExtsToOffer(video_rtp_header_extensions(), video_extensions, 1654 FindRtpHdrExtsToOffer(video_rtp_header_extensions(), video_extensions,
1607 &all_extensions, &used_ids); 1655 &all_extensions, &used_ids);
1656 if (enable_rtp_header_encryption_) {
1657 AddEncryptedHdrExts(audio_extensions, &used_ids);
1658 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,
1659 }
1608 } 1660 }
1609 1661
1610 bool MediaSessionDescriptionFactory::AddTransportOffer( 1662 bool MediaSessionDescriptionFactory::AddTransportOffer(
1611 const std::string& content_name, 1663 const std::string& content_name,
1612 const TransportOptions& transport_options, 1664 const TransportOptions& transport_options,
1613 const SessionDescription* current_desc, 1665 const SessionDescription* current_desc,
1614 SessionDescription* offer_desc) const { 1666 SessionDescription* offer_desc) const {
1615 if (!transport_desc_factory_) 1667 if (!transport_desc_factory_)
1616 return false; 1668 return false;
1617 const TransportDescription* current_tdesc = 1669 const TransportDescription* current_tdesc =
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
1871 // Do not require or create SDES cryptos if DTLS is used. 1923 // Do not require or create SDES cryptos if DTLS is used.
1872 cricket::SecurePolicy sdes_policy = 1924 cricket::SecurePolicy sdes_policy =
1873 audio_transport->secure() ? cricket::SEC_DISABLED : secure(); 1925 audio_transport->secure() ? cricket::SEC_DISABLED : secure();
1874 if (!CreateMediaContentAnswer( 1926 if (!CreateMediaContentAnswer(
1875 offer_audio, 1927 offer_audio,
1876 options, 1928 options,
1877 audio_codecs, 1929 audio_codecs,
1878 sdes_policy, 1930 sdes_policy,
1879 GetCryptos(GetFirstAudioContentDescription(current_description)), 1931 GetCryptos(GetFirstAudioContentDescription(current_description)),
1880 audio_rtp_extensions_, 1932 audio_rtp_extensions_,
1933 enable_rtp_header_encryption_,
1881 current_streams, 1934 current_streams,
1882 add_legacy_, 1935 add_legacy_,
1883 bundle_enabled, 1936 bundle_enabled,
1884 audio_answer.get())) { 1937 audio_answer.get())) {
1885 return false; // Fails the session setup. 1938 return false; // Fails the session setup.
1886 } 1939 }
1887 1940
1888 bool secure = bundle_transport ? bundle_transport->description.secure() 1941 bool secure = bundle_transport ? bundle_transport->description.secure()
1889 : audio_transport->secure(); 1942 : audio_transport->secure();
1890 bool rejected = !options.has_audio() || audio_content->rejected || 1943 bool rejected = !options.has_audio() || audio_content->rejected ||
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1927 bool bundle_enabled = 1980 bool bundle_enabled =
1928 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled; 1981 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled;
1929 if (!CreateMediaContentAnswer( 1982 if (!CreateMediaContentAnswer(
1930 static_cast<const VideoContentDescription*>( 1983 static_cast<const VideoContentDescription*>(
1931 video_content->description), 1984 video_content->description),
1932 options, 1985 options,
1933 video_codecs_, 1986 video_codecs_,
1934 sdes_policy, 1987 sdes_policy,
1935 GetCryptos(GetFirstVideoContentDescription(current_description)), 1988 GetCryptos(GetFirstVideoContentDescription(current_description)),
1936 video_rtp_extensions_, 1989 video_rtp_extensions_,
1990 enable_rtp_header_encryption_,
1937 current_streams, 1991 current_streams,
1938 add_legacy_, 1992 add_legacy_,
1939 bundle_enabled, 1993 bundle_enabled,
1940 video_answer.get())) { 1994 video_answer.get())) {
1941 return false; 1995 return false;
1942 } 1996 }
1943 bool secure = bundle_transport ? bundle_transport->description.secure() 1997 bool secure = bundle_transport ? bundle_transport->description.secure()
1944 : video_transport->secure(); 1998 : video_transport->secure();
1945 bool rejected = !options.has_video() || video_content->rejected || 1999 bool rejected = !options.has_video() || video_content->rejected ||
1946 !IsMediaProtocolSupported(MEDIA_TYPE_VIDEO, 2000 !IsMediaProtocolSupported(MEDIA_TYPE_VIDEO,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1988 bool bundle_enabled = 2042 bool bundle_enabled =
1989 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled; 2043 offer->HasGroup(GROUP_TYPE_BUNDLE) && options.bundle_enabled;
1990 if (!CreateMediaContentAnswer( 2044 if (!CreateMediaContentAnswer(
1991 static_cast<const DataContentDescription*>( 2045 static_cast<const DataContentDescription*>(
1992 data_content->description), 2046 data_content->description),
1993 options, 2047 options,
1994 data_codecs_, 2048 data_codecs_,
1995 sdes_policy, 2049 sdes_policy,
1996 GetCryptos(GetFirstDataContentDescription(current_description)), 2050 GetCryptos(GetFirstDataContentDescription(current_description)),
1997 RtpHeaderExtensions(), 2051 RtpHeaderExtensions(),
2052 enable_rtp_header_encryption_,
1998 current_streams, 2053 current_streams,
1999 add_legacy_, 2054 add_legacy_,
2000 bundle_enabled, 2055 bundle_enabled,
2001 data_answer.get())) { 2056 data_answer.get())) {
2002 return false; // Fails the session setup. 2057 return false; // Fails the session setup.
2003 } 2058 }
2004 2059
2005 // Respond with sctpmap if the offer uses sctpmap. 2060 // Respond with sctpmap if the offer uses sctpmap.
2006 const DataContentDescription* offer_data_description = 2061 const DataContentDescription* offer_data_description =
2007 static_cast<const DataContentDescription*>(data_content->description); 2062 static_cast<const DataContentDescription*>(data_content->description);
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2183 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); 2238 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
2184 } 2239 }
2185 2240
2186 DataContentDescription* GetFirstDataContentDescription( 2241 DataContentDescription* GetFirstDataContentDescription(
2187 SessionDescription* sdesc) { 2242 SessionDescription* sdesc) {
2188 return static_cast<DataContentDescription*>( 2243 return static_cast<DataContentDescription*>(
2189 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); 2244 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
2190 } 2245 }
2191 2246
2192 } // namespace cricket 2247 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698