Index: net/cert/cert_verify_proc_whitelist_unittest.cc |
diff --git a/net/cert/cert_verify_proc_whitelist_unittest.cc b/net/cert/cert_verify_proc_whitelist_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e1206dcd9a2dfdcd792458fc0d6e16466bdd358b |
--- /dev/null |
+++ b/net/cert/cert_verify_proc_whitelist_unittest.cc |
@@ -0,0 +1,189 @@ |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/cert/cert_verify_proc_whitelist.h" |
+ |
+#include "base/memory/ref_counted.h" |
+#include "net/base/test_data_directory.h" |
+#include "net/cert/x509_certificate.h" |
+#include "net/test/cert_test_util.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace net { |
+ |
+namespace { |
+ |
+HashValue GetTestHashValue(uint8_t label, HashValueTag tag) { |
+ HashValue hash_value(tag); |
+ memset(hash_value.data(), label, hash_value.size()); |
+ return hash_value; |
+} |
+ |
+HashValueVector GetFakeHashValues() { |
+ HashValueVector public_key_hashes; |
+ |
+ // Fake "root" hash |
+ public_key_hashes.push_back(GetTestHashValue(0x00, HASH_VALUE_SHA256)); |
+ public_key_hashes.push_back(GetTestHashValue(0x01, HASH_VALUE_SHA1)); |
+ // Fake "intermediate" hash |
+ public_key_hashes.push_back(GetTestHashValue(0x02, HASH_VALUE_SHA256)); |
+ public_key_hashes.push_back(GetTestHashValue(0x03, HASH_VALUE_SHA1)); |
+ // Fake "leaf" hash |
+ public_key_hashes.push_back(GetTestHashValue(0x04, HASH_VALUE_SHA256)); |
+ public_key_hashes.push_back(GetTestHashValue(0x05, HASH_VALUE_SHA1)); |
+ |
+ return public_key_hashes; |
+} |
+ |
+// The SHA-256 hash of the leaf cert "ok_cert.pem"; obtainable either |
+// via X509Certificate::CalculateFingerprint256 or |
+// openssl x509 -inform pem -in ok_cert.pem -outform der | openssl |
+// dgst -sha256 -c |
+const uint8_t kWhitelistCerts[][crypto::kSHA256Length] = { |
+ /* clang-format off */ |
+ { 0xf4, 0x42, 0xdd, 0x66, 0xfa, 0x10, 0x70, 0x65, |
+ 0xd1, 0x7e, 0xd9, 0xbb, 0x7c, 0xa9, 0x3c, 0x79, |
+ 0x63, 0xbe, 0x01, 0xa7, 0x54, 0x18, 0xab, 0x2f, |
+ 0xc3, 0x9a, 0x14, 0x53, 0xc3, 0x83, 0xa0, 0x5a }, |
+ /* clang-format on */ |
+}; |
+ |
+TEST(CertVerifyProcWhitelistTest, AcceptsWhitelistedEEByRoot) { |
+ scoped_refptr<X509Certificate> cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ // clang-format off |
+ const PublicKeyWhitelist kWhitelist[] = { |
+ { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, |
+ kWhitelistCerts, arraysize(kWhitelistCerts) |
+ }, |
+ }; |
+ // clang-format on |
+ |
+ SetCertificateWhitelistForTesting(kWhitelist, arraysize(kWhitelist)); |
+ |
+ HashValueVector public_key_hashes = GetFakeHashValues(); |
+ |
+ // Should return false, indicating this cert is acceptable because of |
+ // it being whitelisted. |
+ EXPECT_FALSE(IsNonWhitelistedCertificate(*cert, public_key_hashes)); |
+ |
+ SetCertificateWhitelistForTesting(nullptr, 0); |
+} |
+ |
+TEST(CertVerifyProcWhitelistTest, AcceptsWhitelistedEEByIntermediate) { |
+ scoped_refptr<X509Certificate> cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ // clang-format off |
+ const PublicKeyWhitelist kWhitelist[] = { |
+ { { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, |
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, |
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, |
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02 }, |
+ kWhitelistCerts, arraysize(kWhitelistCerts) |
+ }, |
+ }; |
+ // clang-format on |
+ |
+ SetCertificateWhitelistForTesting(kWhitelist, arraysize(kWhitelist)); |
+ |
+ HashValueVector public_key_hashes = GetFakeHashValues(); |
+ |
+ // Should return false, indicating this cert is acceptable because of |
+ // it being whitelisted. |
+ EXPECT_FALSE(IsNonWhitelistedCertificate(*cert, public_key_hashes)); |
+ |
+ SetCertificateWhitelistForTesting(nullptr, 0); |
+} |
+ |
+TEST(CertVerifyProcWhitelistTest, RejectsNonWhitelistedEE) { |
+ scoped_refptr<X509Certificate> cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ // clang-format off |
+ const PublicKeyWhitelist kWhitelist[] = { |
+ { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, |
+ kWhitelistCerts, arraysize(kWhitelistCerts) |
+ }, |
+ }; |
+ // clang-format on |
+ |
+ SetCertificateWhitelistForTesting(kWhitelist, arraysize(kWhitelist)); |
+ |
+ HashValueVector public_key_hashes = GetFakeHashValues(); |
+ |
+ // Should return true, indicating this certificate chains to a constrained |
+ // root and is not whitelisted. |
+ EXPECT_TRUE(IsNonWhitelistedCertificate(*cert, public_key_hashes)); |
+ |
+ SetCertificateWhitelistForTesting(nullptr, 0); |
+} |
+ |
+TEST(CertVerifyProcWhitelistTest, RejectsNonWhitelistedEEByIntermediate) { |
+ scoped_refptr<X509Certificate> cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ // clang-format off |
+ const PublicKeyWhitelist kWhitelist[] = { |
+ { { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, |
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, |
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, |
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02 }, |
+ kWhitelistCerts, arraysize(kWhitelistCerts) |
+ }, |
+ }; |
+ // clang-format on |
+ |
+ SetCertificateWhitelistForTesting(kWhitelist, arraysize(kWhitelist)); |
+ |
+ HashValueVector public_key_hashes = GetFakeHashValues(); |
+ |
+ // Should return true, indicating this certificate chains to a constrained |
+ // root and is not whitelisted. |
+ EXPECT_TRUE(IsNonWhitelistedCertificate(*cert, public_key_hashes)); |
+ |
+ SetCertificateWhitelistForTesting(nullptr, 0); |
+} |
+ |
+TEST(CertVerifyProcWhitelistTest, AcceptsUnconstrainedLeaf) { |
+ scoped_refptr<X509Certificate> cert = |
+ ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); |
+ ASSERT_TRUE(cert); |
+ |
+ // clang-format off |
+ const PublicKeyWhitelist kWhitelist[] = { |
+ { { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 }, |
+ kWhitelistCerts, arraysize(kWhitelistCerts) |
+ }, |
+ }; |
+ // clang-format on |
+ |
+ SetCertificateWhitelistForTesting(kWhitelist, arraysize(kWhitelist)); |
+ |
+ HashValueVector public_key_hashes = GetFakeHashValues(); |
+ |
+ // Should return false, because the chain (as indicated by |
+ // public_key_hashes) is not constrained. |
+ EXPECT_FALSE(IsNonWhitelistedCertificate(*cert, public_key_hashes)); |
+ |
+ SetCertificateWhitelistForTesting(nullptr, 0); |
+} |
+ |
+} // namespace |
+ |
+} // namespace net |