blob: 7c4c5906c94b1873a4a971056283ba61efd73981 [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 Alvestrand5761e7b2021-01-29 14:45:0814#include <string>
Zhi Huangf2d7beb2017-11-20 22:35:1115#include <vector>
16
Yves Gerey3e707812018-11-28 15:47:4917#include "absl/types/optional.h"
Steve Anton10542f22019-01-11 17:11:0018#include "api/crypto_params.h"
19#include "api/rtc_error.h"
20#include "p2p/base/dtls_transport_internal.h"
21#include "p2p/base/packet_transport_internal.h"
22#include "pc/srtp_transport.h"
Joachim Bauch5b32f232018-03-07 19:02:2623#include "rtc_base/buffer.h"
Yves Gerey3e707812018-11-28 15:47:4924#include "rtc_base/third_party/sigslot/sigslot.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:
Zhi Huang365381f2018-04-13 23:44:3433 explicit DtlsSrtpTransport(bool rtcp_mux_enabled);
Zhi Huangf2d7beb2017-11-20 22:35:1134
35 // Set P2P layer RTP/RTCP DtlsTransports. When using RTCP-muxing,
36 // |rtcp_dtls_transport| is null.
37 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
Jonas Olsson635474e2018-10-18 13:58:1749 sigslot::signal<DtlsSrtpTransport*, bool> SignalDtlsSrtpSetupFailure;
50 sigslot::signal<> SignalDtlsStateChange;
Zhi Huangf2d7beb2017-11-20 22:35:1151
Zhi Huange830e682018-03-30 17:48:3552 RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override {
53 return RTCError(RTCErrorType::UNSUPPORTED_OPERATION,
54 "Set SRTP keys for DTLS-SRTP is not supported.");
55 }
56 RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override {
57 return RTCError(RTCErrorType::UNSUPPORTED_OPERATION,
58 "Set SRTP keys for DTLS-SRTP is not supported.");
59 }
60
Zhi Huangb57e1692018-06-12 18:41:1161 // If |active_reset_srtp_params_| is set to be true, the SRTP parameters will
62 // be reset whenever the DtlsTransports are reset.
63 void SetActiveResetSrtpParams(bool active_reset_srtp_params) {
64 active_reset_srtp_params_ = active_reset_srtp_params;
65 }
66
Zhi Huangf2d7beb2017-11-20 22:35:1167 private:
68 bool IsDtlsActive();
69 bool IsDtlsConnected();
70 bool IsDtlsWritable();
71 bool DtlsHandshakeCompleted();
72 void MaybeSetupDtlsSrtp();
73 void SetupRtpDtlsSrtp();
74 void SetupRtcpDtlsSrtp();
75 bool ExtractParams(cricket::DtlsTransportInternal* dtls_transport,
76 int* selected_crypto_suite,
Joachim Bauch5b32f232018-03-07 19:02:2677 rtc::ZeroOnFreeBuffer<unsigned char>* send_key,
78 rtc::ZeroOnFreeBuffer<unsigned char>* recv_key);
Zhi Huangf2d7beb2017-11-20 22:35:1179 void SetDtlsTransport(cricket::DtlsTransportInternal* new_dtls_transport,
80 cricket::DtlsTransportInternal** old_dtls_transport);
81 void SetRtpDtlsTransport(cricket::DtlsTransportInternal* rtp_dtls_transport);
82 void SetRtcpDtlsTransport(
83 cricket::DtlsTransportInternal* rtcp_dtls_transport);
Zhi Huangf2d7beb2017-11-20 22:35:1184
85 void OnDtlsState(cricket::DtlsTransportInternal* dtls_transport,
86 cricket::DtlsTransportState state);
Zhi Huangf2d7beb2017-11-20 22:35:1187
Zhi Huang365381f2018-04-13 23:44:3488 // Override the SrtpTransport::OnWritableState.
89 void OnWritableState(rtc::PacketTransportInternal* packet_transport) override;
90
Zhi Huangf2d7beb2017-11-20 22:35:1191 // Owned by the TransportController.
92 cricket::DtlsTransportInternal* rtp_dtls_transport_ = nullptr;
93 cricket::DtlsTransportInternal* rtcp_dtls_transport_ = nullptr;
94
95 // The encrypted header extension IDs.
Danil Chapovalov66cadcc2018-06-19 14:47:4396 absl::optional<std::vector<int>> send_extension_ids_;
97 absl::optional<std::vector<int>> recv_extension_ids_;
Zhi Huangb57e1692018-06-12 18:41:1198
99 bool active_reset_srtp_params_ = false;
Zhi Huangf2d7beb2017-11-20 22:35:11100};
101
102} // namespace webrtc
103
Steve Anton10542f22019-01-11 17:11:00104#endif // PC_DTLS_SRTP_TRANSPORT_H_