1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2017 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef PC_DTLS_SRTP_TRANSPORT_H_ 12*d9f75844SAndroid Build Coastguard Worker #define PC_DTLS_SRTP_TRANSPORT_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <functional> 15*d9f75844SAndroid Build Coastguard Worker #include <string> 16*d9f75844SAndroid Build Coastguard Worker #include <vector> 17*d9f75844SAndroid Build Coastguard Worker 18*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 19*d9f75844SAndroid Build Coastguard Worker #include "api/crypto_params.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/dtls_transport_interface.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_error.h" 22*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/dtls_transport_internal.h" 23*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/packet_transport_internal.h" 24*d9f75844SAndroid Build Coastguard Worker #include "pc/srtp_transport.h" 25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h" 26*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/third_party/sigslot/sigslot.h" 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 29*d9f75844SAndroid Build Coastguard Worker 30*d9f75844SAndroid Build Coastguard Worker // The subclass of SrtpTransport is used for DTLS-SRTP. When the DTLS handshake 31*d9f75844SAndroid Build Coastguard Worker // is finished, it extracts the keying materials from DtlsTransport and 32*d9f75844SAndroid Build Coastguard Worker // configures the SrtpSessions in the base class. 33*d9f75844SAndroid Build Coastguard Worker class DtlsSrtpTransport : public SrtpTransport { 34*d9f75844SAndroid Build Coastguard Worker public: 35*d9f75844SAndroid Build Coastguard Worker DtlsSrtpTransport(bool rtcp_mux_enabled, const FieldTrialsView& field_trials); 36*d9f75844SAndroid Build Coastguard Worker 37*d9f75844SAndroid Build Coastguard Worker // Set P2P layer RTP/RTCP DtlsTransports. When using RTCP-muxing, 38*d9f75844SAndroid Build Coastguard Worker // `rtcp_dtls_transport` is null. 39*d9f75844SAndroid Build Coastguard Worker void SetDtlsTransports(cricket::DtlsTransportInternal* rtp_dtls_transport, 40*d9f75844SAndroid Build Coastguard Worker cricket::DtlsTransportInternal* rtcp_dtls_transport); 41*d9f75844SAndroid Build Coastguard Worker 42*d9f75844SAndroid Build Coastguard Worker void SetRtcpMuxEnabled(bool enable) override; 43*d9f75844SAndroid Build Coastguard Worker 44*d9f75844SAndroid Build Coastguard Worker // Set the header extension ids that should be encrypted. 45*d9f75844SAndroid Build Coastguard Worker void UpdateSendEncryptedHeaderExtensionIds( 46*d9f75844SAndroid Build Coastguard Worker const std::vector<int>& send_extension_ids); 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker void UpdateRecvEncryptedHeaderExtensionIds( 49*d9f75844SAndroid Build Coastguard Worker const std::vector<int>& recv_extension_ids); 50*d9f75844SAndroid Build Coastguard Worker 51*d9f75844SAndroid Build Coastguard Worker void SetOnDtlsStateChange(std::function<void(void)> callback); 52*d9f75844SAndroid Build Coastguard Worker SetSrtpSendKey(const cricket::CryptoParams & params)53*d9f75844SAndroid Build Coastguard Worker RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override { 54*d9f75844SAndroid Build Coastguard Worker return RTCError(RTCErrorType::UNSUPPORTED_OPERATION, 55*d9f75844SAndroid Build Coastguard Worker "Set SRTP keys for DTLS-SRTP is not supported."); 56*d9f75844SAndroid Build Coastguard Worker } SetSrtpReceiveKey(const cricket::CryptoParams & params)57*d9f75844SAndroid Build Coastguard Worker RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override { 58*d9f75844SAndroid Build Coastguard Worker return RTCError(RTCErrorType::UNSUPPORTED_OPERATION, 59*d9f75844SAndroid Build Coastguard Worker "Set SRTP keys for DTLS-SRTP is not supported."); 60*d9f75844SAndroid Build Coastguard Worker } 61*d9f75844SAndroid Build Coastguard Worker 62*d9f75844SAndroid Build Coastguard Worker // If `active_reset_srtp_params_` is set to be true, the SRTP parameters will 63*d9f75844SAndroid Build Coastguard Worker // be reset whenever the DtlsTransports are reset. SetActiveResetSrtpParams(bool active_reset_srtp_params)64*d9f75844SAndroid Build Coastguard Worker void SetActiveResetSrtpParams(bool active_reset_srtp_params) { 65*d9f75844SAndroid Build Coastguard Worker active_reset_srtp_params_ = active_reset_srtp_params; 66*d9f75844SAndroid Build Coastguard Worker } 67*d9f75844SAndroid Build Coastguard Worker 68*d9f75844SAndroid Build Coastguard Worker private: 69*d9f75844SAndroid Build Coastguard Worker bool IsDtlsActive(); 70*d9f75844SAndroid Build Coastguard Worker bool IsDtlsConnected(); 71*d9f75844SAndroid Build Coastguard Worker bool IsDtlsWritable(); 72*d9f75844SAndroid Build Coastguard Worker bool DtlsHandshakeCompleted(); 73*d9f75844SAndroid Build Coastguard Worker void MaybeSetupDtlsSrtp(); 74*d9f75844SAndroid Build Coastguard Worker void SetupRtpDtlsSrtp(); 75*d9f75844SAndroid Build Coastguard Worker void SetupRtcpDtlsSrtp(); 76*d9f75844SAndroid Build Coastguard Worker bool ExtractParams(cricket::DtlsTransportInternal* dtls_transport, 77*d9f75844SAndroid Build Coastguard Worker int* selected_crypto_suite, 78*d9f75844SAndroid Build Coastguard Worker rtc::ZeroOnFreeBuffer<unsigned char>* send_key, 79*d9f75844SAndroid Build Coastguard Worker rtc::ZeroOnFreeBuffer<unsigned char>* recv_key); 80*d9f75844SAndroid Build Coastguard Worker void SetDtlsTransport(cricket::DtlsTransportInternal* new_dtls_transport, 81*d9f75844SAndroid Build Coastguard Worker cricket::DtlsTransportInternal** old_dtls_transport); 82*d9f75844SAndroid Build Coastguard Worker void SetRtpDtlsTransport(cricket::DtlsTransportInternal* rtp_dtls_transport); 83*d9f75844SAndroid Build Coastguard Worker void SetRtcpDtlsTransport( 84*d9f75844SAndroid Build Coastguard Worker cricket::DtlsTransportInternal* rtcp_dtls_transport); 85*d9f75844SAndroid Build Coastguard Worker 86*d9f75844SAndroid Build Coastguard Worker void OnDtlsState(cricket::DtlsTransportInternal* dtls_transport, 87*d9f75844SAndroid Build Coastguard Worker DtlsTransportState state); 88*d9f75844SAndroid Build Coastguard Worker 89*d9f75844SAndroid Build Coastguard Worker // Override the SrtpTransport::OnWritableState. 90*d9f75844SAndroid Build Coastguard Worker void OnWritableState(rtc::PacketTransportInternal* packet_transport) override; 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker // Owned by the TransportController. 93*d9f75844SAndroid Build Coastguard Worker cricket::DtlsTransportInternal* rtp_dtls_transport_ = nullptr; 94*d9f75844SAndroid Build Coastguard Worker cricket::DtlsTransportInternal* rtcp_dtls_transport_ = nullptr; 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker // The encrypted header extension IDs. 97*d9f75844SAndroid Build Coastguard Worker absl::optional<std::vector<int>> send_extension_ids_; 98*d9f75844SAndroid Build Coastguard Worker absl::optional<std::vector<int>> recv_extension_ids_; 99*d9f75844SAndroid Build Coastguard Worker 100*d9f75844SAndroid Build Coastguard Worker bool active_reset_srtp_params_ = false; 101*d9f75844SAndroid Build Coastguard Worker std::function<void(void)> on_dtls_state_change_; 102*d9f75844SAndroid Build Coastguard Worker }; 103*d9f75844SAndroid Build Coastguard Worker 104*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker #endif // PC_DTLS_SRTP_TRANSPORT_H_ 107