2017-01-03 11:34:12 -08:00
|
|
|
/*
|
|
|
|
|
* Copyright 2016 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.
|
|
|
|
|
*/
|
|
|
|
|
|
2019-01-11 09:11:00 -08:00
|
|
|
#ifndef P2P_BASE_DTLS_TRANSPORT_INTERNAL_H_
|
|
|
|
|
#define P2P_BASE_DTLS_TRANSPORT_INTERNAL_H_
|
2017-01-03 11:34:12 -08:00
|
|
|
|
2018-11-28 16:47:49 +01:00
|
|
|
#include <stddef.h>
|
|
|
|
|
#include <stdint.h>
|
2019-05-23 15:50:38 -07:00
|
|
|
|
2017-01-03 11:34:12 -08:00
|
|
|
#include <memory>
|
|
|
|
|
#include <string>
|
2021-02-02 07:27:09 -08:00
|
|
|
#include <utility>
|
2017-01-03 11:34:12 -08:00
|
|
|
|
2021-04-03 17:53:54 +02:00
|
|
|
#include "absl/base/attributes.h"
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "api/crypto/crypto_options.h"
|
2019-05-23 15:50:38 -07:00
|
|
|
#include "api/dtls_transport_interface.h"
|
2019-01-25 20:26:48 +01:00
|
|
|
#include "api/scoped_refptr.h"
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "p2p/base/ice_transport_internal.h"
|
|
|
|
|
#include "p2p/base/packet_transport_internal.h"
|
2021-02-02 07:27:09 -08:00
|
|
|
#include "rtc_base/callback_list.h"
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "rtc_base/ssl_certificate.h"
|
|
|
|
|
#include "rtc_base/ssl_fingerprint.h"
|
|
|
|
|
#include "rtc_base/ssl_stream_adapter.h"
|
2017-01-03 11:34:12 -08:00
|
|
|
|
|
|
|
|
namespace cricket {
|
|
|
|
|
|
2017-01-19 16:54:25 -08:00
|
|
|
enum PacketFlags {
|
|
|
|
|
PF_NORMAL = 0x00, // A normal packet.
|
|
|
|
|
PF_SRTP_BYPASS = 0x01, // An encrypted SRTP packet; bypass any additional
|
|
|
|
|
// crypto provided by the transport (e.g. DTLS)
|
|
|
|
|
};
|
|
|
|
|
|
Negotiate the same SRTP crypto suites for every DTLS association formed.
Before this CL, we would negotiate:
- No crypto suites for data m= sections.
- A full set for audio m= sections.
- The full set, minus SRTP_AES128_CM_SHA1_32 for video m= sections.
However, this doesn't make sense with BUNDLE, since any DTLS
association could end up being used for any type of media. If
video is "bundled on" the audio transport (which is typical), it
will actually end up using SRTP_AES128_CM_SHA1_32.
So, this CL moves the responsibility of deciding SRTP crypto suites out
of BaseChannel and into DtlsTransport. The only two possibilities are
now "normal set" or "normal set + GCM", if enabled by the PC factory
options.
This fixes an issue (see linked bug) that was occurring when audio/video
were "bundled onto" the data transport. Since the data transport
wasn't negotiating any SRTP crypto suites, none were available to use
for audio/video, so the application would get black video/no audio.
This CL doesn't affect the SDES SRTP crypto suite negotiation;
it only affects the negotiation in the DLTS handshake, through
the use_srtp extension.
BUG=chromium:711243
Review-Url: https://codereview.webrtc.org/2815513012
Cr-Commit-Position: refs/heads/master@{#17810}
2017-04-21 03:23:33 -07:00
|
|
|
// DtlsTransportInternal is an internal interface that does DTLS, also
|
|
|
|
|
// negotiating SRTP crypto suites so that it may be used for DTLS-SRTP.
|
|
|
|
|
//
|
2017-01-03 11:34:12 -08:00
|
|
|
// Once the public interface is supported,
|
|
|
|
|
// (https://www.w3.org/TR/webrtc/#rtcdtlstransport-interface)
|
|
|
|
|
// the DtlsTransportInterface will be split from this class.
|
2017-02-10 11:31:50 -08:00
|
|
|
class DtlsTransportInternal : public rtc::PacketTransportInternal {
|
2017-01-03 11:34:12 -08:00
|
|
|
public:
|
2017-10-30 10:01:15 -07:00
|
|
|
~DtlsTransportInternal() override;
|
2017-01-03 11:34:12 -08:00
|
|
|
|
2022-01-18 09:35:48 +09:00
|
|
|
DtlsTransportInternal(const DtlsTransportInternal&) = delete;
|
|
|
|
|
DtlsTransportInternal& operator=(const DtlsTransportInternal&) = delete;
|
|
|
|
|
|
2021-05-21 20:46:09 +02:00
|
|
|
virtual webrtc::DtlsTransportState dtls_state() const = 0;
|
2017-01-03 11:34:12 -08:00
|
|
|
|
|
|
|
|
virtual int component() const = 0;
|
|
|
|
|
|
|
|
|
|
virtual bool IsDtlsActive() const = 0;
|
|
|
|
|
|
2018-02-22 15:26:27 -08:00
|
|
|
virtual bool GetDtlsRole(rtc::SSLRole* role) const = 0;
|
2017-01-03 11:34:12 -08:00
|
|
|
|
2018-02-22 15:26:27 -08:00
|
|
|
virtual bool SetDtlsRole(rtc::SSLRole role) = 0;
|
2017-01-03 11:34:12 -08:00
|
|
|
|
2019-10-28 09:51:17 +01:00
|
|
|
// Finds out which TLS/DTLS version is running.
|
|
|
|
|
virtual bool GetSslVersionBytes(int* version) const = 0;
|
2017-01-03 11:34:12 -08:00
|
|
|
// Finds out which DTLS-SRTP cipher was negotiated.
|
|
|
|
|
// TODO(zhihuang): Remove this once all dependencies implement this.
|
|
|
|
|
virtual bool GetSrtpCryptoSuite(int* cipher) = 0;
|
|
|
|
|
|
|
|
|
|
// Finds out which DTLS cipher was negotiated.
|
|
|
|
|
// TODO(zhihuang): Remove this once all dependencies implement this.
|
|
|
|
|
virtual bool GetSslCipherSuite(int* cipher) = 0;
|
|
|
|
|
|
|
|
|
|
// Gets the local RTCCertificate used for DTLS.
|
|
|
|
|
virtual rtc::scoped_refptr<rtc::RTCCertificate> GetLocalCertificate()
|
|
|
|
|
const = 0;
|
|
|
|
|
|
|
|
|
|
virtual bool SetLocalCertificate(
|
|
|
|
|
const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) = 0;
|
|
|
|
|
|
2018-01-27 14:16:15 -08:00
|
|
|
// Gets a copy of the remote side's SSL certificate chain.
|
|
|
|
|
virtual std::unique_ptr<rtc::SSLCertChain> GetRemoteSSLCertChain() const = 0;
|
|
|
|
|
|
2017-01-03 11:34:12 -08:00
|
|
|
// Allows key material to be extracted for external encryption.
|
|
|
|
|
virtual bool ExportKeyingMaterial(const std::string& label,
|
|
|
|
|
const uint8_t* context,
|
|
|
|
|
size_t context_len,
|
|
|
|
|
bool use_context,
|
|
|
|
|
uint8_t* result,
|
|
|
|
|
size_t result_len) = 0;
|
|
|
|
|
|
|
|
|
|
// Set DTLS remote fingerprint. Must be after local identity set.
|
|
|
|
|
virtual bool SetRemoteFingerprint(const std::string& digest_alg,
|
|
|
|
|
const uint8_t* digest,
|
|
|
|
|
size_t digest_len) = 0;
|
|
|
|
|
|
2021-04-03 17:53:54 +02:00
|
|
|
ABSL_DEPRECATED("Set the max version via construction.")
|
|
|
|
|
bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2018-02-22 15:26:27 -08:00
|
|
|
|
2017-01-03 11:34:12 -08:00
|
|
|
// Expose the underneath IceTransport.
|
|
|
|
|
virtual IceTransportInternal* ice_transport() = 0;
|
|
|
|
|
|
2021-05-13 16:50:45 +02:00
|
|
|
// F: void(DtlsTransportInternal*, const webrtc::DtlsTransportState)
|
|
|
|
|
template <typename F>
|
|
|
|
|
void SubscribeDtlsTransportState(F&& callback) {
|
|
|
|
|
dtls_transport_state_callback_list_.AddReceiver(std::forward<F>(callback));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename F>
|
|
|
|
|
void SubscribeDtlsTransportState(const void* id, F&& callback) {
|
|
|
|
|
dtls_transport_state_callback_list_.AddReceiver(id,
|
|
|
|
|
std::forward<F>(callback));
|
|
|
|
|
}
|
|
|
|
|
// Unsubscribe the subscription with given id.
|
|
|
|
|
void UnsubscribeDtlsTransportState(const void* id) {
|
|
|
|
|
dtls_transport_state_callback_list_.RemoveReceivers(id);
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-16 07:29:08 -08:00
|
|
|
void SendDtlsState(DtlsTransportInternal* transport,
|
2021-05-21 20:46:09 +02:00
|
|
|
webrtc::DtlsTransportState state) {
|
|
|
|
|
dtls_transport_state_callback_list_.Send(transport, state);
|
2021-02-16 07:29:08 -08:00
|
|
|
}
|
2017-01-03 11:34:12 -08:00
|
|
|
|
|
|
|
|
// Emitted whenever the Dtls handshake failed on some transport channel.
|
2021-02-02 07:27:09 -08:00
|
|
|
// F: void(rtc::SSLHandshakeError)
|
|
|
|
|
template <typename F>
|
|
|
|
|
void SubscribeDtlsHandshakeError(F&& callback) {
|
|
|
|
|
dtls_handshake_error_callback_list_.AddReceiver(std::forward<F>(callback));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SendDtlsHandshakeError(rtc::SSLHandshakeError error) {
|
|
|
|
|
dtls_handshake_error_callback_list_.Send(error);
|
|
|
|
|
}
|
2017-01-03 11:34:12 -08:00
|
|
|
|
2017-01-19 16:54:25 -08:00
|
|
|
protected:
|
2017-10-30 10:01:15 -07:00
|
|
|
DtlsTransportInternal();
|
2017-01-19 16:54:25 -08:00
|
|
|
|
2017-01-03 11:34:12 -08:00
|
|
|
private:
|
2021-02-02 07:27:09 -08:00
|
|
|
webrtc::CallbackList<const rtc::SSLHandshakeError>
|
|
|
|
|
dtls_handshake_error_callback_list_;
|
2021-05-13 16:50:45 +02:00
|
|
|
webrtc::CallbackList<DtlsTransportInternal*, const webrtc::DtlsTransportState>
|
|
|
|
|
dtls_transport_state_callback_list_;
|
2017-01-03 11:34:12 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace cricket
|
|
|
|
|
|
2019-01-11 09:11:00 -08:00
|
|
|
#endif // P2P_BASE_DTLS_TRANSPORT_INTERNAL_H_
|