Create the SrtpTransportInterface.
Create the SrtpTransportInterface, a subclass of RtpTransportInterface, which allows the user to set the send and receive keys. The functionalities are implemented inside the RtpTransportAdapters on top of BaseChannel. BUG=webrtc:7013 Review-Url: https://codereview.webrtc.org/2714813004 Cr-Commit-Position: refs/heads/master@{#17023}
This commit is contained in:
167
webrtc/ortc/srtptransport_unittest.cc
Normal file
167
webrtc/ortc/srtptransport_unittest.cc
Normal file
@ -0,0 +1,167 @@
|
||||
/*
|
||||
* Copyright 2017 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.
|
||||
*/
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "webrtc/base/gunit.h"
|
||||
#include "webrtc/media/base/fakemediaengine.h"
|
||||
#include "webrtc/ortc/ortcfactory.h"
|
||||
#include "webrtc/ortc/testrtpparameters.h"
|
||||
#include "webrtc/p2p/base/fakepackettransport.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
static const char kTestSha1KeyParams1[] =
|
||||
"inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
|
||||
static const char kTestSha1KeyParams2[] =
|
||||
"inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
|
||||
static const char kTestGcmKeyParams3[] =
|
||||
"inline:e166KFlKzJsGW0d5apX+rrI05vxbrvMJEzFI14aTDCa63IRTlLK4iH66uOI=";
|
||||
|
||||
static const cricket::CryptoParams kTestSha1CryptoParams1(
|
||||
1,
|
||||
"AES_CM_128_HMAC_SHA1_80",
|
||||
kTestSha1KeyParams1,
|
||||
"");
|
||||
static const cricket::CryptoParams kTestSha1CryptoParams2(
|
||||
1,
|
||||
"AES_CM_128_HMAC_SHA1_80",
|
||||
kTestSha1KeyParams2,
|
||||
"");
|
||||
static const cricket::CryptoParams kTestGcmCryptoParams3(1,
|
||||
"AEAD_AES_256_GCM",
|
||||
kTestGcmKeyParams3,
|
||||
"");
|
||||
|
||||
// This test uses fake packet transports and a fake media engine, in order to
|
||||
// test the SrtpTransport at only an API level. Any end-to-end test should go in
|
||||
// ortcfactory_integrationtest.cc instead.
|
||||
class SrtpTransportTest : public testing::Test {
|
||||
public:
|
||||
SrtpTransportTest() {
|
||||
fake_media_engine_ = new cricket::FakeMediaEngine();
|
||||
// Note: This doesn't need to use fake network classes, since it uses
|
||||
// FakePacketTransports.
|
||||
auto result = OrtcFactory::Create(
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
|
||||
ortc_factory_ = result.MoveValue();
|
||||
rtp_transport_controller_ =
|
||||
ortc_factory_->CreateRtpTransportController().MoveValue();
|
||||
|
||||
fake_packet_transport_.reset(new rtc::FakePacketTransport("fake"));
|
||||
auto srtp_transport_result = ortc_factory_->CreateSrtpTransport(
|
||||
rtcp_parameters_, fake_packet_transport_.get(), nullptr,
|
||||
rtp_transport_controller_.get());
|
||||
srtp_transport_ = srtp_transport_result.MoveValue();
|
||||
}
|
||||
|
||||
protected:
|
||||
// Owned by |ortc_factory_|.
|
||||
cricket::FakeMediaEngine* fake_media_engine_;
|
||||
std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
|
||||
std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_;
|
||||
std::unique_ptr<SrtpTransportInterface> srtp_transport_;
|
||||
RtcpParameters rtcp_parameters_;
|
||||
std::unique_ptr<rtc::FakePacketTransport> fake_packet_transport_;
|
||||
};
|
||||
|
||||
// Tests that setting the SRTP send/receive key succeeds.
|
||||
TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKey) {
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
||||
auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
|
||||
srtp_transport_.get());
|
||||
EXPECT_TRUE(sender_result.ok());
|
||||
auto receiver_result = ortc_factory_->CreateRtpReceiver(
|
||||
cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
|
||||
EXPECT_TRUE(receiver_result.ok());
|
||||
}
|
||||
|
||||
// Tests that setting the SRTP send/receive key twice is not supported.
|
||||
TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyTwice) {
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
||||
EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
|
||||
srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams2).type());
|
||||
EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
|
||||
srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams1).type());
|
||||
// Ensure that the senders and receivers can be created despite the previous
|
||||
// errors.
|
||||
auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
|
||||
srtp_transport_.get());
|
||||
EXPECT_TRUE(sender_result.ok());
|
||||
auto receiver_result = ortc_factory_->CreateRtpReceiver(
|
||||
cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
|
||||
EXPECT_TRUE(receiver_result.ok());
|
||||
}
|
||||
|
||||
// Test that the SRTP send key and receive key must have the same cipher suite.
|
||||
TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyDifferentCipherSuite) {
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
||||
EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
|
||||
srtp_transport_->SetSrtpReceiveKey(kTestGcmCryptoParams3).type());
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
||||
// Ensure that the senders and receivers can be created despite the previous
|
||||
// error.
|
||||
auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
|
||||
srtp_transport_.get());
|
||||
EXPECT_TRUE(sender_result.ok());
|
||||
auto receiver_result = ortc_factory_->CreateRtpReceiver(
|
||||
cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
|
||||
EXPECT_TRUE(receiver_result.ok());
|
||||
}
|
||||
|
||||
class SrtpTransportTestWithMediaType
|
||||
: public SrtpTransportTest,
|
||||
public ::testing::WithParamInterface<cricket::MediaType> {};
|
||||
|
||||
// Tests that the senders cannot be created before setting the keys.
|
||||
TEST_P(SrtpTransportTestWithMediaType, CreateSenderBeforeSettingKeys) {
|
||||
auto sender_result =
|
||||
ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
|
||||
EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, sender_result.error().type());
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
||||
sender_result =
|
||||
ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
|
||||
EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, sender_result.error().type());
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
||||
// Ensure that after the keys are set, a sender can be created, despite the
|
||||
// previous errors.
|
||||
sender_result =
|
||||
ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
|
||||
EXPECT_TRUE(sender_result.ok());
|
||||
}
|
||||
|
||||
// Tests that the receivers cannot be created before setting the keys.
|
||||
TEST_P(SrtpTransportTestWithMediaType, CreateReceiverBeforeSettingKeys) {
|
||||
auto receiver_result =
|
||||
ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
|
||||
EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
|
||||
receiver_result.error().type());
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
||||
receiver_result =
|
||||
ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
|
||||
EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
|
||||
receiver_result.error().type());
|
||||
EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
||||
// Ensure that after the keys are set, a receiver can be created, despite the
|
||||
// previous errors.
|
||||
receiver_result =
|
||||
ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
|
||||
EXPECT_TRUE(receiver_result.ok());
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(SenderCreatationTest,
|
||||
SrtpTransportTestWithMediaType,
|
||||
::testing::Values(cricket::MEDIA_TYPE_AUDIO,
|
||||
cricket::MEDIA_TYPE_VIDEO));
|
||||
|
||||
} // namespace webrtc
|
||||
Reference in New Issue
Block a user