blob: 1506aa70414e29ae27b0fb9ad81d2d498fe212ac [file] [log] [blame]
zhihuangd3501ad2017-03-03 14:39:06 -08001/*
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
11#include <memory>
12
Karl Wiberg3e9e5b32017-11-06 05:01:56 +010013#include "api/audio_codecs/builtin_audio_decoder_factory.h"
14#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "media/base/fakemediaengine.h"
16#include "ortc/ortcfactory.h"
17#include "ortc/testrtpparameters.h"
18#include "p2p/base/fakepackettransport.h"
19#include "rtc_base/gunit.h"
zhihuangd3501ad2017-03-03 14:39:06 -080020
21namespace webrtc {
22
23static const char kTestSha1KeyParams1[] =
24 "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
25static const char kTestSha1KeyParams2[] =
26 "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
27static const char kTestGcmKeyParams3[] =
28 "inline:e166KFlKzJsGW0d5apX+rrI05vxbrvMJEzFI14aTDCa63IRTlLK4iH66uOI=";
29
30static const cricket::CryptoParams kTestSha1CryptoParams1(
31 1,
32 "AES_CM_128_HMAC_SHA1_80",
33 kTestSha1KeyParams1,
34 "");
35static const cricket::CryptoParams kTestSha1CryptoParams2(
36 1,
37 "AES_CM_128_HMAC_SHA1_80",
38 kTestSha1KeyParams2,
39 "");
40static const cricket::CryptoParams kTestGcmCryptoParams3(1,
41 "AEAD_AES_256_GCM",
42 kTestGcmKeyParams3,
43 "");
44
45// This test uses fake packet transports and a fake media engine, in order to
46// test the SrtpTransport at only an API level. Any end-to-end test should go in
47// ortcfactory_integrationtest.cc instead.
48class SrtpTransportTest : public testing::Test {
49 public:
50 SrtpTransportTest() {
51 fake_media_engine_ = new cricket::FakeMediaEngine();
52 // Note: This doesn't need to use fake network classes, since it uses
53 // FakePacketTransports.
54 auto result = OrtcFactory::Create(
55 nullptr, nullptr, nullptr, nullptr, nullptr,
Karl Wiberg3e9e5b32017-11-06 05:01:56 +010056 std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_),
57 CreateBuiltinAudioEncoderFactory(), CreateBuiltinAudioDecoderFactory());
zhihuangd3501ad2017-03-03 14:39:06 -080058 ortc_factory_ = result.MoveValue();
59 rtp_transport_controller_ =
60 ortc_factory_->CreateRtpTransportController().MoveValue();
61
62 fake_packet_transport_.reset(new rtc::FakePacketTransport("fake"));
63 auto srtp_transport_result = ortc_factory_->CreateSrtpTransport(
sprangdb2a9fc2017-08-09 06:42:32 -070064 rtp_transport_parameters_, fake_packet_transport_.get(), nullptr,
zhihuangd3501ad2017-03-03 14:39:06 -080065 rtp_transport_controller_.get());
66 srtp_transport_ = srtp_transport_result.MoveValue();
67 }
68
69 protected:
70 // Owned by |ortc_factory_|.
71 cricket::FakeMediaEngine* fake_media_engine_;
72 std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
73 std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_;
74 std::unique_ptr<SrtpTransportInterface> srtp_transport_;
sprangdb2a9fc2017-08-09 06:42:32 -070075 RtpTransportParameters rtp_transport_parameters_;
zhihuangd3501ad2017-03-03 14:39:06 -080076 std::unique_ptr<rtc::FakePacketTransport> fake_packet_transport_;
77};
78
79// Tests that setting the SRTP send/receive key succeeds.
80TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKey) {
81 EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
82 EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
83 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
84 srtp_transport_.get());
85 EXPECT_TRUE(sender_result.ok());
86 auto receiver_result = ortc_factory_->CreateRtpReceiver(
87 cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
88 EXPECT_TRUE(receiver_result.ok());
89}
90
91// Tests that setting the SRTP send/receive key twice is not supported.
92TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyTwice) {
93 EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
94 EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
95 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
96 srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams2).type());
97 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
98 srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams1).type());
99 // Ensure that the senders and receivers can be created despite the previous
100 // errors.
101 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
102 srtp_transport_.get());
103 EXPECT_TRUE(sender_result.ok());
104 auto receiver_result = ortc_factory_->CreateRtpReceiver(
105 cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
106 EXPECT_TRUE(receiver_result.ok());
107}
108
109// Test that the SRTP send key and receive key must have the same cipher suite.
110TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyDifferentCipherSuite) {
111 EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
112 EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
113 srtp_transport_->SetSrtpReceiveKey(kTestGcmCryptoParams3).type());
114 EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
115 // Ensure that the senders and receivers can be created despite the previous
116 // error.
117 auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
118 srtp_transport_.get());
119 EXPECT_TRUE(sender_result.ok());
120 auto receiver_result = ortc_factory_->CreateRtpReceiver(
121 cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
122 EXPECT_TRUE(receiver_result.ok());
123}
124
zhihuangd3501ad2017-03-03 14:39:06 -0800125} // namespace webrtc