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

Side by Side Diff: talk/session/media/channel.cc

Issue 1528843005: Add support for GCM cipher suites from RFC 7714. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebased Created 4 years, 11 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 * 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 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 break; 480 break;
481 case ST_RTCP: 481 case ST_RTCP:
482 channel = rtcp_transport_channel_; 482 channel = rtcp_transport_channel_;
483 rtcp_socket_options_.push_back( 483 rtcp_socket_options_.push_back(
484 std::pair<rtc::Socket::Option, int>(opt, value)); 484 std::pair<rtc::Socket::Option, int>(opt, value));
485 break; 485 break;
486 } 486 }
487 return channel ? channel->SetOption(opt, value) : -1; 487 return channel ? channel->SetOption(opt, value) : -1;
488 } 488 }
489 489
490 bool BaseChannel::SetCryptoOptions(const rtc::CryptoOptions& crypto_options) {
491 crypto_options_ = crypto_options;
492 return true;
493 }
494
490 void BaseChannel::OnWritableState(TransportChannel* channel) { 495 void BaseChannel::OnWritableState(TransportChannel* channel) {
491 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 496 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_);
492 UpdateWritableState_w(); 497 UpdateWritableState_w();
493 } 498 }
494 499
495 void BaseChannel::OnChannelRead(TransportChannel* channel, 500 void BaseChannel::OnChannelRead(TransportChannel* channel,
496 const char* data, size_t len, 501 const char* data, size_t len,
497 const rtc::PacketTime& packet_time, 502 const rtc::PacketTime& packet_time,
498 int flags) { 503 int flags) {
499 TRACE_EVENT0("webrtc", "BaseChannel::OnChannelRead"); 504 TRACE_EVENT0("webrtc", "BaseChannel::OnChannelRead");
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) { 853 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) {
849 ASSERT(signaling_thread() == rtc::Thread::Current()); 854 ASSERT(signaling_thread() == rtc::Thread::Current());
850 SignalDtlsSetupFailure(this, rtcp); 855 SignalDtlsSetupFailure(this, rtcp);
851 } 856 }
852 857
853 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) { 858 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) {
854 std::vector<int> crypto_suites; 859 std::vector<int> crypto_suites;
855 // We always use the default SRTP crypto suites for RTCP, but we may use 860 // We always use the default SRTP crypto suites for RTCP, but we may use
856 // different crypto suites for RTP depending on the media type. 861 // different crypto suites for RTP depending on the media type.
857 if (!rtcp) { 862 if (!rtcp) {
858 GetSrtpCryptoSuites(&crypto_suites); 863 GetSrtpCryptoSuites(crypto_options_, &crypto_suites);
859 } else { 864 } else {
860 GetDefaultSrtpCryptoSuites(&crypto_suites); 865 GetDefaultSrtpCryptoSuites(crypto_options_, &crypto_suites);
861 } 866 }
862 return tc->SetSrtpCryptoSuites(crypto_suites); 867 return tc->SetSrtpCryptoSuites(crypto_suites);
863 } 868 }
864 869
865 bool BaseChannel::ShouldSetupDtlsSrtp() const { 870 bool BaseChannel::ShouldSetupDtlsSrtp() const {
866 // Since DTLS is applied to all channels, checking RTP should be enough. 871 // Since DTLS is applied to all channels, checking RTP should be enough.
867 return transport_channel_ && transport_channel_->IsDtlsActive(); 872 return transport_channel_ && transport_channel_->IsDtlsActive();
868 } 873 }
869 874
870 // This function returns true if either DTLS-SRTP is not in use 875 // This function returns true if either DTLS-SRTP is not in use
(...skipping 10 matching lines...) Expand all
881 886
882 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { 887 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) {
883 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; 888 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite";
884 return false; 889 return false;
885 } 890 }
886 891
887 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " 892 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on "
888 << content_name() << " " 893 << content_name() << " "
889 << PacketType(rtcp_channel); 894 << PacketType(rtcp_channel);
890 895
896 int key_len;
897 int salt_len;
898 if (!rtc::GetSrtpKeyAndSaltLengths(selected_crypto_suite, &key_len,
899 &salt_len)) {
900 LOG(LS_ERROR) << "Unknown DTLS-SRTP crypto suite" << selected_crypto_suite;
901 return false;
902 }
903
891 // OK, we're now doing DTLS (RFC 5764) 904 // OK, we're now doing DTLS (RFC 5764)
892 std::vector<unsigned char> dtls_buffer(SRTP_MASTER_KEY_KEY_LEN * 2 + 905 std::vector<unsigned char> dtls_buffer(key_len * 2 + salt_len * 2);
893 SRTP_MASTER_KEY_SALT_LEN * 2);
894 906
895 // RFC 5705 exporter using the RFC 5764 parameters 907 // RFC 5705 exporter using the RFC 5764 parameters
896 if (!channel->ExportKeyingMaterial( 908 if (!channel->ExportKeyingMaterial(
897 kDtlsSrtpExporterLabel, 909 kDtlsSrtpExporterLabel,
898 NULL, 0, false, 910 NULL, 0, false,
899 &dtls_buffer[0], dtls_buffer.size())) { 911 &dtls_buffer[0], dtls_buffer.size())) {
900 LOG(LS_WARNING) << "DTLS-SRTP key export failed"; 912 LOG(LS_WARNING) << "DTLS-SRTP key export failed";
901 ASSERT(false); // This should never happen 913 ASSERT(false); // This should never happen
902 return false; 914 return false;
903 } 915 }
904 916
905 // Sync up the keys with the DTLS-SRTP interface 917 // Sync up the keys with the DTLS-SRTP interface
906 std::vector<unsigned char> client_write_key(SRTP_MASTER_KEY_KEY_LEN + 918 std::vector<unsigned char> client_write_key(key_len + salt_len);
907 SRTP_MASTER_KEY_SALT_LEN); 919 std::vector<unsigned char> server_write_key(key_len + salt_len);
908 std::vector<unsigned char> server_write_key(SRTP_MASTER_KEY_KEY_LEN +
909 SRTP_MASTER_KEY_SALT_LEN);
910 size_t offset = 0; 920 size_t offset = 0;
911 memcpy(&client_write_key[0], &dtls_buffer[offset], 921 memcpy(&client_write_key[0], &dtls_buffer[offset], key_len);
912 SRTP_MASTER_KEY_KEY_LEN); 922 offset += key_len;
913 offset += SRTP_MASTER_KEY_KEY_LEN; 923 memcpy(&server_write_key[0], &dtls_buffer[offset], key_len);
914 memcpy(&server_write_key[0], &dtls_buffer[offset], 924 offset += key_len;
915 SRTP_MASTER_KEY_KEY_LEN); 925 memcpy(&client_write_key[key_len], &dtls_buffer[offset], salt_len);
916 offset += SRTP_MASTER_KEY_KEY_LEN; 926 offset += salt_len;
917 memcpy(&client_write_key[SRTP_MASTER_KEY_KEY_LEN], 927 memcpy(&server_write_key[key_len], &dtls_buffer[offset], salt_len);
918 &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN);
919 offset += SRTP_MASTER_KEY_SALT_LEN;
920 memcpy(&server_write_key[SRTP_MASTER_KEY_KEY_LEN],
921 &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN);
922 928
923 std::vector<unsigned char> *send_key, *recv_key; 929 std::vector<unsigned char> *send_key, *recv_key;
924 rtc::SSLRole role; 930 rtc::SSLRole role;
925 if (!channel->GetSslRole(&role)) { 931 if (!channel->GetSslRole(&role)) {
926 LOG(LS_WARNING) << "GetSslRole failed"; 932 LOG(LS_WARNING) << "GetSslRole failed";
927 return false; 933 return false;
928 } 934 }
929 935
930 if (role == rtc::SSL_SERVER) { 936 if (role == rtc::SSL_SERVER) {
931 send_key = &server_write_key; 937 send_key = &server_write_key;
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
1629 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) { 1635 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) {
1630 ASSERT(media_channel == this->media_channel()); 1636 ASSERT(media_channel == this->media_channel());
1631 SignalMediaMonitor(this, info); 1637 SignalMediaMonitor(this, info);
1632 } 1638 }
1633 1639
1634 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, 1640 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor,
1635 const AudioInfo& info) { 1641 const AudioInfo& info) {
1636 SignalAudioMonitor(this, info); 1642 SignalAudioMonitor(this, info);
1637 } 1643 }
1638 1644
1639 void VoiceChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { 1645 void VoiceChannel::GetSrtpCryptoSuites(const rtc::CryptoOptions& crypto_options,
1640 GetSupportedAudioCryptoSuites(crypto_suites); 1646 std::vector<int>* crypto_suites) const {
1647 GetSupportedAudioCryptoSuites(crypto_options, crypto_suites);
1641 } 1648 }
1642 1649
1643 VideoChannel::VideoChannel(rtc::Thread* thread, 1650 VideoChannel::VideoChannel(rtc::Thread* thread,
1644 VideoMediaChannel* media_channel, 1651 VideoMediaChannel* media_channel,
1645 TransportController* transport_controller, 1652 TransportController* transport_controller,
1646 const std::string& content_name, 1653 const std::string& content_name,
1647 bool rtcp) 1654 bool rtcp)
1648 : BaseChannel(thread, 1655 : BaseChannel(thread,
1649 media_channel, 1656 media_channel,
1650 transport_controller, 1657 transport_controller,
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
1994 for (ScreencastMap::iterator iter = screencast_capturers_.begin(); 2001 for (ScreencastMap::iterator iter = screencast_capturers_.begin();
1995 iter != screencast_capturers_.end(); ++iter) { 2002 iter != screencast_capturers_.end(); ++iter) {
1996 if (iter->second == capturer) { 2003 if (iter->second == capturer) {
1997 *ssrc = iter->first; 2004 *ssrc = iter->first;
1998 return true; 2005 return true;
1999 } 2006 }
2000 } 2007 }
2001 return false; 2008 return false;
2002 } 2009 }
2003 2010
2004 void VideoChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { 2011 void VideoChannel::GetSrtpCryptoSuites(const rtc::CryptoOptions& crypto_options,
2005 GetSupportedVideoCryptoSuites(crypto_suites); 2012 std::vector<int>* crypto_suites) const {
2013 GetSupportedVideoCryptoSuites(crypto_options, crypto_suites);
2006 } 2014 }
2007 2015
2008 DataChannel::DataChannel(rtc::Thread* thread, 2016 DataChannel::DataChannel(rtc::Thread* thread,
2009 DataMediaChannel* media_channel, 2017 DataMediaChannel* media_channel,
2010 TransportController* transport_controller, 2018 TransportController* transport_controller,
2011 const std::string& content_name, 2019 const std::string& content_name,
2012 bool rtcp) 2020 bool rtcp)
2013 : BaseChannel(thread, 2021 : BaseChannel(thread,
2014 media_channel, 2022 media_channel,
2015 transport_controller, 2023 transport_controller,
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
2303 } 2311 }
2304 2312
2305 void DataChannel::OnDataChannelReadyToSend(bool writable) { 2313 void DataChannel::OnDataChannelReadyToSend(bool writable) {
2306 // This is usded for congestion control to indicate that the stream is ready 2314 // This is usded for congestion control to indicate that the stream is ready
2307 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates 2315 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates
2308 // that the transport channel is ready. 2316 // that the transport channel is ready.
2309 signaling_thread()->Post(this, MSG_READYTOSENDDATA, 2317 signaling_thread()->Post(this, MSG_READYTOSENDDATA,
2310 new DataChannelReadyToSendMessageData(writable)); 2318 new DataChannelReadyToSendMessageData(writable));
2311 } 2319 }
2312 2320
2313 void DataChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { 2321 void DataChannel::GetSrtpCryptoSuites(const rtc::CryptoOptions& crypto_options,
2314 GetSupportedDataCryptoSuites(crypto_suites); 2322 std::vector<int>* crypto_suites) const {
2323 GetSupportedDataCryptoSuites(crypto_options, crypto_suites);
2315 } 2324 }
2316 2325
2317 bool DataChannel::ShouldSetupDtlsSrtp() const { 2326 bool DataChannel::ShouldSetupDtlsSrtp() const {
2318 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp(); 2327 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp();
2319 } 2328 }
2320 2329
2321 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { 2330 void DataChannel::OnStreamClosedRemotely(uint32_t sid) {
2322 rtc::TypedMessageData<uint32_t>* message = 2331 rtc::TypedMessageData<uint32_t>* message =
2323 new rtc::TypedMessageData<uint32_t>(sid); 2332 new rtc::TypedMessageData<uint32_t>(sid);
2324 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); 2333 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message);
2325 } 2334 }
2326 2335
2327 } // namespace cricket 2336 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698