/* * 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_DTLSSRTPTRANSPORT_H_ #define PC_DTLSSRTPTRANSPORT_H_ #include #include #include #include "p2p/base/dtlstransportinternal.h" #include "pc/rtptransportinternaladapter.h" #include "pc/srtptransport.h" #include "rtc_base/buffer.h" namespace webrtc { // This class is intended to be used as an RtpTransport and it wraps both an // SrtpTransport and DtlsTransports(RTP/RTCP). When the DTLS handshake is // finished, it extracts the keying materials from DtlsTransport and sets them // to SrtpTransport. class DtlsSrtpTransport : public RtpTransportInternalAdapter { public: explicit DtlsSrtpTransport( std::unique_ptr srtp_transport); // Set P2P layer RTP/RTCP DtlsTransports. When using RTCP-muxing, // |rtcp_dtls_transport| is null. void SetDtlsTransports(cricket::DtlsTransportInternal* rtp_dtls_transport, cricket::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); bool IsSrtpActive() const override { return srtp_transport_->IsSrtpActive(); } // Cache RTP Absoulute SendTime extension header ID. This is only used when // external authentication is enabled. void CacheRtpAbsSendTimeHeaderExtension(int rtp_abs_sendtime_extn_id) { srtp_transport_->CacheRtpAbsSendTimeHeaderExtension( rtp_abs_sendtime_extn_id); } sigslot::signal2 SignalDtlsSrtpSetupFailure; RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override { return RTCError(RTCErrorType::UNSUPPORTED_OPERATION, "Set SRTP keys for DTLS-SRTP is not supported."); } RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override { return RTCError(RTCErrorType::UNSUPPORTED_OPERATION, "Set SRTP keys for DTLS-SRTP is not supported."); } private: bool IsDtlsActive(); bool IsDtlsConnected(); bool IsDtlsWritable(); bool DtlsHandshakeCompleted(); void MaybeSetupDtlsSrtp(); void SetupRtpDtlsSrtp(); void SetupRtcpDtlsSrtp(); bool ExtractParams(cricket::DtlsTransportInternal* dtls_transport, int* selected_crypto_suite, rtc::ZeroOnFreeBuffer* send_key, rtc::ZeroOnFreeBuffer* recv_key); void SetDtlsTransport(cricket::DtlsTransportInternal* new_dtls_transport, cricket::DtlsTransportInternal** old_dtls_transport); void SetRtpDtlsTransport(cricket::DtlsTransportInternal* rtp_dtls_transport); void SetRtcpDtlsTransport( cricket::DtlsTransportInternal* rtcp_dtls_transport); void UpdateWritableStateAndMaybeSetupDtlsSrtp(); // Set the writability and fire the SignalWritableState if the writability // changes. void SetWritable(bool writable); void OnDtlsState(cricket::DtlsTransportInternal* dtls_transport, cricket::DtlsTransportState state); void OnWritableState(bool writable); void OnSentPacket(const rtc::SentPacket& sent_packet); void OnPacketReceived(bool rtcp, rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time); void OnReadyToSend(bool ready); void OnNetworkRouteChanged(rtc::Optional network_route); bool writable_ = false; std::unique_ptr srtp_transport_; // Owned by the TransportController. cricket::DtlsTransportInternal* rtp_dtls_transport_ = nullptr; cricket::DtlsTransportInternal* rtcp_dtls_transport_ = nullptr; // The encrypted header extension IDs. rtc::Optional> send_extension_ids_; rtc::Optional> recv_extension_ids_; }; } // namespace webrtc #endif // PC_DTLSSRTPTRANSPORT_H_