#define MS_CLASS "FuzzerRtcDtlsTransport"
#include "RTC/FuzzerDtlsTransport.hpp"
#include "Logger.hpp"
#include "Utils.hpp"
#include "mocks/include/MockShared.hpp"
namespace
{
thread_local mocks::MockShared shared(
[]()
{
return 1000;
});
thread_local RTC::DtlsTransport* dtlsTransportSingleton{ nullptr };
thread_local FuzzerRtcDtlsTransport::DtlsTransportListener* dtlsTransportListenerSingleton{ nullptr };
}
void FuzzerRtcDtlsTransport::Fuzz(const uint8_t* data, size_t len)
{
if (!RTC::DtlsTransport::IsDtls(data, len))
{
return;
}
if (!dtlsTransportSingleton)
{
MS_DEBUG_DEV("no DtlsTransport singleton, creating it");
delete dtlsTransportListenerSingleton;
dtlsTransportListenerSingleton = new DtlsTransportListener();
dtlsTransportSingleton =
new RTC::DtlsTransport(dtlsTransportListenerSingleton, std::addressof(shared));
RTC::DtlsTransport::Role localRole;
RTC::DtlsTransport::Fingerprint dtlsRemoteFingerprint;
if (data[0] / 2 == 0)
{
localRole = RTC::DtlsTransport::Role::SERVER;
}
else
{
localRole = RTC::DtlsTransport::Role::CLIENT;
}
dtlsRemoteFingerprint.algorithm = static_cast<RTC::DtlsTransport::FingerprintAlgorithm>(
Utils::Crypto::GetRandomUInt<uint16_t>(1u, 5u));
dtlsRemoteFingerprint.value =
Utils::Crypto::GetRandomString(Utils::Crypto::GetRandomUInt<uint16_t>(3u, 20u));
dtlsTransportSingleton->Run(localRole);
dtlsTransportSingleton->SetRemoteFingerprint(dtlsRemoteFingerprint);
}
dtlsTransportSingleton->ProcessDtlsData(data, len);
if (
dtlsTransportSingleton->GetState() == RTC::DtlsTransport::DtlsState::FAILED ||
dtlsTransportSingleton->GetState() == RTC::DtlsTransport::DtlsState::CLOSED)
{
MS_DEBUG_DEV("DtlsTransport singleton state is 'failed' or 'closed', unsetting it");
delete dtlsTransportSingleton;
dtlsTransportSingleton = nullptr;
}
else
{
dtlsTransportSingleton->SendApplicationData(data, len);
}
}
void FuzzerRtcDtlsTransport::DtlsTransportListener::OnDtlsTransportConnecting(
const RTC::DtlsTransport* )
{
MS_DEBUG_DEV("DtlsTransport singleton connecting");
}
void FuzzerRtcDtlsTransport::DtlsTransportListener::OnDtlsTransportConnected(
const RTC::DtlsTransport* ,
RTC::SrtpSession::CryptoSuite ,
uint8_t* ,
size_t ,
uint8_t* ,
size_t ,
std::string& )
{
MS_DEBUG_DEV("DtlsTransport singleton connected");
}
void FuzzerRtcDtlsTransport::DtlsTransportListener::OnDtlsTransportFailed(
const RTC::DtlsTransport* )
{
MS_DEBUG_DEV("DtlsTransport singleton failed");
}
void FuzzerRtcDtlsTransport::DtlsTransportListener::OnDtlsTransportClosed(
const RTC::DtlsTransport* )
{
MS_DEBUG_DEV("DtlsTransport singleton closed");
}
void FuzzerRtcDtlsTransport::DtlsTransportListener::OnDtlsTransportSendData(
const RTC::DtlsTransport* , const uint8_t* , size_t )
{
MS_DEBUG_DEV("DtlsTransport singleton wants to send data");
}
void FuzzerRtcDtlsTransport::DtlsTransportListener::OnDtlsTransportApplicationDataReceived(
const RTC::DtlsTransport* , const uint8_t* , size_t )
{
MS_DEBUG_DEV("DtlsTransport singleton received application data");
}