Index: chrome/browser/safe_browsing/signature_util_win_unittest.cc |
=================================================================== |
--- chrome/browser/safe_browsing/signature_util_win_unittest.cc (revision 109680) |
+++ chrome/browser/safe_browsing/signature_util_win_unittest.cc (working copy) |
@@ -5,6 +5,8 @@ |
#include "chrome/browser/safe_browsing/signature_util.h" |
#include <string> |
+#include <vector> |
+ |
#include "base/base_paths.h" |
#include "base/file_path.h" |
#include "base/path_service.h" |
@@ -16,56 +18,87 @@ |
namespace safe_browsing { |
-TEST(SignatureUtilWinTest, CheckSignature) { |
- FilePath source_path; |
- ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &source_path)); |
+class SignatureUtilWinTest : public testing::Test { |
+ protected: |
+ virtual void SetUp() { |
+ FilePath source_path; |
+ ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &source_path)); |
+ testdata_path_ = source_path |
+ .AppendASCII("chrome") |
+ .AppendASCII("test") |
+ .AppendASCII("data") |
+ .AppendASCII("safe_browsing") |
+ .AppendASCII("download_protection"); |
+ } |
- FilePath testdata_path = source_path |
- .AppendASCII("chrome") |
- .AppendASCII("test") |
- .AppendASCII("data") |
- .AppendASCII("safe_browsing") |
- .AppendASCII("download_protection"); |
+ // Given a certificate chain protobuf, parse it into X509Certificates. |
+ void ParseCertificateChain( |
+ const ClientDownloadRequest_CertificateChain& chain, |
+ std::vector<scoped_refptr<net::X509Certificate> >* certs) { |
+ for (int i = 0; i < chain.element_size(); ++i) { |
+ certs->push_back( |
+ net::X509Certificate::CreateFromBytes( |
+ chain.element(i).certificate().data(), |
+ chain.element(i).certificate().size())); |
+ } |
+ } |
- // signed.exe is signed with a self-signed certificate. The certificate |
- // should be returned, but it is not trusted. |
+ FilePath testdata_path_; |
+}; |
+ |
+TEST_F(SignatureUtilWinTest, UntrustedSignedBinary) { |
+ // signed.exe is signed by an untrusted root CA. |
scoped_refptr<SignatureUtil> signature_util(new SignatureUtil()); |
ClientDownloadRequest_SignatureInfo signature_info; |
- signature_util->CheckSignature(testdata_path.Append(L"signed.exe"), |
- &signature_info); |
- EXPECT_FALSE(signature_info.certificate_contents().empty()); |
- scoped_refptr<net::X509Certificate> cert( |
- net::X509Certificate::CreateFromBytes( |
- signature_info.certificate_contents().data(), |
- signature_info.certificate_contents().size())); |
- ASSERT_TRUE(cert.get()); |
- EXPECT_EQ("Joe's-Software-Emporium", cert->subject().common_name); |
+ signature_util->CheckSignature(testdata_path_.Append(L"signed.exe"), |
+ &signature_info); |
+ ASSERT_EQ(1, signature_info.certificate_chain_size()); |
+ std::vector<scoped_refptr<net::X509Certificate> > certs; |
+ ParseCertificateChain(signature_info.certificate_chain(0), &certs); |
+ ASSERT_EQ(2, certs.size()); |
+ EXPECT_EQ("Joe's-Software-Emporium", certs[0]->subject().common_name); |
+ EXPECT_EQ("Root Agency", certs[1]->subject().common_name); |
+ |
EXPECT_FALSE(signature_info.trusted()); |
+} |
+TEST_F(SignatureUtilWinTest, TrustedBinary) { |
// wow_helper.exe is signed using Google's signing certifiacte. |
- signature_info.Clear(); |
- signature_util->CheckSignature(testdata_path.Append(L"wow_helper.exe"), |
+ scoped_refptr<SignatureUtil> signature_util(new SignatureUtil()); |
+ ClientDownloadRequest_SignatureInfo signature_info; |
+ signature_util->CheckSignature(testdata_path_.Append(L"wow_helper.exe"), |
&signature_info); |
- EXPECT_TRUE(signature_info.has_certificate_contents()); |
- cert = net::X509Certificate::CreateFromBytes( |
- signature_info.certificate_contents().data(), |
- signature_info.certificate_contents().size()); |
- ASSERT_TRUE(cert.get()); |
- EXPECT_EQ("Google Inc", cert->subject().common_name); |
+ ASSERT_EQ(1, signature_info.certificate_chain_size()); |
+ std::vector<scoped_refptr<net::X509Certificate> > certs; |
+ ParseCertificateChain(signature_info.certificate_chain(0), &certs); |
+ ASSERT_EQ(3, certs.size()); |
+ |
+ EXPECT_EQ("Google Inc", certs[0]->subject().common_name); |
+ EXPECT_EQ("VeriSign Class 3 Code Signing 2009-2 CA", |
+ certs[1]->subject().common_name); |
+ EXPECT_EQ("Class 3 Public Primary Certification Authority", |
+ certs[2]->subject().organization_unit_names[0]); |
+ |
EXPECT_TRUE(signature_info.trusted()); |
+} |
+TEST_F(SignatureUtilWinTest, UnsignedBinary) { |
// unsigned.exe has no signature information. |
- signature_info.Clear(); |
- signature_util->CheckSignature(testdata_path.Append(L"unsigned.exe"), |
+ scoped_refptr<SignatureUtil> signature_util(new SignatureUtil()); |
+ ClientDownloadRequest_SignatureInfo signature_info; |
+ signature_util->CheckSignature(testdata_path_.Append(L"unsigned.exe"), |
&signature_info); |
- EXPECT_FALSE(signature_info.has_certificate_contents()); |
+ EXPECT_EQ(0, signature_info.certificate_chain_size()); |
EXPECT_FALSE(signature_info.trusted()); |
+} |
+TEST_F(SignatureUtilWinTest, NonExistentBinary) { |
// Test a file that doesn't exist. |
- signature_info.Clear(); |
- signature_util->CheckSignature(testdata_path.Append(L"doesnotexist.exe"), |
+ scoped_refptr<SignatureUtil> signature_util(new SignatureUtil()); |
+ ClientDownloadRequest_SignatureInfo signature_info; |
+ signature_util->CheckSignature(testdata_path_.Append(L"doesnotexist.exe"), |
&signature_info); |
- EXPECT_FALSE(signature_info.has_certificate_contents()); |
+ EXPECT_EQ(0, signature_info.certificate_chain_size()); |
EXPECT_FALSE(signature_info.trusted()); |
} |