OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 static_cast<const MediaContentDescription*>( | 156 static_cast<const MediaContentDescription*>( |
157 answer->contents()[i].description); | 157 answer->contents()[i].description); |
158 if (offer_mdesc->type() != answer_mdesc->type()) { | 158 if (offer_mdesc->type() != answer_mdesc->type()) { |
159 return false; | 159 return false; |
160 } | 160 } |
161 } | 161 } |
162 return true; | 162 return true; |
163 } | 163 } |
164 | 164 |
165 // Checks that each non-rejected content has SDES crypto keys or a DTLS | 165 // Checks that each non-rejected content has SDES crypto keys or a DTLS |
166 // fingerprint. Mismatches, such as replying with a DTLS fingerprint to SDES | 166 // fingerprint, unless it's in a BUNDLE group, in which case only the |
167 // keys, will be caught in Transport negotiation, and backstopped by Channel's | 167 // BUNDLE-tag section (first media section/description in the BUNDLE group) |
168 // |srtp_required| check. | 168 // needs a ufrag and pwd. Mismatches, such as replying with a DTLS fingerprint |
| 169 // to SDES keys, will be caught in JsepTransport negotiation, and backstopped |
| 170 // by Channel's |srtp_required| check. |
169 static bool VerifyCrypto(const SessionDescription* desc, | 171 static bool VerifyCrypto(const SessionDescription* desc, |
170 bool dtls_enabled, | 172 bool dtls_enabled, |
171 std::string* error) { | 173 std::string* error) { |
| 174 const cricket::ContentGroup* bundle = |
| 175 desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); |
172 const ContentInfos& contents = desc->contents(); | 176 const ContentInfos& contents = desc->contents(); |
173 for (size_t index = 0; index < contents.size(); ++index) { | 177 for (size_t index = 0; index < contents.size(); ++index) { |
174 const ContentInfo* cinfo = &contents[index]; | 178 const ContentInfo* cinfo = &contents[index]; |
175 if (cinfo->rejected) { | 179 if (cinfo->rejected) { |
176 continue; | 180 continue; |
177 } | 181 } |
| 182 if (bundle && bundle->HasContentName(cinfo->name) && |
| 183 cinfo->name != *(bundle->FirstContentName())) { |
| 184 // This isn't the first media section in the BUNDLE group, so it's not |
| 185 // required to have crypto attributes, since only the crypto attributes |
| 186 // from the first section actually get used. |
| 187 continue; |
| 188 } |
178 | 189 |
179 // If the content isn't rejected, crypto must be present. | 190 // If the content isn't rejected or bundled into another m= section, crypto |
| 191 // must be present. |
180 const MediaContentDescription* media = | 192 const MediaContentDescription* media = |
181 static_cast<const MediaContentDescription*>(cinfo->description); | 193 static_cast<const MediaContentDescription*>(cinfo->description); |
182 const TransportInfo* tinfo = desc->GetTransportInfoByName(cinfo->name); | 194 const TransportInfo* tinfo = desc->GetTransportInfoByName(cinfo->name); |
183 if (!media || !tinfo) { | 195 if (!media || !tinfo) { |
184 // Something is not right. | 196 // Something is not right. |
185 LOG(LS_ERROR) << kInvalidSdp; | 197 LOG(LS_ERROR) << kInvalidSdp; |
186 *error = kInvalidSdp; | 198 *error = kInvalidSdp; |
187 return false; | 199 return false; |
188 } | 200 } |
189 if (dtls_enabled) { | 201 if (dtls_enabled) { |
190 if (!tinfo->description.identity_fingerprint) { | 202 if (!tinfo->description.identity_fingerprint) { |
191 LOG(LS_WARNING) << | 203 LOG(LS_WARNING) << |
192 "Session description must have DTLS fingerprint if DTLS enabled."; | 204 "Session description must have DTLS fingerprint if DTLS enabled."; |
193 *error = kSdpWithoutDtlsFingerprint; | 205 *error = kSdpWithoutDtlsFingerprint; |
194 return false; | 206 return false; |
195 } | 207 } |
196 } else { | 208 } else { |
197 if (media->cryptos().empty()) { | 209 if (media->cryptos().empty()) { |
198 LOG(LS_WARNING) << | 210 LOG(LS_WARNING) << |
199 "Session description must have SDES when DTLS disabled."; | 211 "Session description must have SDES when DTLS disabled."; |
200 *error = kSdpWithoutSdesCrypto; | 212 *error = kSdpWithoutSdesCrypto; |
201 return false; | 213 return false; |
202 } | 214 } |
203 } | 215 } |
204 } | 216 } |
205 | 217 |
206 return true; | 218 return true; |
207 } | 219 } |
208 | 220 |
209 // Checks that each non-rejected content has ice-ufrag and ice-pwd set. | 221 // Checks that each non-rejected content has ice-ufrag and ice-pwd set, unless |
| 222 // it's in a BUNDLE group, in which case only the BUNDLE-tag section (first |
| 223 // media section/description in the BUNDLE group) needs a ufrag and pwd. |
210 static bool VerifyIceUfragPwdPresent(const SessionDescription* desc) { | 224 static bool VerifyIceUfragPwdPresent(const SessionDescription* desc) { |
| 225 const cricket::ContentGroup* bundle = |
| 226 desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); |
211 const ContentInfos& contents = desc->contents(); | 227 const ContentInfos& contents = desc->contents(); |
212 for (size_t index = 0; index < contents.size(); ++index) { | 228 for (size_t index = 0; index < contents.size(); ++index) { |
213 const ContentInfo* cinfo = &contents[index]; | 229 const ContentInfo* cinfo = &contents[index]; |
214 if (cinfo->rejected) { | 230 if (cinfo->rejected) { |
215 continue; | 231 continue; |
216 } | 232 } |
| 233 if (bundle && bundle->HasContentName(cinfo->name) && |
| 234 cinfo->name != *(bundle->FirstContentName())) { |
| 235 // This isn't the first media section in the BUNDLE group, so it's not |
| 236 // required to have ufrag/password, since only the ufrag/password from |
| 237 // the first section actually get used. |
| 238 continue; |
| 239 } |
217 | 240 |
218 // If the content isn't rejected, ice-ufrag and ice-pwd must be present. | 241 // If the content isn't rejected or bundled into another m= section, |
| 242 // ice-ufrag and ice-pwd must be present. |
219 const TransportInfo* tinfo = desc->GetTransportInfoByName(cinfo->name); | 243 const TransportInfo* tinfo = desc->GetTransportInfoByName(cinfo->name); |
220 if (!tinfo) { | 244 if (!tinfo) { |
221 // Something is not right. | 245 // Something is not right. |
222 LOG(LS_ERROR) << kInvalidSdp; | 246 LOG(LS_ERROR) << kInvalidSdp; |
223 return false; | 247 return false; |
224 } | 248 } |
225 if (tinfo->description.ice_ufrag.empty() || | 249 if (tinfo->description.ice_ufrag.empty() || |
226 tinfo->description.ice_pwd.empty()) { | 250 tinfo->description.ice_pwd.empty()) { |
227 LOG(LS_ERROR) << "Session description must have ice ufrag and pwd."; | 251 LOG(LS_ERROR) << "Session description must have ice ufrag and pwd."; |
228 return false; | 252 return false; |
(...skipping 2130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2359 (rtp_data_channel_->rtcp_dtls_transport() != nullptr); | 2383 (rtp_data_channel_->rtcp_dtls_transport() != nullptr); |
2360 channel_manager_->DestroyRtpDataChannel(rtp_data_channel_.release()); | 2384 channel_manager_->DestroyRtpDataChannel(rtp_data_channel_.release()); |
2361 transport_controller_->DestroyDtlsTransport( | 2385 transport_controller_->DestroyDtlsTransport( |
2362 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP); | 2386 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP); |
2363 if (need_to_delete_rtcp) { | 2387 if (need_to_delete_rtcp) { |
2364 transport_controller_->DestroyDtlsTransport( | 2388 transport_controller_->DestroyDtlsTransport( |
2365 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP); | 2389 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP); |
2366 } | 2390 } |
2367 } | 2391 } |
2368 } // namespace webrtc | 2392 } // namespace webrtc |
OLD | NEW |