/* * Copyright 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef PC_DTLS_SRTP_TRANSPORT_H_ #define PC_DTLS_SRTP_TRANSPORT_H_ #include #include #include #include #include "api/dtls_transport_interface.h" #include "api/field_trials_view.h" #include "p2p/base/packet_transport_internal.h" #include "p2p/dtls/dtls_transport_internal.h" #include "pc/srtp_transport.h" #include "rtc_base/buffer.h" namespace webrtc { // The subclass of SrtpTransport is used for DTLS-SRTP. When the DTLS handshake // is finished, it extracts the keying materials from DtlsTransport and // configures the SrtpSessions in the base class. class DtlsSrtpTransport : public SrtpTransport { public: DtlsSrtpTransport(bool rtcp_mux_enabled, const FieldTrialsView& field_trials); // Set P2P layer RTP/RTCP DtlsTransports. When using RTCP-muxing, // `rtcp_dtls_transport` is null. void SetDtlsTransports(DtlsTransportInternal* rtp_dtls_transport, DtlsTransportInternal* rtcp_dtls_transport); void SetRtcpMuxEnabled(bool enable) override; // Set the header extension ids that should be encrypted. void UpdateSendEncryptedHeaderExtensionIds( const std::vector& send_extension_ids); void UpdateRecvEncryptedHeaderExtensionIds( const std::vector& recv_extension_ids); void SetOnDtlsStateChange(std::function callback); // If `active_reset_srtp_params_` is set to be true, the SRTP parameters will // be reset whenever the DtlsTransports are reset. void SetActiveResetSrtpParams(bool active_reset_srtp_params) { active_reset_srtp_params_ = active_reset_srtp_params; } private: bool IsDtlsActive(); bool IsDtlsConnected(); bool IsDtlsWritable(); bool DtlsHandshakeCompleted(); void MaybeSetupDtlsSrtp(); void SetupRtpDtlsSrtp(); void SetupRtcpDtlsSrtp(); bool ExtractParams(DtlsTransportInternal* dtls_transport, int* selected_crypto_suite, ZeroOnFreeBuffer* send_key, ZeroOnFreeBuffer* recv_key); void SetDtlsTransport(DtlsTransportInternal* new_dtls_transport, DtlsTransportInternal** old_dtls_transport); void SetRtpDtlsTransport(DtlsTransportInternal* rtp_dtls_transport); void SetRtcpDtlsTransport(DtlsTransportInternal* rtcp_dtls_transport); void OnDtlsState(DtlsTransportInternal* dtls_transport, DtlsTransportState state); // Override the SrtpTransport::OnWritableState. void OnWritableState(PacketTransportInternal* packet_transport) override; // Owned by the TransportController. DtlsTransportInternal* rtp_dtls_transport_ = nullptr; DtlsTransportInternal* rtcp_dtls_transport_ = nullptr; // The encrypted header extension IDs. std::optional> send_extension_ids_; std::optional> recv_extension_ids_; bool active_reset_srtp_params_ = false; std::function on_dtls_state_change_; }; } // namespace webrtc #endif // PC_DTLS_SRTP_TRANSPORT_H_