xref: /aosp_15_r20/external/webrtc/pc/dtls_srtp_transport.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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