| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 enabled_(false), | 188 enabled_(false), |
| 189 writable_(false), | 189 writable_(false), |
| 190 rtp_ready_to_send_(false), | 190 rtp_ready_to_send_(false), |
| 191 rtcp_ready_to_send_(false), | 191 rtcp_ready_to_send_(false), |
| 192 was_ever_writable_(false), | 192 was_ever_writable_(false), |
| 193 local_content_direction_(MD_INACTIVE), | 193 local_content_direction_(MD_INACTIVE), |
| 194 remote_content_direction_(MD_INACTIVE), | 194 remote_content_direction_(MD_INACTIVE), |
| 195 has_received_packet_(false), | 195 has_received_packet_(false), |
| 196 dtls_keyed_(false), | 196 dtls_keyed_(false), |
| 197 secure_required_(false), | 197 secure_required_(false), |
| 198 enable_gcm_crypto_suites_(false), |
| 198 rtp_abs_sendtime_extn_id_(-1) { | 199 rtp_abs_sendtime_extn_id_(-1) { |
| 199 ASSERT(worker_thread_ == rtc::Thread::Current()); | 200 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 200 LOG(LS_INFO) << "Created channel for " << content_name; | 201 LOG(LS_INFO) << "Created channel for " << content_name; |
| 201 } | 202 } |
| 202 | 203 |
| 203 BaseChannel::~BaseChannel() { | 204 BaseChannel::~BaseChannel() { |
| 204 ASSERT(worker_thread_ == rtc::Thread::Current()); | 205 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 205 Deinit(); | 206 Deinit(); |
| 206 StopConnectionMonitor(); | 207 StopConnectionMonitor(); |
| 207 FlushRtcpMessages(); // Send any outstanding RTCP packets. | 208 FlushRtcpMessages(); // Send any outstanding RTCP packets. |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 break; | 470 break; |
| 470 case ST_RTCP: | 471 case ST_RTCP: |
| 471 channel = rtcp_transport_channel_; | 472 channel = rtcp_transport_channel_; |
| 472 rtcp_socket_options_.push_back( | 473 rtcp_socket_options_.push_back( |
| 473 std::pair<rtc::Socket::Option, int>(opt, value)); | 474 std::pair<rtc::Socket::Option, int>(opt, value)); |
| 474 break; | 475 break; |
| 475 } | 476 } |
| 476 return channel ? channel->SetOption(opt, value) : -1; | 477 return channel ? channel->SetOption(opt, value) : -1; |
| 477 } | 478 } |
| 478 | 479 |
| 480 bool BaseChannel::SetEnableGcmCryptoSuites(bool enable) { |
| 481 enable_gcm_crypto_suites_ = enable; |
| 482 return true; |
| 483 } |
| 484 |
| 479 void BaseChannel::OnWritableState(TransportChannel* channel) { | 485 void BaseChannel::OnWritableState(TransportChannel* channel) { |
| 480 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); | 486 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); |
| 481 UpdateWritableState_w(); | 487 UpdateWritableState_w(); |
| 482 } | 488 } |
| 483 | 489 |
| 484 void BaseChannel::OnChannelRead(TransportChannel* channel, | 490 void BaseChannel::OnChannelRead(TransportChannel* channel, |
| 485 const char* data, size_t len, | 491 const char* data, size_t len, |
| 486 const rtc::PacketTime& packet_time, | 492 const rtc::PacketTime& packet_time, |
| 487 int flags) { | 493 int flags) { |
| 488 TRACE_EVENT0("webrtc", "BaseChannel::OnChannelRead"); | 494 TRACE_EVENT0("webrtc", "BaseChannel::OnChannelRead"); |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 &BaseChannel::SignalDtlsSetupFailure_s, this, rtcp)); | 840 &BaseChannel::SignalDtlsSetupFailure_s, this, rtcp)); |
| 835 } | 841 } |
| 836 | 842 |
| 837 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) { | 843 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) { |
| 838 ASSERT(signaling_thread() == rtc::Thread::Current()); | 844 ASSERT(signaling_thread() == rtc::Thread::Current()); |
| 839 SignalDtlsSetupFailure(this, rtcp); | 845 SignalDtlsSetupFailure(this, rtcp); |
| 840 } | 846 } |
| 841 | 847 |
| 842 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) { | 848 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) { |
| 843 std::vector<int> crypto_suites; | 849 std::vector<int> crypto_suites; |
| 850 MediaSessionOptions options; |
| 851 options.enable_gcm_crypto_suites = enable_gcm_crypto_suites_; |
| 844 // We always use the default SRTP crypto suites for RTCP, but we may use | 852 // We always use the default SRTP crypto suites for RTCP, but we may use |
| 845 // different crypto suites for RTP depending on the media type. | 853 // different crypto suites for RTP depending on the media type. |
| 846 if (!rtcp) { | 854 if (!rtcp) { |
| 847 GetSrtpCryptoSuites(&crypto_suites); | 855 GetSrtpCryptoSuites(&crypto_suites, options); |
| 848 } else { | 856 } else { |
| 849 GetDefaultSrtpCryptoSuites(&crypto_suites); | 857 GetDefaultSrtpCryptoSuites(&crypto_suites, options); |
| 850 } | 858 } |
| 851 return tc->SetSrtpCryptoSuites(crypto_suites); | 859 return tc->SetSrtpCryptoSuites(crypto_suites); |
| 852 } | 860 } |
| 853 | 861 |
| 854 bool BaseChannel::ShouldSetupDtlsSrtp() const { | 862 bool BaseChannel::ShouldSetupDtlsSrtp() const { |
| 855 // Since DTLS is applied to all channels, checking RTP should be enough. | 863 // Since DTLS is applied to all channels, checking RTP should be enough. |
| 856 return transport_channel_ && transport_channel_->IsDtlsActive(); | 864 return transport_channel_ && transport_channel_->IsDtlsActive(); |
| 857 } | 865 } |
| 858 | 866 |
| 859 // This function returns true if either DTLS-SRTP is not in use | 867 // This function returns true if either DTLS-SRTP is not in use |
| (...skipping 10 matching lines...) Expand all Loading... |
| 870 | 878 |
| 871 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { | 879 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { |
| 872 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; | 880 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; |
| 873 return false; | 881 return false; |
| 874 } | 882 } |
| 875 | 883 |
| 876 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " | 884 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " |
| 877 << content_name() << " " | 885 << content_name() << " " |
| 878 << PacketType(rtcp_channel); | 886 << PacketType(rtcp_channel); |
| 879 | 887 |
| 888 int key_len; |
| 889 int salt_len; |
| 890 if (!rtc::GetSrtpKeyAndSaltLengths(selected_crypto_suite, &key_len, |
| 891 &salt_len)) { |
| 892 LOG(LS_ERROR) << "Unknown DTLS-SRTP crypto suite" << selected_crypto_suite; |
| 893 return false; |
| 894 } |
| 895 |
| 880 // OK, we're now doing DTLS (RFC 5764) | 896 // OK, we're now doing DTLS (RFC 5764) |
| 881 std::vector<unsigned char> dtls_buffer(SRTP_MASTER_KEY_KEY_LEN * 2 + | 897 std::vector<unsigned char> dtls_buffer(key_len * 2 + salt_len * 2); |
| 882 SRTP_MASTER_KEY_SALT_LEN * 2); | |
| 883 | 898 |
| 884 // RFC 5705 exporter using the RFC 5764 parameters | 899 // RFC 5705 exporter using the RFC 5764 parameters |
| 885 if (!channel->ExportKeyingMaterial( | 900 if (!channel->ExportKeyingMaterial( |
| 886 kDtlsSrtpExporterLabel, | 901 kDtlsSrtpExporterLabel, |
| 887 NULL, 0, false, | 902 NULL, 0, false, |
| 888 &dtls_buffer[0], dtls_buffer.size())) { | 903 &dtls_buffer[0], dtls_buffer.size())) { |
| 889 LOG(LS_WARNING) << "DTLS-SRTP key export failed"; | 904 LOG(LS_WARNING) << "DTLS-SRTP key export failed"; |
| 890 ASSERT(false); // This should never happen | 905 ASSERT(false); // This should never happen |
| 891 return false; | 906 return false; |
| 892 } | 907 } |
| 893 | 908 |
| 894 // Sync up the keys with the DTLS-SRTP interface | 909 // Sync up the keys with the DTLS-SRTP interface |
| 895 std::vector<unsigned char> client_write_key(SRTP_MASTER_KEY_KEY_LEN + | 910 std::vector<unsigned char> client_write_key(key_len + salt_len); |
| 896 SRTP_MASTER_KEY_SALT_LEN); | 911 std::vector<unsigned char> server_write_key(key_len + salt_len); |
| 897 std::vector<unsigned char> server_write_key(SRTP_MASTER_KEY_KEY_LEN + | |
| 898 SRTP_MASTER_KEY_SALT_LEN); | |
| 899 size_t offset = 0; | 912 size_t offset = 0; |
| 900 memcpy(&client_write_key[0], &dtls_buffer[offset], | 913 memcpy(&client_write_key[0], &dtls_buffer[offset], key_len); |
| 901 SRTP_MASTER_KEY_KEY_LEN); | 914 offset += key_len; |
| 902 offset += SRTP_MASTER_KEY_KEY_LEN; | 915 memcpy(&server_write_key[0], &dtls_buffer[offset], key_len); |
| 903 memcpy(&server_write_key[0], &dtls_buffer[offset], | 916 offset += key_len; |
| 904 SRTP_MASTER_KEY_KEY_LEN); | 917 memcpy(&client_write_key[key_len], &dtls_buffer[offset], salt_len); |
| 905 offset += SRTP_MASTER_KEY_KEY_LEN; | 918 offset += salt_len; |
| 906 memcpy(&client_write_key[SRTP_MASTER_KEY_KEY_LEN], | 919 memcpy(&server_write_key[key_len], &dtls_buffer[offset], salt_len); |
| 907 &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN); | |
| 908 offset += SRTP_MASTER_KEY_SALT_LEN; | |
| 909 memcpy(&server_write_key[SRTP_MASTER_KEY_KEY_LEN], | |
| 910 &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN); | |
| 911 | 920 |
| 912 std::vector<unsigned char> *send_key, *recv_key; | 921 std::vector<unsigned char> *send_key, *recv_key; |
| 913 rtc::SSLRole role; | 922 rtc::SSLRole role; |
| 914 if (!channel->GetSslRole(&role)) { | 923 if (!channel->GetSslRole(&role)) { |
| 915 LOG(LS_WARNING) << "GetSslRole failed"; | 924 LOG(LS_WARNING) << "GetSslRole failed"; |
| 916 return false; | 925 return false; |
| 917 } | 926 } |
| 918 | 927 |
| 919 if (role == rtc::SSL_SERVER) { | 928 if (role == rtc::SSL_SERVER) { |
| 920 send_key = &server_write_key; | 929 send_key = &server_write_key; |
| (...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1618 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) { | 1627 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) { |
| 1619 ASSERT(media_channel == this->media_channel()); | 1628 ASSERT(media_channel == this->media_channel()); |
| 1620 SignalMediaMonitor(this, info); | 1629 SignalMediaMonitor(this, info); |
| 1621 } | 1630 } |
| 1622 | 1631 |
| 1623 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, | 1632 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, |
| 1624 const AudioInfo& info) { | 1633 const AudioInfo& info) { |
| 1625 SignalAudioMonitor(this, info); | 1634 SignalAudioMonitor(this, info); |
| 1626 } | 1635 } |
| 1627 | 1636 |
| 1628 void VoiceChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { | 1637 void VoiceChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites, |
| 1629 GetSupportedAudioCryptoSuites(crypto_suites); | 1638 const MediaSessionOptions& options) const { |
| 1639 GetSupportedAudioCryptoSuites(crypto_suites, options); |
| 1630 } | 1640 } |
| 1631 | 1641 |
| 1632 VideoChannel::VideoChannel(rtc::Thread* thread, | 1642 VideoChannel::VideoChannel(rtc::Thread* thread, |
| 1633 VideoMediaChannel* media_channel, | 1643 VideoMediaChannel* media_channel, |
| 1634 TransportController* transport_controller, | 1644 TransportController* transport_controller, |
| 1635 const std::string& content_name, | 1645 const std::string& content_name, |
| 1636 bool rtcp) | 1646 bool rtcp) |
| 1637 : BaseChannel(thread, | 1647 : BaseChannel(thread, |
| 1638 media_channel, | 1648 media_channel, |
| 1639 transport_controller, | 1649 transport_controller, |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2009 for (ScreencastMap::iterator iter = screencast_capturers_.begin(); | 2019 for (ScreencastMap::iterator iter = screencast_capturers_.begin(); |
| 2010 iter != screencast_capturers_.end(); ++iter) { | 2020 iter != screencast_capturers_.end(); ++iter) { |
| 2011 if (iter->second == capturer) { | 2021 if (iter->second == capturer) { |
| 2012 *ssrc = iter->first; | 2022 *ssrc = iter->first; |
| 2013 return true; | 2023 return true; |
| 2014 } | 2024 } |
| 2015 } | 2025 } |
| 2016 return false; | 2026 return false; |
| 2017 } | 2027 } |
| 2018 | 2028 |
| 2019 void VideoChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { | 2029 void VideoChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites, |
| 2020 GetSupportedVideoCryptoSuites(crypto_suites); | 2030 const MediaSessionOptions& options) const { |
| 2031 GetSupportedVideoCryptoSuites(crypto_suites, options); |
| 2021 } | 2032 } |
| 2022 | 2033 |
| 2023 DataChannel::DataChannel(rtc::Thread* thread, | 2034 DataChannel::DataChannel(rtc::Thread* thread, |
| 2024 DataMediaChannel* media_channel, | 2035 DataMediaChannel* media_channel, |
| 2025 TransportController* transport_controller, | 2036 TransportController* transport_controller, |
| 2026 const std::string& content_name, | 2037 const std::string& content_name, |
| 2027 bool rtcp) | 2038 bool rtcp) |
| 2028 : BaseChannel(thread, | 2039 : BaseChannel(thread, |
| 2029 media_channel, | 2040 media_channel, |
| 2030 transport_controller, | 2041 transport_controller, |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2318 } | 2329 } |
| 2319 | 2330 |
| 2320 void DataChannel::OnDataChannelReadyToSend(bool writable) { | 2331 void DataChannel::OnDataChannelReadyToSend(bool writable) { |
| 2321 // This is usded for congestion control to indicate that the stream is ready | 2332 // This is usded for congestion control to indicate that the stream is ready |
| 2322 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates | 2333 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates |
| 2323 // that the transport channel is ready. | 2334 // that the transport channel is ready. |
| 2324 signaling_thread()->Post(this, MSG_READYTOSENDDATA, | 2335 signaling_thread()->Post(this, MSG_READYTOSENDDATA, |
| 2325 new DataChannelReadyToSendMessageData(writable)); | 2336 new DataChannelReadyToSendMessageData(writable)); |
| 2326 } | 2337 } |
| 2327 | 2338 |
| 2328 void DataChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { | 2339 void DataChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites, |
| 2329 GetSupportedDataCryptoSuites(crypto_suites); | 2340 const MediaSessionOptions& options) const { |
| 2341 GetSupportedDataCryptoSuites(crypto_suites, options); |
| 2330 } | 2342 } |
| 2331 | 2343 |
| 2332 bool DataChannel::ShouldSetupDtlsSrtp() const { | 2344 bool DataChannel::ShouldSetupDtlsSrtp() const { |
| 2333 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp(); | 2345 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp(); |
| 2334 } | 2346 } |
| 2335 | 2347 |
| 2336 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { | 2348 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { |
| 2337 rtc::TypedMessageData<uint32_t>* message = | 2349 rtc::TypedMessageData<uint32_t>* message = |
| 2338 new rtc::TypedMessageData<uint32_t>(sid); | 2350 new rtc::TypedMessageData<uint32_t>(sid); |
| 2339 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); | 2351 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); |
| 2340 } | 2352 } |
| 2341 | 2353 |
| 2342 } // namespace cricket | 2354 } // namespace cricket |
| OLD | NEW |