Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(802)

Side by Side Diff: webrtc/api/webrtcsession_unittest.cc

Issue 1528843005: Add support for GCM cipher suites from RFC 7714. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Feedback from Matt Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 // Add kTelephoneEventCodec for dtmf test. 452 // Add kTelephoneEventCodec for dtmf test.
453 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 453 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
454 0, 1); 454 0, 1);
455 std::vector<cricket::AudioCodec> codecs; 455 std::vector<cricket::AudioCodec> codecs;
456 codecs.push_back(kTelephoneEventCodec); 456 codecs.push_back(kTelephoneEventCodec);
457 media_engine_->SetAudioCodecs(codecs); 457 media_engine_->SetAudioCodecs(codecs);
458 desc_factory_->set_audio_codecs(codecs); 458 desc_factory_->set_audio_codecs(codecs);
459 Init(); 459 Init();
460 } 460 }
461 461
462 void InitWithGcm() {
463 rtc::CryptoOptions crypto_options;
464 crypto_options.enable_gcm_crypto_suites = true;
465 channel_manager_->SetCryptoOptions(crypto_options);
466 with_gcm_ = true;
467 Init();
468 }
469
462 void SendAudioVideoStream1() { 470 void SendAudioVideoStream1() {
463 send_stream_1_ = true; 471 send_stream_1_ = true;
464 send_stream_2_ = false; 472 send_stream_2_ = false;
465 send_audio_ = true; 473 send_audio_ = true;
466 send_video_ = true; 474 send_video_ = true;
467 } 475 }
468 476
469 void SendAudioVideoStream2() { 477 void SendAudioVideoStream2() {
470 send_stream_1_ = false; 478 send_stream_1_ = false;
471 send_stream_2_ = true; 479 send_stream_2_ = true;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 session_options->HasSendMediaStream(cricket::MEDIA_TYPE_VIDEO); 550 session_options->HasSendMediaStream(cricket::MEDIA_TYPE_VIDEO);
543 } 551 }
544 session_options->bundle_enabled = 552 session_options->bundle_enabled =
545 session_options->bundle_enabled && 553 session_options->bundle_enabled &&
546 (session_options->has_audio() || session_options->has_video() || 554 (session_options->has_audio() || session_options->has_video() ||
547 session_options->has_data()); 555 session_options->has_data());
548 556
549 if (session_->data_channel_type() == cricket::DCT_SCTP && data_channel_) { 557 if (session_->data_channel_type() == cricket::DCT_SCTP && data_channel_) {
550 session_options->data_channel_type = cricket::DCT_SCTP; 558 session_options->data_channel_type = cricket::DCT_SCTP;
551 } 559 }
560
561 if (with_gcm_) {
562 session_options->crypto_options.enable_gcm_crypto_suites = true;
563 }
552 } 564 }
553 565
554 void GetOptionsForAnswer(cricket::MediaSessionOptions* session_options) { 566 void GetOptionsForAnswer(cricket::MediaSessionOptions* session_options) {
555 // ParseConstraintsForAnswer is used to set some defaults. 567 // ParseConstraintsForAnswer is used to set some defaults.
556 ASSERT_TRUE(webrtc::ParseConstraintsForAnswer(nullptr, session_options)); 568 ASSERT_TRUE(webrtc::ParseConstraintsForAnswer(nullptr, session_options));
557 569
558 AddStreamsToOptions(session_options); 570 AddStreamsToOptions(session_options);
559 session_options->bundle_enabled = 571 session_options->bundle_enabled =
560 session_options->bundle_enabled && 572 session_options->bundle_enabled &&
561 (session_options->has_audio() || session_options->has_video() || 573 (session_options->has_audio() || session_options->has_video() ||
562 session_options->has_data()); 574 session_options->has_data());
563 575
564 if (session_->data_channel_type() == cricket::DCT_SCTP) { 576 if (session_->data_channel_type() == cricket::DCT_SCTP) {
565 session_options->data_channel_type = cricket::DCT_SCTP; 577 session_options->data_channel_type = cricket::DCT_SCTP;
566 } 578 }
579
580 if (with_gcm_) {
581 session_options->crypto_options.enable_gcm_crypto_suites = true;
582 }
567 } 583 }
568 584
569 // Creates a local offer and applies it. Starts ICE. 585 // Creates a local offer and applies it. Starts ICE.
570 // Call SendAudioVideoStreamX() before this function 586 // Call SendAudioVideoStreamX() before this function
571 // to decide which streams to create. 587 // to decide which streams to create.
572 void InitiateCall() { 588 void InitiateCall() {
573 SessionDescriptionInterface* offer = CreateOffer(); 589 SessionDescriptionInterface* offer = CreateOffer();
574 SetLocalDescriptionWithoutError(offer); 590 SetLocalDescriptionWithoutError(offer);
575 EXPECT_TRUE_WAIT(PeerConnectionInterface::kIceGatheringNew != 591 EXPECT_TRUE_WAIT(PeerConnectionInterface::kIceGatheringNew !=
576 observer_.ice_gathering_state_, 592 observer_.ice_gathering_state_,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 options.recv_video = true; 635 options.recv_video = true;
620 options.recv_audio = true; 636 options.recv_audio = true;
621 return CreateAnswer(options); 637 return CreateAnswer(options);
622 } 638 }
623 639
624 bool ChannelsExist() const { 640 bool ChannelsExist() const {
625 return (session_->voice_channel() != NULL && 641 return (session_->voice_channel() != NULL &&
626 session_->video_channel() != NULL); 642 session_->video_channel() != NULL);
627 } 643 }
628 644
629 void VerifyCryptoParams(const cricket::SessionDescription* sdp) { 645 void VerifyCryptoParams(const cricket::SessionDescription* sdp,
646 bool gcm_enabled = false) {
630 ASSERT_TRUE(session_.get() != NULL); 647 ASSERT_TRUE(session_.get() != NULL);
631 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); 648 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp);
632 ASSERT_TRUE(content != NULL); 649 ASSERT_TRUE(content != NULL);
633 const cricket::AudioContentDescription* audio_content = 650 const cricket::AudioContentDescription* audio_content =
634 static_cast<const cricket::AudioContentDescription*>( 651 static_cast<const cricket::AudioContentDescription*>(
635 content->description); 652 content->description);
636 ASSERT_TRUE(audio_content != NULL); 653 ASSERT_TRUE(audio_content != NULL);
637 ASSERT_EQ(1U, audio_content->cryptos().size()); 654 if (!gcm_enabled) {
638 ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size()); 655 ASSERT_EQ(1U, audio_content->cryptos().size());
639 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", 656 ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size());
640 audio_content->cryptos()[0].cipher_suite); 657 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80",
641 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 658 audio_content->cryptos()[0].cipher_suite);
642 audio_content->protocol()); 659 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
660 audio_content->protocol());
661 } else {
662 // The offer contains 3 possible crypto suites, the answer 1.
663 EXPECT_LE(1U, audio_content->cryptos().size());
664 EXPECT_NE(2U, audio_content->cryptos().size());
665 EXPECT_GE(3U, audio_content->cryptos().size());
666 ASSERT_EQ(67U, audio_content->cryptos()[0].key_params.size());
667 ASSERT_EQ("AEAD_AES_256_GCM",
668 audio_content->cryptos()[0].cipher_suite);
669 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
670 audio_content->protocol());
671 }
643 672
644 content = cricket::GetFirstVideoContent(sdp); 673 content = cricket::GetFirstVideoContent(sdp);
645 ASSERT_TRUE(content != NULL); 674 ASSERT_TRUE(content != NULL);
646 const cricket::VideoContentDescription* video_content = 675 const cricket::VideoContentDescription* video_content =
647 static_cast<const cricket::VideoContentDescription*>( 676 static_cast<const cricket::VideoContentDescription*>(
648 content->description); 677 content->description);
649 ASSERT_TRUE(video_content != NULL); 678 ASSERT_TRUE(video_content != NULL);
650 ASSERT_EQ(1U, video_content->cryptos().size()); 679 if (!gcm_enabled) {
651 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80", 680 ASSERT_EQ(1U, video_content->cryptos().size());
652 video_content->cryptos()[0].cipher_suite); 681 ASSERT_EQ("AES_CM_128_HMAC_SHA1_80",
653 ASSERT_EQ(47U, video_content->cryptos()[0].key_params.size()); 682 video_content->cryptos()[0].cipher_suite);
654 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), 683 ASSERT_EQ(47U, video_content->cryptos()[0].key_params.size());
655 video_content->protocol()); 684 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
685 video_content->protocol());
686 } else {
687 // The offer contains 3 possible crypto suites, the answer 1.
688 EXPECT_LE(1U, video_content->cryptos().size());
689 EXPECT_NE(2U, video_content->cryptos().size());
690 EXPECT_GE(3U, video_content->cryptos().size());
691 ASSERT_EQ("AEAD_AES_256_GCM",
692 video_content->cryptos()[0].cipher_suite);
693 ASSERT_EQ(67U, video_content->cryptos()[0].key_params.size());
694 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
695 video_content->protocol());
696 }
656 } 697 }
657 698
658 void VerifyNoCryptoParams(const cricket::SessionDescription* sdp, bool dtls) { 699 void VerifyNoCryptoParams(const cricket::SessionDescription* sdp, bool dtls) {
659 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); 700 const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp);
660 ASSERT_TRUE(content != NULL); 701 ASSERT_TRUE(content != NULL);
661 const cricket::AudioContentDescription* audio_content = 702 const cricket::AudioContentDescription* audio_content =
662 static_cast<const cricket::AudioContentDescription*>( 703 static_cast<const cricket::AudioContentDescription*>(
663 content->description); 704 content->description);
664 ASSERT_TRUE(audio_content != NULL); 705 ASSERT_TRUE(audio_content != NULL);
665 ASSERT_EQ(0U, audio_content->cryptos().size()); 706 ASSERT_EQ(0U, audio_content->cryptos().size());
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 // The following flags affect options created for CreateOffer/CreateAnswer. 1482 // The following flags affect options created for CreateOffer/CreateAnswer.
1442 bool send_stream_1_ = false; 1483 bool send_stream_1_ = false;
1443 bool send_stream_2_ = false; 1484 bool send_stream_2_ = false;
1444 bool send_audio_ = false; 1485 bool send_audio_ = false;
1445 bool send_video_ = false; 1486 bool send_video_ = false;
1446 rtc::scoped_refptr<DataChannel> data_channel_; 1487 rtc::scoped_refptr<DataChannel> data_channel_;
1447 // Last values received from data channel creation signal. 1488 // Last values received from data channel creation signal.
1448 std::string last_data_channel_label_; 1489 std::string last_data_channel_label_;
1449 InternalDataChannelInit last_data_channel_config_; 1490 InternalDataChannelInit last_data_channel_config_;
1450 bool session_destroyed_ = false; 1491 bool session_destroyed_ = false;
1492 bool with_gcm_ = false;
1451 }; 1493 };
1452 1494
1453 TEST_P(WebRtcSessionTest, TestInitializeWithDtls) { 1495 TEST_P(WebRtcSessionTest, TestInitializeWithDtls) {
1454 InitWithDtls(GetParam()); 1496 InitWithDtls(GetParam());
1455 // SDES is disabled when DTLS is on. 1497 // SDES is disabled when DTLS is on.
1456 EXPECT_EQ(cricket::SEC_DISABLED, session_->SdesPolicy()); 1498 EXPECT_EQ(cricket::SEC_DISABLED, session_->SdesPolicy());
1457 } 1499 }
1458 1500
1459 TEST_F(WebRtcSessionTest, TestInitializeWithoutDtls) { 1501 TEST_F(WebRtcSessionTest, TestInitializeWithoutDtls) {
1460 Init(); 1502 Init();
(...skipping 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after
2783 TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) { 2825 TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) {
2784 Init(); 2826 Init();
2785 SendAudioVideoStream1(); 2827 SendAudioVideoStream1();
2786 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); 2828 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
2787 VerifyCryptoParams(offer->description()); 2829 VerifyCryptoParams(offer->description());
2788 SetRemoteDescriptionWithoutError(offer.release()); 2830 SetRemoteDescriptionWithoutError(offer.release());
2789 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer()); 2831 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
2790 VerifyCryptoParams(answer->description()); 2832 VerifyCryptoParams(answer->description());
2791 } 2833 }
2792 2834
2835 TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDPGcm) {
2836 InitWithGcm();
2837 SendAudioVideoStream1();
2838 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
2839 VerifyCryptoParams(offer->description(), true);
2840 SetRemoteDescriptionWithoutError(offer.release());
2841 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
2842 VerifyCryptoParams(answer->description(), true);
2843 }
2844
2793 TEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) { 2845 TEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) {
2794 options_.disable_encryption = true; 2846 options_.disable_encryption = true;
2795 Init(); 2847 Init();
2796 SendAudioVideoStream1(); 2848 SendAudioVideoStream1();
2797 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); 2849 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
2798 VerifyNoCryptoParams(offer->description(), false); 2850 VerifyNoCryptoParams(offer->description(), false);
2799 } 2851 }
2800 2852
2801 TEST_F(WebRtcSessionTest, VerifyAnswerFromNonCryptoOffer) { 2853 TEST_F(WebRtcSessionTest, VerifyAnswerFromNonCryptoOffer) {
2802 Init(); 2854 Init();
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
3354 EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL)); 3406 EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL));
3355 SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer); 3407 SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer);
3356 JsepSessionDescription* remote_offer = 3408 JsepSessionDescription* remote_offer =
3357 new JsepSessionDescription(JsepSessionDescription::kOffer); 3409 new JsepSessionDescription(JsepSessionDescription::kOffer);
3358 EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL)); 3410 EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL));
3359 SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer); 3411 SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer);
3360 // Trying unmodified SDP. 3412 // Trying unmodified SDP.
3361 SetLocalDescriptionWithoutError(offer); 3413 SetLocalDescriptionWithoutError(offer);
3362 } 3414 }
3363 3415
3416 TEST_F(WebRtcSessionTest, SetSetupGcm) {
3417 InitWithGcm();
3418 SendAudioVideoStream1();
3419 CreateAndSetRemoteOfferAndLocalAnswer();
3420 }
3421
3364 TEST_F(WebRtcSessionTest, SetAudioPlayout) { 3422 TEST_F(WebRtcSessionTest, SetAudioPlayout) {
3365 Init(); 3423 Init();
3366 SendAudioVideoStream1(); 3424 SendAudioVideoStream1();
3367 CreateAndSetRemoteOfferAndLocalAnswer(); 3425 CreateAndSetRemoteOfferAndLocalAnswer();
3368 cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0); 3426 cricket::FakeVoiceMediaChannel* channel = media_engine_->GetVoiceChannel(0);
3369 ASSERT_TRUE(channel != NULL); 3427 ASSERT_TRUE(channel != NULL);
3370 ASSERT_EQ(1u, channel->recv_streams().size()); 3428 ASSERT_EQ(1u, channel->recv_streams().size());
3371 uint32_t receive_ssrc = channel->recv_streams()[0].first_ssrc(); 3429 uint32_t receive_ssrc = channel->recv_streams()[0].first_ssrc();
3372 double volume; 3430 double volume;
3373 EXPECT_TRUE(channel->GetOutputVolume(receive_ssrc, &volume)); 3431 EXPECT_TRUE(channel->GetOutputVolume(receive_ssrc, &volume));
(...skipping 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after
4396 } 4454 }
4397 4455
4398 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test 4456 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test
4399 // currently fails because upon disconnection and reconnection OnIceComplete is 4457 // currently fails because upon disconnection and reconnection OnIceComplete is
4400 // called more than once without returning to IceGatheringGathering. 4458 // called more than once without returning to IceGatheringGathering.
4401 4459
4402 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, 4460 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests,
4403 WebRtcSessionTest, 4461 WebRtcSessionTest,
4404 testing::Values(ALREADY_GENERATED, 4462 testing::Values(ALREADY_GENERATED,
4405 DTLS_IDENTITY_STORE)); 4463 DTLS_IDENTITY_STORE));
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698