| OLD | NEW |
| 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 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 break; | 548 break; |
| 549 case ST_RTCP: | 549 case ST_RTCP: |
| 550 channel = rtcp_transport_channel_; | 550 channel = rtcp_transport_channel_; |
| 551 rtcp_socket_options_.push_back( | 551 rtcp_socket_options_.push_back( |
| 552 std::pair<rtc::Socket::Option, int>(opt, value)); | 552 std::pair<rtc::Socket::Option, int>(opt, value)); |
| 553 break; | 553 break; |
| 554 } | 554 } |
| 555 return channel ? channel->SetOption(opt, value) : -1; | 555 return channel ? channel->SetOption(opt, value) : -1; |
| 556 } | 556 } |
| 557 | 557 |
| 558 bool BaseChannel::SetCryptoOptions(const rtc::CryptoOptions& crypto_options) { |
| 559 crypto_options_ = crypto_options; |
| 560 return true; |
| 561 } |
| 562 |
| 558 void BaseChannel::OnWritableState(TransportChannel* channel) { | 563 void BaseChannel::OnWritableState(TransportChannel* channel) { |
| 559 RTC_DCHECK(channel == transport_channel_ || | 564 RTC_DCHECK(channel == transport_channel_ || |
| 560 channel == rtcp_transport_channel_); | 565 channel == rtcp_transport_channel_); |
| 561 RTC_DCHECK(network_thread_->IsCurrent()); | 566 RTC_DCHECK(network_thread_->IsCurrent()); |
| 562 UpdateWritableState_n(); | 567 UpdateWritableState_n(); |
| 563 } | 568 } |
| 564 | 569 |
| 565 void BaseChannel::OnChannelRead(TransportChannel* channel, | 570 void BaseChannel::OnChannelRead(TransportChannel* channel, |
| 566 const char* data, size_t len, | 571 const char* data, size_t len, |
| 567 const rtc::PacketTime& packet_time, | 572 const rtc::PacketTime& packet_time, |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 SignalDtlsSetupFailure(this, rtcp); | 962 SignalDtlsSetupFailure(this, rtcp); |
| 958 } | 963 } |
| 959 | 964 |
| 960 bool BaseChannel::SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp) { | 965 bool BaseChannel::SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp) { |
| 961 std::vector<int> crypto_suites; | 966 std::vector<int> crypto_suites; |
| 962 // We always use the default SRTP crypto suites for RTCP, but we may use | 967 // We always use the default SRTP crypto suites for RTCP, but we may use |
| 963 // different crypto suites for RTP depending on the media type. | 968 // different crypto suites for RTP depending on the media type. |
| 964 if (!rtcp) { | 969 if (!rtcp) { |
| 965 GetSrtpCryptoSuites_n(&crypto_suites); | 970 GetSrtpCryptoSuites_n(&crypto_suites); |
| 966 } else { | 971 } else { |
| 967 GetDefaultSrtpCryptoSuites(&crypto_suites); | 972 GetDefaultSrtpCryptoSuites(crypto_options(), &crypto_suites); |
| 968 } | 973 } |
| 969 return tc->SetSrtpCryptoSuites(crypto_suites); | 974 return tc->SetSrtpCryptoSuites(crypto_suites); |
| 970 } | 975 } |
| 971 | 976 |
| 972 bool BaseChannel::ShouldSetupDtlsSrtp_n() const { | 977 bool BaseChannel::ShouldSetupDtlsSrtp_n() const { |
| 973 // Since DTLS is applied to all channels, checking RTP should be enough. | 978 // Since DTLS is applied to all channels, checking RTP should be enough. |
| 974 return transport_channel_ && transport_channel_->IsDtlsActive(); | 979 return transport_channel_ && transport_channel_->IsDtlsActive(); |
| 975 } | 980 } |
| 976 | 981 |
| 977 // This function returns true if either DTLS-SRTP is not in use | 982 // This function returns true if either DTLS-SRTP is not in use |
| (...skipping 11 matching lines...) Expand all Loading... |
| 989 | 994 |
| 990 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { | 995 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { |
| 991 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; | 996 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; |
| 992 return false; | 997 return false; |
| 993 } | 998 } |
| 994 | 999 |
| 995 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " | 1000 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " |
| 996 << content_name() << " " | 1001 << content_name() << " " |
| 997 << PacketType(rtcp_channel); | 1002 << PacketType(rtcp_channel); |
| 998 | 1003 |
| 1004 int key_len; |
| 1005 int salt_len; |
| 1006 if (!rtc::GetSrtpKeyAndSaltLengths(selected_crypto_suite, &key_len, |
| 1007 &salt_len)) { |
| 1008 LOG(LS_ERROR) << "Unknown DTLS-SRTP crypto suite" << selected_crypto_suite; |
| 1009 return false; |
| 1010 } |
| 1011 |
| 999 // OK, we're now doing DTLS (RFC 5764) | 1012 // OK, we're now doing DTLS (RFC 5764) |
| 1000 std::vector<unsigned char> dtls_buffer(SRTP_MASTER_KEY_KEY_LEN * 2 + | 1013 std::vector<unsigned char> dtls_buffer(key_len * 2 + salt_len * 2); |
| 1001 SRTP_MASTER_KEY_SALT_LEN * 2); | |
| 1002 | 1014 |
| 1003 // RFC 5705 exporter using the RFC 5764 parameters | 1015 // RFC 5705 exporter using the RFC 5764 parameters |
| 1004 if (!channel->ExportKeyingMaterial( | 1016 if (!channel->ExportKeyingMaterial( |
| 1005 kDtlsSrtpExporterLabel, | 1017 kDtlsSrtpExporterLabel, |
| 1006 NULL, 0, false, | 1018 NULL, 0, false, |
| 1007 &dtls_buffer[0], dtls_buffer.size())) { | 1019 &dtls_buffer[0], dtls_buffer.size())) { |
| 1008 LOG(LS_WARNING) << "DTLS-SRTP key export failed"; | 1020 LOG(LS_WARNING) << "DTLS-SRTP key export failed"; |
| 1009 ASSERT(false); // This should never happen | 1021 ASSERT(false); // This should never happen |
| 1010 return false; | 1022 return false; |
| 1011 } | 1023 } |
| 1012 | 1024 |
| 1013 // Sync up the keys with the DTLS-SRTP interface | 1025 // Sync up the keys with the DTLS-SRTP interface |
| 1014 std::vector<unsigned char> client_write_key(SRTP_MASTER_KEY_KEY_LEN + | 1026 std::vector<unsigned char> client_write_key(key_len + salt_len); |
| 1015 SRTP_MASTER_KEY_SALT_LEN); | 1027 std::vector<unsigned char> server_write_key(key_len + salt_len); |
| 1016 std::vector<unsigned char> server_write_key(SRTP_MASTER_KEY_KEY_LEN + | |
| 1017 SRTP_MASTER_KEY_SALT_LEN); | |
| 1018 size_t offset = 0; | 1028 size_t offset = 0; |
| 1019 memcpy(&client_write_key[0], &dtls_buffer[offset], | 1029 memcpy(&client_write_key[0], &dtls_buffer[offset], key_len); |
| 1020 SRTP_MASTER_KEY_KEY_LEN); | 1030 offset += key_len; |
| 1021 offset += SRTP_MASTER_KEY_KEY_LEN; | 1031 memcpy(&server_write_key[0], &dtls_buffer[offset], key_len); |
| 1022 memcpy(&server_write_key[0], &dtls_buffer[offset], | 1032 offset += key_len; |
| 1023 SRTP_MASTER_KEY_KEY_LEN); | 1033 memcpy(&client_write_key[key_len], &dtls_buffer[offset], salt_len); |
| 1024 offset += SRTP_MASTER_KEY_KEY_LEN; | 1034 offset += salt_len; |
| 1025 memcpy(&client_write_key[SRTP_MASTER_KEY_KEY_LEN], | 1035 memcpy(&server_write_key[key_len], &dtls_buffer[offset], salt_len); |
| 1026 &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN); | |
| 1027 offset += SRTP_MASTER_KEY_SALT_LEN; | |
| 1028 memcpy(&server_write_key[SRTP_MASTER_KEY_KEY_LEN], | |
| 1029 &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN); | |
| 1030 | 1036 |
| 1031 std::vector<unsigned char> *send_key, *recv_key; | 1037 std::vector<unsigned char> *send_key, *recv_key; |
| 1032 rtc::SSLRole role; | 1038 rtc::SSLRole role; |
| 1033 if (!channel->GetSslRole(&role)) { | 1039 if (!channel->GetSslRole(&role)) { |
| 1034 LOG(LS_WARNING) << "GetSslRole failed"; | 1040 LOG(LS_WARNING) << "GetSslRole failed"; |
| 1035 return false; | 1041 return false; |
| 1036 } | 1042 } |
| 1037 | 1043 |
| 1038 if (role == rtc::SSL_SERVER) { | 1044 if (role == rtc::SSL_SERVER) { |
| 1039 send_key = &server_write_key; | 1045 send_key = &server_write_key; |
| (...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1839 SignalMediaMonitor(this, info); | 1845 SignalMediaMonitor(this, info); |
| 1840 } | 1846 } |
| 1841 | 1847 |
| 1842 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, | 1848 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, |
| 1843 const AudioInfo& info) { | 1849 const AudioInfo& info) { |
| 1844 SignalAudioMonitor(this, info); | 1850 SignalAudioMonitor(this, info); |
| 1845 } | 1851 } |
| 1846 | 1852 |
| 1847 void VoiceChannel::GetSrtpCryptoSuites_n( | 1853 void VoiceChannel::GetSrtpCryptoSuites_n( |
| 1848 std::vector<int>* crypto_suites) const { | 1854 std::vector<int>* crypto_suites) const { |
| 1849 GetSupportedAudioCryptoSuites(crypto_suites); | 1855 GetSupportedAudioCryptoSuites(crypto_options(), crypto_suites); |
| 1850 } | 1856 } |
| 1851 | 1857 |
| 1852 VideoChannel::VideoChannel(rtc::Thread* worker_thread, | 1858 VideoChannel::VideoChannel(rtc::Thread* worker_thread, |
| 1853 rtc::Thread* network_thread, | 1859 rtc::Thread* network_thread, |
| 1854 VideoMediaChannel* media_channel, | 1860 VideoMediaChannel* media_channel, |
| 1855 TransportController* transport_controller, | 1861 TransportController* transport_controller, |
| 1856 const std::string& content_name, | 1862 const std::string& content_name, |
| 1857 bool rtcp) | 1863 bool rtcp) |
| 1858 : BaseChannel(worker_thread, | 1864 : BaseChannel(worker_thread, |
| 1859 network_thread, | 1865 network_thread, |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2100 // TODO(pthatcher): Look into removing duplicate code between | 2106 // TODO(pthatcher): Look into removing duplicate code between |
| 2101 // audio, video, and data, perhaps by using templates. | 2107 // audio, video, and data, perhaps by using templates. |
| 2102 void VideoChannel::OnMediaMonitorUpdate( | 2108 void VideoChannel::OnMediaMonitorUpdate( |
| 2103 VideoMediaChannel* media_channel, const VideoMediaInfo &info) { | 2109 VideoMediaChannel* media_channel, const VideoMediaInfo &info) { |
| 2104 ASSERT(media_channel == this->media_channel()); | 2110 ASSERT(media_channel == this->media_channel()); |
| 2105 SignalMediaMonitor(this, info); | 2111 SignalMediaMonitor(this, info); |
| 2106 } | 2112 } |
| 2107 | 2113 |
| 2108 void VideoChannel::GetSrtpCryptoSuites_n( | 2114 void VideoChannel::GetSrtpCryptoSuites_n( |
| 2109 std::vector<int>* crypto_suites) const { | 2115 std::vector<int>* crypto_suites) const { |
| 2110 GetSupportedVideoCryptoSuites(crypto_suites); | 2116 GetSupportedVideoCryptoSuites(crypto_options(), crypto_suites); |
| 2111 } | 2117 } |
| 2112 | 2118 |
| 2113 DataChannel::DataChannel(rtc::Thread* worker_thread, | 2119 DataChannel::DataChannel(rtc::Thread* worker_thread, |
| 2114 rtc::Thread* network_thread, | 2120 rtc::Thread* network_thread, |
| 2115 DataMediaChannel* media_channel, | 2121 DataMediaChannel* media_channel, |
| 2116 TransportController* transport_controller, | 2122 TransportController* transport_controller, |
| 2117 const std::string& content_name, | 2123 const std::string& content_name, |
| 2118 bool rtcp) | 2124 bool rtcp) |
| 2119 : BaseChannel(worker_thread, | 2125 : BaseChannel(worker_thread, |
| 2120 network_thread, | 2126 network_thread, |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2413 | 2419 |
| 2414 void DataChannel::OnDataChannelReadyToSend(bool writable) { | 2420 void DataChannel::OnDataChannelReadyToSend(bool writable) { |
| 2415 // This is usded for congestion control to indicate that the stream is ready | 2421 // This is usded for congestion control to indicate that the stream is ready |
| 2416 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates | 2422 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates |
| 2417 // that the transport channel is ready. | 2423 // that the transport channel is ready. |
| 2418 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, | 2424 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, |
| 2419 new DataChannelReadyToSendMessageData(writable)); | 2425 new DataChannelReadyToSendMessageData(writable)); |
| 2420 } | 2426 } |
| 2421 | 2427 |
| 2422 void DataChannel::GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const { | 2428 void DataChannel::GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const { |
| 2423 GetSupportedDataCryptoSuites(crypto_suites); | 2429 GetSupportedDataCryptoSuites(crypto_options(), crypto_suites); |
| 2424 } | 2430 } |
| 2425 | 2431 |
| 2426 bool DataChannel::ShouldSetupDtlsSrtp_n() const { | 2432 bool DataChannel::ShouldSetupDtlsSrtp_n() const { |
| 2427 return data_channel_type_ == DCT_RTP && BaseChannel::ShouldSetupDtlsSrtp_n(); | 2433 return data_channel_type_ == DCT_RTP && BaseChannel::ShouldSetupDtlsSrtp_n(); |
| 2428 } | 2434 } |
| 2429 | 2435 |
| 2430 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { | 2436 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { |
| 2431 rtc::TypedMessageData<uint32_t>* message = | 2437 rtc::TypedMessageData<uint32_t>* message = |
| 2432 new rtc::TypedMessageData<uint32_t>(sid); | 2438 new rtc::TypedMessageData<uint32_t>(sid); |
| 2433 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_STREAMCLOSEDREMOTELY, | 2439 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_STREAMCLOSEDREMOTELY, |
| 2434 message); | 2440 message); |
| 2435 } | 2441 } |
| 2436 | 2442 |
| 2437 } // namespace cricket | 2443 } // namespace cricket |
| OLD | NEW |