OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/safe_browsing/download_protection_service.h" | 5 #include "chrome/browser/safe_browsing/download_protection_service.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/base_paths.h" | 10 #include "base/base_paths.h" |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/file_path.h" | 13 #include "base/file_path.h" |
14 #include "base/file_util.h" | 14 #include "base/file_util.h" |
15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
17 #include "base/message_loop.h" | 17 #include "base/message_loop.h" |
18 #include "base/path_service.h" | 18 #include "base/path_service.h" |
19 #include "base/string_number_conversions.h" | 19 #include "base/string_number_conversions.h" |
20 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 20 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
21 #include "chrome/browser/safe_browsing/signature_util.h" | 21 #include "chrome/browser/safe_browsing/signature_util.h" |
22 #include "chrome/common/safe_browsing/csd.pb.h" | 22 #include "chrome/common/safe_browsing/csd.pb.h" |
23 #include "content/browser/download/download_item.h" | 23 #include "content/browser/download/download_item.h" |
24 #include "content/public/common/url_fetcher_delegate.h" | 24 #include "content/public/common/url_fetcher_delegate.h" |
25 #include "content/test/test_browser_thread.h" | 25 #include "content/test/test_browser_thread.h" |
26 #include "content/test/test_url_fetcher_factory.h" | 26 #include "content/test/test_url_fetcher_factory.h" |
27 #include "crypto/rsa_private_key.h" | |
28 #include "googleurl/src/gurl.h" | 27 #include "googleurl/src/gurl.h" |
29 #include "net/base/x509_certificate.h" | 28 #include "net/base/x509_certificate.h" |
30 #include "testing/gmock/include/gmock/gmock.h" | 29 #include "testing/gmock/include/gmock/gmock.h" |
31 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" |
32 | 31 |
33 using ::testing::ContainerEq; | 32 using ::testing::ContainerEq; |
34 using ::testing::DoAll; | 33 using ::testing::DoAll; |
35 using ::testing::ElementsAre; | 34 using ::testing::ElementsAre; |
36 using ::testing::Mock; | 35 using ::testing::Mock; |
37 using ::testing::NotNull; | 36 using ::testing::NotNull; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 | 181 |
183 // Proxy for private method. | 182 // Proxy for private method. |
184 static void GetCertificateWhitelistStrings( | 183 static void GetCertificateWhitelistStrings( |
185 const net::X509Certificate& certificate, | 184 const net::X509Certificate& certificate, |
186 const net::X509Certificate& issuer, | 185 const net::X509Certificate& issuer, |
187 std::vector<std::string>* whitelist_strings) { | 186 std::vector<std::string>* whitelist_strings) { |
188 DownloadProtectionService::GetCertificateWhitelistStrings( | 187 DownloadProtectionService::GetCertificateWhitelistStrings( |
189 certificate, issuer, whitelist_strings); | 188 certificate, issuer, whitelist_strings); |
190 } | 189 } |
191 | 190 |
| 191 // Reads a single PEM-encoded certificate from the testdata directory. |
| 192 // Returns NULL on failure. |
| 193 scoped_refptr<net::X509Certificate> ReadTestCertificate( |
| 194 const std::string& filename) { |
| 195 std::string cert_data; |
| 196 if (!file_util::ReadFileToString(testdata_path_.AppendASCII(filename), |
| 197 &cert_data)) { |
| 198 return NULL; |
| 199 } |
| 200 net::CertificateList certs = |
| 201 net::X509Certificate::CreateCertificateListFromBytes( |
| 202 cert_data.data(), |
| 203 cert_data.size(), |
| 204 net::X509Certificate::FORMAT_PEM_CERT_SEQUENCE); |
| 205 return certs.empty() ? NULL : certs[0]; |
| 206 } |
| 207 |
192 private: | 208 private: |
193 // Helper functions for FlushThreadMessageLoops. | 209 // Helper functions for FlushThreadMessageLoops. |
194 void RunAllPendingAndQuitUI() { | 210 void RunAllPendingAndQuitUI() { |
195 MessageLoop::current()->RunAllPending(); | 211 MessageLoop::current()->RunAllPending(); |
196 BrowserThread::PostTask( | 212 BrowserThread::PostTask( |
197 BrowserThread::UI, | 213 BrowserThread::UI, |
198 FROM_HERE, | 214 FROM_HERE, |
199 base::Bind(&DownloadProtectionServiceTest::QuitMessageLoop, | 215 base::Bind(&DownloadProtectionServiceTest::QuitMessageLoop, |
200 base::Unretained(this))); | 216 base::Unretained(this))); |
201 } | 217 } |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 info, | 752 info, |
737 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 753 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
738 base::Unretained(this))); | 754 base::Unretained(this))); |
739 | 755 |
740 // The request should time out because the HTTP request hasn't returned | 756 // The request should time out because the HTTP request hasn't returned |
741 // anything yet. | 757 // anything yet. |
742 msg_loop_.Run(); | 758 msg_loop_.Run(); |
743 ExpectResult(DownloadProtectionService::SAFE); | 759 ExpectResult(DownloadProtectionService::SAFE); |
744 } | 760 } |
745 | 761 |
746 TEST_F(DownloadProtectionServiceTest, | 762 TEST_F(DownloadProtectionServiceTest, GetCertificateWhitelistStrings) { |
747 GetCertificateWhitelistStrings_TestCert) { | |
748 std::string cert_data; | |
749 ASSERT_TRUE(file_util::ReadFileToString(testdata_path_.AppendASCII( | |
750 "signature_util_test.cer"), &cert_data)); | |
751 | |
752 scoped_refptr<net::X509Certificate> cert( | |
753 net::X509Certificate::CreateFromBytes(cert_data.data(), | |
754 cert_data.size())); | |
755 ASSERT_TRUE(cert.get()); | |
756 | |
757 std::vector<std::string> whitelist_strings; | |
758 GetCertificateWhitelistStrings(*cert, *cert, &whitelist_strings); | |
759 | |
760 EXPECT_THAT(whitelist_strings, ElementsAre( | |
761 "cert/58AFF702772EB67BDD412571BA40AAC07F0D936C" | |
762 "/CN=Joe's-Software-Emporium")); | |
763 } | |
764 | |
765 // Only some implementations have the ability to generate self-signed certs. | |
766 #if defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX) | |
767 TEST_F(DownloadProtectionServiceTest, | |
768 GetCertificateWhitelistStrings_SelfSigned) { | |
769 scoped_ptr<crypto::RSAPrivateKey> private_key( | |
770 crypto::RSAPrivateKey::Create(1024)); | |
771 // We'll pass this cert in as the "issuer", even though it isn't really | 763 // We'll pass this cert in as the "issuer", even though it isn't really |
772 // used to sign the certs below. GetCertificateWhitelistStirngs doesn't care | 764 // used to sign the certs below. GetCertificateWhitelistStirngs doesn't care |
773 // about this. | 765 // about this. |
774 scoped_refptr<net::X509Certificate> issuer_cert = | 766 scoped_refptr<net::X509Certificate> issuer_cert( |
775 net::X509Certificate::CreateSelfSigned( | 767 ReadTestCertificate("issuer.pem")); |
776 private_key.get(), "CN=issuer", 1, base::TimeDelta::FromDays(1)); | |
777 ASSERT_TRUE(issuer_cert.get()); | 768 ASSERT_TRUE(issuer_cert.get()); |
778 std::string cert_base = "cert/" + base::HexEncode( | 769 std::string cert_base = "cert/" + base::HexEncode( |
779 issuer_cert->fingerprint().data, | 770 issuer_cert->fingerprint().data, |
780 sizeof(issuer_cert->fingerprint().data)); | 771 sizeof(issuer_cert->fingerprint().data)); |
781 | 772 |
782 scoped_refptr<net::X509Certificate> cert = | 773 scoped_refptr<net::X509Certificate> cert(ReadTestCertificate("test_cn.pem")); |
783 net::X509Certificate::CreateSelfSigned( | |
784 private_key.get(), "CN=subject/%1", 1, base::TimeDelta::FromDays(1)); | |
785 ASSERT_TRUE(cert.get()); | 774 ASSERT_TRUE(cert.get()); |
786 std::vector<std::string> whitelist_strings; | 775 std::vector<std::string> whitelist_strings; |
787 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 776 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
788 // This also tests escaping of characters in the certificate attributes. | 777 // This also tests escaping of characters in the certificate attributes. |
789 EXPECT_THAT(whitelist_strings, ElementsAre( | 778 EXPECT_THAT(whitelist_strings, ElementsAre( |
790 cert_base + "/CN=subject%2F%251")); | 779 cert_base + "/CN=subject%2F%251")); |
791 | 780 |
792 cert = net::X509Certificate::CreateSelfSigned( | 781 cert = ReadTestCertificate("test_cn_o.pem"); |
793 private_key.get(), "CN=subject,O=org", 1, base::TimeDelta::FromDays(1)); | |
794 ASSERT_TRUE(cert.get()); | 782 ASSERT_TRUE(cert.get()); |
795 whitelist_strings.clear(); | 783 whitelist_strings.clear(); |
796 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 784 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
797 EXPECT_THAT(whitelist_strings, ElementsAre( | 785 EXPECT_THAT(whitelist_strings, ElementsAre( |
798 cert_base + "/CN=subject", | 786 cert_base + "/CN=subject", |
799 cert_base + "/CN=subject/O=org", | 787 cert_base + "/CN=subject/O=org", |
800 cert_base + "/O=org")); | 788 cert_base + "/O=org")); |
801 | 789 |
802 cert = net::X509Certificate::CreateSelfSigned( | 790 cert = ReadTestCertificate("test_cn_o_ou.pem"); |
803 private_key.get(), "CN=subject,O=org,OU=unit", 1, | |
804 base::TimeDelta::FromDays(1)); | |
805 ASSERT_TRUE(cert.get()); | 791 ASSERT_TRUE(cert.get()); |
806 whitelist_strings.clear(); | 792 whitelist_strings.clear(); |
807 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 793 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
808 EXPECT_THAT(whitelist_strings, ElementsAre( | 794 EXPECT_THAT(whitelist_strings, ElementsAre( |
809 cert_base + "/CN=subject", | 795 cert_base + "/CN=subject", |
810 cert_base + "/CN=subject/O=org", | 796 cert_base + "/CN=subject/O=org", |
811 cert_base + "/CN=subject/O=org/OU=unit", | 797 cert_base + "/CN=subject/O=org/OU=unit", |
812 cert_base + "/CN=subject/OU=unit", | 798 cert_base + "/CN=subject/OU=unit", |
813 cert_base + "/O=org", | 799 cert_base + "/O=org", |
814 cert_base + "/O=org/OU=unit", | 800 cert_base + "/O=org/OU=unit", |
815 cert_base + "/OU=unit")); | 801 cert_base + "/OU=unit")); |
816 | 802 |
817 cert = net::X509Certificate::CreateSelfSigned( | 803 cert = ReadTestCertificate("test_cn_ou.pem"); |
818 private_key.get(), "CN=subject,OU=unit", 1, | |
819 base::TimeDelta::FromDays(1)); | |
820 ASSERT_TRUE(cert.get()); | 804 ASSERT_TRUE(cert.get()); |
821 whitelist_strings.clear(); | 805 whitelist_strings.clear(); |
822 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 806 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
823 EXPECT_THAT(whitelist_strings, ElementsAre( | 807 EXPECT_THAT(whitelist_strings, ElementsAre( |
824 cert_base + "/CN=subject", | 808 cert_base + "/CN=subject", |
825 cert_base + "/CN=subject/OU=unit", | 809 cert_base + "/CN=subject/OU=unit", |
826 cert_base + "/OU=unit")); | 810 cert_base + "/OU=unit")); |
827 | 811 |
828 cert = net::X509Certificate::CreateSelfSigned( | 812 cert = ReadTestCertificate("test_o.pem"); |
829 private_key.get(), "O=org,", 1, base::TimeDelta::FromDays(1)); | |
830 ASSERT_TRUE(cert.get()); | 813 ASSERT_TRUE(cert.get()); |
831 whitelist_strings.clear(); | 814 whitelist_strings.clear(); |
832 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 815 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
833 EXPECT_THAT(whitelist_strings, ElementsAre(cert_base + "/O=org")); | 816 EXPECT_THAT(whitelist_strings, ElementsAre(cert_base + "/O=org")); |
834 | 817 |
835 cert = net::X509Certificate::CreateSelfSigned( | 818 cert = ReadTestCertificate("test_o_ou.pem"); |
836 private_key.get(), "O=org,OU=unit", 1, base::TimeDelta::FromDays(1)); | |
837 ASSERT_TRUE(cert.get()); | 819 ASSERT_TRUE(cert.get()); |
838 whitelist_strings.clear(); | 820 whitelist_strings.clear(); |
839 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 821 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
840 EXPECT_THAT(whitelist_strings, ElementsAre( | 822 EXPECT_THAT(whitelist_strings, ElementsAre( |
841 cert_base + "/O=org", | 823 cert_base + "/O=org", |
842 cert_base + "/O=org/OU=unit", | 824 cert_base + "/O=org/OU=unit", |
843 cert_base + "/OU=unit")); | 825 cert_base + "/OU=unit")); |
844 | 826 |
845 cert = net::X509Certificate::CreateSelfSigned( | 827 cert = ReadTestCertificate("test_ou.pem"); |
846 private_key.get(), "OU=unit", 1, base::TimeDelta::FromDays(1)); | |
847 ASSERT_TRUE(cert.get()); | 828 ASSERT_TRUE(cert.get()); |
848 whitelist_strings.clear(); | 829 whitelist_strings.clear(); |
849 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 830 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
850 EXPECT_THAT(whitelist_strings, ElementsAre(cert_base + "/OU=unit")); | 831 EXPECT_THAT(whitelist_strings, ElementsAre(cert_base + "/OU=unit")); |
851 | 832 |
852 cert = net::X509Certificate::CreateSelfSigned( | 833 cert = ReadTestCertificate("test_c.pem"); |
853 private_key.get(), "C=US", 1, base::TimeDelta::FromDays(1)); | |
854 ASSERT_TRUE(cert.get()); | 834 ASSERT_TRUE(cert.get()); |
855 whitelist_strings.clear(); | 835 whitelist_strings.clear(); |
856 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); | 836 GetCertificateWhitelistStrings(*cert, *issuer_cert, &whitelist_strings); |
857 EXPECT_THAT(whitelist_strings, ElementsAre()); | 837 EXPECT_THAT(whitelist_strings, ElementsAre()); |
858 } | 838 } |
859 #endif | |
860 } // namespace safe_browsing | 839 } // namespace safe_browsing |
OLD | NEW |