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

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: Added PeerConnection tests using GCM ciphers, fixed passing of flag through DtlsTransportChannel. Created 5 years 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 830 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 841
842 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) { 842 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) {
843 std::vector<int> crypto_suites; 843 std::vector<int> crypto_suites;
844 // We always use the default SRTP crypto suites for RTCP, but we may use 844 // 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. 845 // different crypto suites for RTP depending on the media type.
846 if (!rtcp) { 846 if (!rtcp) {
847 GetSrtpCryptoSuites(&crypto_suites); 847 GetSrtpCryptoSuites(&crypto_suites);
848 } else { 848 } else {
849 GetDefaultSrtpCryptoSuites(&crypto_suites); 849 GetDefaultSrtpCryptoSuites(&crypto_suites);
850 } 850 }
851 if (!tc->IsEnableGcmCiphers()) {
852 FilterGcmCiphers(&crypto_suites);
853 }
pthatcher1 2015/12/18 20:31:31 Having the "enable gcm ciphers" passed down from t
joachim 2015/12/19 15:26:23 Agreed. I pass the flag from the PeerConnectionFac
851 return tc->SetSrtpCryptoSuites(crypto_suites); 854 return tc->SetSrtpCryptoSuites(crypto_suites);
852 } 855 }
853 856
854 bool BaseChannel::ShouldSetupDtlsSrtp() const { 857 bool BaseChannel::ShouldSetupDtlsSrtp() const {
855 // Since DTLS is applied to all channels, checking RTP should be enough. 858 // Since DTLS is applied to all channels, checking RTP should be enough.
856 return transport_channel_ && transport_channel_->IsDtlsActive(); 859 return transport_channel_ && transport_channel_->IsDtlsActive();
857 } 860 }
858 861
859 // This function returns true if either DTLS-SRTP is not in use 862 // This function returns true if either DTLS-SRTP is not in use
860 // *or* DTLS-SRTP is successfully set up. 863 // *or* DTLS-SRTP is successfully set up.
861 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) { 864 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) {
862 bool ret = false; 865 bool ret = false;
863 866
864 TransportChannel* channel = 867 TransportChannel* channel =
865 rtcp_channel ? rtcp_transport_channel_ : transport_channel_; 868 rtcp_channel ? rtcp_transport_channel_ : transport_channel_;
866 869
867 RTC_DCHECK(channel->IsDtlsActive()); 870 RTC_DCHECK(channel->IsDtlsActive());
868 871
869 int selected_crypto_suite; 872 int selected_crypto_suite;
870 873
871 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { 874 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) {
872 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; 875 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite";
873 return false; 876 return false;
874 } 877 }
875 878
876 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " 879 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on "
877 << content_name() << " " 880 << content_name() << " "
878 << PacketType(rtcp_channel); 881 << PacketType(rtcp_channel);
879 882
883 int key_len;
884 int salt_len;
885 if (!rtc::SrtpCryptoSuiteParams(selected_crypto_suite, &key_len, &salt_len)) {
pthatcher1 2015/12/18 20:31:31 Can you call this GetSrtpKeyAndSaltLengths?
joachim 2015/12/19 15:26:23 Done.
886 LOG(LS_ERROR) << "Unknown DTLS-SRTP crypto suite" << selected_crypto_suite;
887 return false;
888 }
889
880 // OK, we're now doing DTLS (RFC 5764) 890 // OK, we're now doing DTLS (RFC 5764)
881 std::vector<unsigned char> dtls_buffer(SRTP_MASTER_KEY_KEY_LEN * 2 + 891 std::vector<unsigned char> dtls_buffer(key_len * 2 + salt_len * 2);
882 SRTP_MASTER_KEY_SALT_LEN * 2);
883 892
884 // RFC 5705 exporter using the RFC 5764 parameters 893 // RFC 5705 exporter using the RFC 5764 parameters
885 if (!channel->ExportKeyingMaterial( 894 if (!channel->ExportKeyingMaterial(
886 kDtlsSrtpExporterLabel, 895 kDtlsSrtpExporterLabel,
887 NULL, 0, false, 896 NULL, 0, false,
888 &dtls_buffer[0], dtls_buffer.size())) { 897 &dtls_buffer[0], dtls_buffer.size())) {
889 LOG(LS_WARNING) << "DTLS-SRTP key export failed"; 898 LOG(LS_WARNING) << "DTLS-SRTP key export failed";
890 ASSERT(false); // This should never happen 899 ASSERT(false); // This should never happen
891 return false; 900 return false;
892 } 901 }
893 902
894 // Sync up the keys with the DTLS-SRTP interface 903 // Sync up the keys with the DTLS-SRTP interface
895 std::vector<unsigned char> client_write_key(SRTP_MASTER_KEY_KEY_LEN + 904 std::vector<unsigned char> client_write_key(key_len + salt_len);
896 SRTP_MASTER_KEY_SALT_LEN); 905 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; 906 size_t offset = 0;
900 memcpy(&client_write_key[0], &dtls_buffer[offset], 907 memcpy(&client_write_key[0], &dtls_buffer[offset], key_len);
901 SRTP_MASTER_KEY_KEY_LEN); 908 offset += key_len;
902 offset += SRTP_MASTER_KEY_KEY_LEN; 909 memcpy(&server_write_key[0], &dtls_buffer[offset], key_len);
903 memcpy(&server_write_key[0], &dtls_buffer[offset], 910 offset += key_len;
904 SRTP_MASTER_KEY_KEY_LEN); 911 memcpy(&client_write_key[key_len], &dtls_buffer[offset], salt_len);
905 offset += SRTP_MASTER_KEY_KEY_LEN; 912 offset += salt_len;
906 memcpy(&client_write_key[SRTP_MASTER_KEY_KEY_LEN], 913 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 914
912 std::vector<unsigned char> *send_key, *recv_key; 915 std::vector<unsigned char> *send_key, *recv_key;
913 rtc::SSLRole role; 916 rtc::SSLRole role;
914 if (!channel->GetSslRole(&role)) { 917 if (!channel->GetSslRole(&role)) {
915 LOG(LS_WARNING) << "GetSslRole failed"; 918 LOG(LS_WARNING) << "GetSslRole failed";
916 return false; 919 return false;
917 } 920 }
918 921
919 if (role == rtc::SSL_SERVER) { 922 if (role == rtc::SSL_SERVER) {
920 send_key = &server_write_key; 923 send_key = &server_write_key;
(...skipping 1412 matching lines...) Expand 10 before | Expand all | Expand 10 after
2333 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp(); 2336 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp();
2334 } 2337 }
2335 2338
2336 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { 2339 void DataChannel::OnStreamClosedRemotely(uint32_t sid) {
2337 rtc::TypedMessageData<uint32_t>* message = 2340 rtc::TypedMessageData<uint32_t>* message =
2338 new rtc::TypedMessageData<uint32_t>(sid); 2341 new rtc::TypedMessageData<uint32_t>(sid);
2339 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); 2342 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message);
2340 } 2343 }
2341 2344
2342 } // namespace cricket 2345 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698