blob: 2b379f55e6e67bb890a33ed0075437309e11782d [file] [log] [blame]
Zhi Huangf2d7beb2017-11-20 22:35:111/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 17:11:0011#ifndef PC_DTLS_SRTP_TRANSPORT_H_
12#define PC_DTLS_SRTP_TRANSPORT_H_
Zhi Huangf2d7beb2017-11-20 22:35:1113
Harald Alvestrandc24a2182022-02-23 13:44:5914#include <functional>
Florent Castelli8037fc62024-08-29 13:00:4015#include <optional>
Harald Alvestrand5761e7b2021-01-29 14:45:0816#include <string>
Zhi Huangf2d7beb2017-11-20 22:35:1117#include <vector>
18
Mirko Bonadei9f6808b2021-05-21 18:46:0919#include "api/dtls_transport_interface.h"
Steve Anton10542f22019-01-11 17:11:0020#include "api/rtc_error.h"
21#include "p2p/base/dtls_transport_internal.h"
22#include "p2p/base/packet_transport_internal.h"
23#include "pc/srtp_transport.h"
Joachim Bauch5b32f232018-03-07 19:02:2624#include "rtc_base/buffer.h"
Zhi Huangf2d7beb2017-11-20 22:35:1125
26namespace webrtc {
27
Zhi Huang365381f2018-04-13 23:44:3428// The subclass of SrtpTransport is used for DTLS-SRTP. When the DTLS handshake
29// is finished, it extracts the keying materials from DtlsTransport and
30// configures the SrtpSessions in the base class.
31class DtlsSrtpTransport : public SrtpTransport {
Zhi Huangf2d7beb2017-11-20 22:35:1132 public:
Jonas Orelande62c2f22022-03-29 09:04:4833 DtlsSrtpTransport(bool rtcp_mux_enabled, const FieldTrialsView& field_trials);
Zhi Huangf2d7beb2017-11-20 22:35:1134
35 // Set P2P layer RTP/RTCP DtlsTransports. When using RTCP-muxing,
Artem Titov880fa812021-07-30 20:30:2336 // `rtcp_dtls_transport` is null.
Zhi Huangf2d7beb2017-11-20 22:35:1137 void SetDtlsTransports(cricket::DtlsTransportInternal* rtp_dtls_transport,
38 cricket::DtlsTransportInternal* rtcp_dtls_transport);
39
40 void SetRtcpMuxEnabled(bool enable) override;
41
42 // Set the header extension ids that should be encrypted.
Zhi Huangcd3fc5d2017-11-29 18:41:5743 void UpdateSendEncryptedHeaderExtensionIds(
Zhi Huangf2d7beb2017-11-20 22:35:1144 const std::vector<int>& send_extension_ids);
45
Zhi Huangcd3fc5d2017-11-29 18:41:5746 void UpdateRecvEncryptedHeaderExtensionIds(
Zhi Huangf2d7beb2017-11-20 22:35:1147 const std::vector<int>& recv_extension_ids);
48
Lahiru Ginnaliya Gamathigec32f00e2021-02-17 08:43:2149 void SetOnDtlsStateChange(std::function<void(void)> callback);
Zhi Huangf2d7beb2017-11-20 22:35:1150
Artem Titov880fa812021-07-30 20:30:2351 // If `active_reset_srtp_params_` is set to be true, the SRTP parameters will
Zhi Huangb57e1692018-06-12 18:41:1152 // be reset whenever the DtlsTransports are reset.
53 void SetActiveResetSrtpParams(bool active_reset_srtp_params) {
54 active_reset_srtp_params_ = active_reset_srtp_params;
55 }
56
Zhi Huangf2d7beb2017-11-20 22:35:1157 private:
58 bool IsDtlsActive();
59 bool IsDtlsConnected();
60 bool IsDtlsWritable();
61 bool DtlsHandshakeCompleted();
62 void MaybeSetupDtlsSrtp();
63 void SetupRtpDtlsSrtp();
64 void SetupRtcpDtlsSrtp();
65 bool ExtractParams(cricket::DtlsTransportInternal* dtls_transport,
66 int* selected_crypto_suite,
Philipp Hancke03b2c9f2024-10-14 12:19:0367 rtc::ZeroOnFreeBuffer<uint8_t>* send_key,
68 rtc::ZeroOnFreeBuffer<uint8_t>* recv_key);
Zhi Huangf2d7beb2017-11-20 22:35:1169 void SetDtlsTransport(cricket::DtlsTransportInternal* new_dtls_transport,
70 cricket::DtlsTransportInternal** old_dtls_transport);
71 void SetRtpDtlsTransport(cricket::DtlsTransportInternal* rtp_dtls_transport);
72 void SetRtcpDtlsTransport(
73 cricket::DtlsTransportInternal* rtcp_dtls_transport);
Zhi Huangf2d7beb2017-11-20 22:35:1174
75 void OnDtlsState(cricket::DtlsTransportInternal* dtls_transport,
Mirko Bonadei9f6808b2021-05-21 18:46:0976 DtlsTransportState state);
Zhi Huangf2d7beb2017-11-20 22:35:1177
Zhi Huang365381f2018-04-13 23:44:3478 // Override the SrtpTransport::OnWritableState.
79 void OnWritableState(rtc::PacketTransportInternal* packet_transport) override;
80
Zhi Huangf2d7beb2017-11-20 22:35:1181 // Owned by the TransportController.
82 cricket::DtlsTransportInternal* rtp_dtls_transport_ = nullptr;
83 cricket::DtlsTransportInternal* rtcp_dtls_transport_ = nullptr;
84
85 // The encrypted header extension IDs.
Florent Castelli8037fc62024-08-29 13:00:4086 std::optional<std::vector<int>> send_extension_ids_;
87 std::optional<std::vector<int>> recv_extension_ids_;
Zhi Huangb57e1692018-06-12 18:41:1188
89 bool active_reset_srtp_params_ = false;
Lahiru Ginnaliya Gamathigec32f00e2021-02-17 08:43:2190 std::function<void(void)> on_dtls_state_change_;
Zhi Huangf2d7beb2017-11-20 22:35:1191};
92
93} // namespace webrtc
94
Steve Anton10542f22019-01-11 17:11:0095#endif // PC_DTLS_SRTP_TRANSPORT_H_