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

Side by Side Diff: webrtc/pc/mediasession_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: Disable GCM if ENABLE_EXTERNAL_AUTH is defined. Created 4 years, 5 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
« no previous file with comments | « webrtc/pc/mediasession.cc ('k') | webrtc/pc/srtpfilter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2004 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 using cricket::DataCodec; 66 using cricket::DataCodec;
67 using cricket::NS_JINGLE_RTP; 67 using cricket::NS_JINGLE_RTP;
68 using cricket::MEDIA_TYPE_AUDIO; 68 using cricket::MEDIA_TYPE_AUDIO;
69 using cricket::MEDIA_TYPE_VIDEO; 69 using cricket::MEDIA_TYPE_VIDEO;
70 using cricket::MEDIA_TYPE_DATA; 70 using cricket::MEDIA_TYPE_DATA;
71 using cricket::SEC_DISABLED; 71 using cricket::SEC_DISABLED;
72 using cricket::SEC_ENABLED; 72 using cricket::SEC_ENABLED;
73 using cricket::SEC_REQUIRED; 73 using cricket::SEC_REQUIRED;
74 using rtc::CS_AES_CM_128_HMAC_SHA1_32; 74 using rtc::CS_AES_CM_128_HMAC_SHA1_32;
75 using rtc::CS_AES_CM_128_HMAC_SHA1_80; 75 using rtc::CS_AES_CM_128_HMAC_SHA1_80;
76 using rtc::CS_AEAD_AES_128_GCM;
77 using rtc::CS_AEAD_AES_256_GCM;
76 using webrtc::RtpExtension; 78 using webrtc::RtpExtension;
77 79
78 static const AudioCodec kAudioCodecs1[] = { 80 static const AudioCodec kAudioCodecs1[] = {
79 AudioCodec(103, "ISAC", 16000, -1, 1), 81 AudioCodec(103, "ISAC", 16000, -1, 1),
80 AudioCodec(102, "iLBC", 8000, 13300, 1), 82 AudioCodec(102, "iLBC", 8000, 13300, 1),
81 AudioCodec(0, "PCMU", 8000, 64000, 1), 83 AudioCodec(0, "PCMU", 8000, 64000, 1),
82 AudioCodec(8, "PCMA", 8000, 64000, 1), 84 AudioCodec(8, "PCMA", 8000, 64000, 1),
83 AudioCodec(117, "red", 8000, 0, 1), 85 AudioCodec(117, "red", 8000, 0, 1),
84 AudioCodec(107, "CN", 48000, 0, 1)}; 86 AudioCodec(107, "CN", 48000, 0, 1)};
85 87
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 const cricket::AudioContentDescription* audio_content_desc = 448 const cricket::AudioContentDescription* audio_content_desc =
447 static_cast<const cricket::AudioContentDescription*>(description); 449 static_cast<const cricket::AudioContentDescription*>(description);
448 ASSERT(audio_content_desc != NULL); 450 ASSERT(audio_content_desc != NULL);
449 for (size_t i = 0; i < audio_content_desc->codecs().size(); ++i) { 451 for (size_t i = 0; i < audio_content_desc->codecs().size(); ++i) {
450 if (audio_content_desc->codecs()[i].name == "CN") 452 if (audio_content_desc->codecs()[i].name == "CN")
451 return false; 453 return false;
452 } 454 }
453 return true; 455 return true;
454 } 456 }
455 457
458 void TestVideoGcmCipher(bool gcm_offer, bool gcm_answer) {
459 MediaSessionOptions offer_opts;
460 offer_opts.recv_video = true;
461 offer_opts.crypto_options.enable_gcm_crypto_suites = gcm_offer;
462 MediaSessionOptions answer_opts;
463 answer_opts.recv_video = true;
464 answer_opts.crypto_options.enable_gcm_crypto_suites = gcm_answer;
465 f1_.set_secure(SEC_ENABLED);
466 f2_.set_secure(SEC_ENABLED);
467 std::unique_ptr<SessionDescription> offer(
468 f1_.CreateOffer(offer_opts, NULL));
469 ASSERT_TRUE(offer.get() != NULL);
470 std::unique_ptr<SessionDescription> answer(
471 f2_.CreateAnswer(offer.get(), answer_opts, NULL));
472 const ContentInfo* ac = answer->GetContentByName("audio");
473 const ContentInfo* vc = answer->GetContentByName("video");
474 ASSERT_TRUE(ac != NULL);
475 ASSERT_TRUE(vc != NULL);
476 EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
477 EXPECT_EQ(std::string(NS_JINGLE_RTP), vc->type);
478 const AudioContentDescription* acd =
479 static_cast<const AudioContentDescription*>(ac->description);
480 const VideoContentDescription* vcd =
481 static_cast<const VideoContentDescription*>(vc->description);
482 EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
483 EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
484 EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw
485 EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc
486 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux
487 if (gcm_offer && gcm_answer) {
488 ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM);
489 } else {
490 ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
491 }
492 EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
493 EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs());
494 EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc
495 EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux
496 if (gcm_offer && gcm_answer) {
497 ASSERT_CRYPTO(vcd, 1U, CS_AEAD_AES_256_GCM);
498 } else {
499 ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
500 }
501 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
502 }
503
456 protected: 504 protected:
457 MediaSessionDescriptionFactory f1_; 505 MediaSessionDescriptionFactory f1_;
458 MediaSessionDescriptionFactory f2_; 506 MediaSessionDescriptionFactory f2_;
459 TransportDescriptionFactory tdf1_; 507 TransportDescriptionFactory tdf1_;
460 TransportDescriptionFactory tdf2_; 508 TransportDescriptionFactory tdf2_;
461 }; 509 };
462 510
463 // Create a typical audio offer, and ensure it matches what we expect. 511 // Create a typical audio offer, and ensure it matches what we expect.
464 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioOffer) { 512 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioOffer) {
465 f1_.set_secure(SEC_ENABLED); 513 f1_.set_secure(SEC_ENABLED);
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 static_cast<const AudioContentDescription*>(ac->description); 807 static_cast<const AudioContentDescription*>(ac->description);
760 EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type()); 808 EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
761 EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs()); 809 EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
762 EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc 810 EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc
763 EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw 811 EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw
764 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux 812 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux
765 ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32); 813 ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
766 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol()); 814 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
767 } 815 }
768 816
817 // Create a typical audio answer with GCM ciphers enabled, and ensure it
818 // matches what we expect.
819 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioAnswerGcm) {
820 f1_.set_secure(SEC_ENABLED);
821 f2_.set_secure(SEC_ENABLED);
822 MediaSessionOptions options;
823 options.crypto_options.enable_gcm_crypto_suites = true;
824 std::unique_ptr<SessionDescription> offer(
825 f1_.CreateOffer(options, NULL));
826 ASSERT_TRUE(offer.get() != NULL);
827 std::unique_ptr<SessionDescription> answer(
828 f2_.CreateAnswer(offer.get(), options, NULL));
829 const ContentInfo* ac = answer->GetContentByName("audio");
830 const ContentInfo* vc = answer->GetContentByName("video");
831 ASSERT_TRUE(ac != NULL);
832 ASSERT_TRUE(vc == NULL);
833 EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
834 const AudioContentDescription* acd =
835 static_cast<const AudioContentDescription*>(ac->description);
836 EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
837 EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
838 EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc
839 EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw
840 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux
841 ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM);
842 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
843 }
844
769 // Create a typical video answer, and ensure it matches what we expect. 845 // Create a typical video answer, and ensure it matches what we expect.
770 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswer) { 846 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswer) {
771 MediaSessionOptions opts; 847 MediaSessionOptions opts;
772 opts.recv_video = true; 848 opts.recv_video = true;
773 f1_.set_secure(SEC_ENABLED); 849 f1_.set_secure(SEC_ENABLED);
774 f2_.set_secure(SEC_ENABLED); 850 f2_.set_secure(SEC_ENABLED);
775 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 851 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
776 ASSERT_TRUE(offer.get() != NULL); 852 ASSERT_TRUE(offer.get() != NULL);
777 std::unique_ptr<SessionDescription> answer( 853 std::unique_ptr<SessionDescription> answer(
778 f2_.CreateAnswer(offer.get(), opts, NULL)); 854 f2_.CreateAnswer(offer.get(), opts, NULL));
(...skipping 14 matching lines...) Expand all
793 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux 869 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux
794 ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32); 870 ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
795 EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type()); 871 EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
796 EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs()); 872 EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs());
797 EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc 873 EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc
798 EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux 874 EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux
799 ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80); 875 ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
800 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol()); 876 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
801 } 877 }
802 878
879 // Create a typical video answer with GCM ciphers enabled, and ensure it
880 // matches what we expect.
881 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerGcm) {
882 TestVideoGcmCipher(true, true);
883 }
884
885 // Create a typical video answer with GCM ciphers enabled for the offer only,
886 // and ensure it matches what we expect.
887 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerGcmOffer) {
888 TestVideoGcmCipher(true, false);
889 }
890
891 // Create a typical video answer with GCM ciphers enabled for the answer only,
892 // and ensure it matches what we expect.
893 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerGcmAnswer) {
894 TestVideoGcmCipher(false, true);
895 }
896
803 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswer) { 897 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswer) {
804 MediaSessionOptions opts; 898 MediaSessionOptions opts;
805 opts.data_channel_type = cricket::DCT_RTP; 899 opts.data_channel_type = cricket::DCT_RTP;
806 f1_.set_secure(SEC_ENABLED); 900 f1_.set_secure(SEC_ENABLED);
807 f2_.set_secure(SEC_ENABLED); 901 f2_.set_secure(SEC_ENABLED);
808 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL)); 902 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
809 ASSERT_TRUE(offer.get() != NULL); 903 ASSERT_TRUE(offer.get() != NULL);
810 std::unique_ptr<SessionDescription> answer( 904 std::unique_ptr<SessionDescription> answer(
811 f2_.CreateAnswer(offer.get(), opts, NULL)); 905 f2_.CreateAnswer(offer.get(), opts, NULL));
812 const ContentInfo* ac = answer->GetContentByName("audio"); 906 const ContentInfo* ac = answer->GetContentByName("audio");
(...skipping 13 matching lines...) Expand all
826 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux 920 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux
827 ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32); 921 ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
828 EXPECT_EQ(MEDIA_TYPE_DATA, vcd->type()); 922 EXPECT_EQ(MEDIA_TYPE_DATA, vcd->type());
829 EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), vcd->codecs()); 923 EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), vcd->codecs());
830 EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc 924 EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc
831 EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux 925 EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux
832 ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80); 926 ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
833 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol()); 927 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
834 } 928 }
835 929
930 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerGcm) {
931 MediaSessionOptions opts;
932 opts.data_channel_type = cricket::DCT_RTP;
933 opts.crypto_options.enable_gcm_crypto_suites = true;
934 f1_.set_secure(SEC_ENABLED);
935 f2_.set_secure(SEC_ENABLED);
936 std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
937 ASSERT_TRUE(offer.get() != NULL);
938 std::unique_ptr<SessionDescription> answer(
939 f2_.CreateAnswer(offer.get(), opts, NULL));
940 const ContentInfo* ac = answer->GetContentByName("audio");
941 const ContentInfo* vc = answer->GetContentByName("data");
942 ASSERT_TRUE(ac != NULL);
943 ASSERT_TRUE(vc != NULL);
944 EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
945 EXPECT_EQ(std::string(NS_JINGLE_RTP), vc->type);
946 const AudioContentDescription* acd =
947 static_cast<const AudioContentDescription*>(ac->description);
948 const DataContentDescription* vcd =
949 static_cast<const DataContentDescription*>(vc->description);
950 EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
951 EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
952 EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); // negotiated auto bw
953 EXPECT_NE(0U, acd->first_ssrc()); // a random nonzero ssrc
954 EXPECT_TRUE(acd->rtcp_mux()); // negotiated rtcp-mux
955 ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM);
956 EXPECT_EQ(MEDIA_TYPE_DATA, vcd->type());
957 EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), vcd->codecs());
958 EXPECT_NE(0U, vcd->first_ssrc()); // a random nonzero ssrc
959 EXPECT_TRUE(vcd->rtcp_mux()); // negotiated rtcp-mux
960 ASSERT_CRYPTO(vcd, 1U, CS_AEAD_AES_256_GCM);
961 EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
962 }
963
836 // Verifies that the order of the media contents in the offer is preserved in 964 // Verifies that the order of the media contents in the offer is preserved in
837 // the answer. 965 // the answer.
838 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAnswerContentOrder) { 966 TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAnswerContentOrder) {
839 MediaSessionOptions opts; 967 MediaSessionOptions opts;
840 968
841 // Creates a data only offer. 969 // Creates a data only offer.
842 opts.recv_audio = false; 970 opts.recv_audio = false;
843 opts.data_channel_type = cricket::DCT_SCTP; 971 opts.data_channel_type = cricket::DCT_SCTP;
844 std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL)); 972 std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL));
845 ASSERT_TRUE(offer1.get() != NULL); 973 ASSERT_TRUE(offer1.get() != NULL);
(...skipping 1902 matching lines...) Expand 10 before | Expand all | Expand 10 after
2748 ::testing::Combine( 2876 ::testing::Combine(
2749 ::testing::Values(cricket::MD_SENDONLY, 2877 ::testing::Values(cricket::MD_SENDONLY,
2750 cricket::MD_RECVONLY, 2878 cricket::MD_RECVONLY,
2751 cricket::MD_SENDRECV, 2879 cricket::MD_SENDRECV,
2752 cricket::MD_INACTIVE), 2880 cricket::MD_INACTIVE),
2753 ::testing::Values(cricket::MD_SENDONLY, 2881 ::testing::Values(cricket::MD_SENDONLY,
2754 cricket::MD_RECVONLY, 2882 cricket::MD_RECVONLY,
2755 cricket::MD_SENDRECV, 2883 cricket::MD_SENDRECV,
2756 cricket::MD_INACTIVE), 2884 cricket::MD_INACTIVE),
2757 ::testing::Bool())); 2885 ::testing::Bool()));
OLDNEW
« no previous file with comments | « webrtc/pc/mediasession.cc ('k') | webrtc/pc/srtpfilter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698