| // Copyright 2015 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "certificate_policies.h" | 
 |  | 
 | #include "test_helpers.h" | 
 | #include "input.h" | 
 | #include "parser.h" | 
 | #include <gtest/gtest.h> | 
 |  | 
 | namespace bssl { | 
 | namespace { | 
 |  | 
 | ::testing::AssertionResult LoadTestData(const std::string& name, | 
 |                                         std::string* result) { | 
 |   std::string path = "testdata/certificate_policies_unittest/" + name; | 
 |  | 
 |   const PemBlockMapping mappings[] = { | 
 |       {"CERTIFICATE POLICIES", result}, | 
 |   }; | 
 |  | 
 |   return ReadTestDataFromPemFile(path, mappings); | 
 | } | 
 |  | 
 | const uint8_t policy_1_2_3_der[] = {0x2A, 0x03}; | 
 | const uint8_t policy_1_2_4_der[] = {0x2A, 0x04}; | 
 |  | 
 | class ParseCertificatePoliciesExtensionOidsTest | 
 |     : public testing::TestWithParam<bool> { | 
 |  protected: | 
 |   bool fail_parsing_unknown_qualifier_oids() const { return GetParam(); } | 
 | }; | 
 |  | 
 | // Run the tests with all possible values for | 
 | // |fail_parsing_unknown_qualifier_oids|. | 
 | INSTANTIATE_TEST_SUITE_P(All, | 
 |                          ParseCertificatePoliciesExtensionOidsTest, | 
 |                          testing::Bool()); | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, InvalidEmpty) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("invalid-empty.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, InvalidIdentifierNotOid) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("invalid-policy_identifier_not_oid.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, AnyPolicy) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("anypolicy.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 |   ASSERT_EQ(1U, policies.size()); | 
 |   EXPECT_EQ(der::Input(kAnyPolicyOid), policies[0]); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, AnyPolicyWithQualifier) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("anypolicy_with_qualifier.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 |   ASSERT_EQ(1U, policies.size()); | 
 |   EXPECT_EQ(der::Input(kAnyPolicyOid), policies[0]); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, | 
 |        InvalidAnyPolicyWithCustomQualifier) { | 
 |   std::string der; | 
 |   ASSERT_TRUE( | 
 |       LoadTestData("invalid-anypolicy_with_custom_qualifier.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, OnePolicy) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 |   ASSERT_EQ(1U, policies.size()); | 
 |   EXPECT_EQ(der::Input(policy_1_2_3_der), policies[0]); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, OnePolicyWithQualifier) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3_with_qualifier.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 |   ASSERT_EQ(1U, policies.size()); | 
 |   EXPECT_EQ(der::Input(policy_1_2_3_der), policies[0]); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, | 
 |        OnePolicyWithCustomQualifier) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3_with_custom_qualifier.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   bool result = ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors); | 
 |  | 
 |   if (fail_parsing_unknown_qualifier_oids()) { | 
 |     EXPECT_FALSE(result); | 
 |   } else { | 
 |     EXPECT_TRUE(result); | 
 |     ASSERT_EQ(1U, policies.size()); | 
 |     EXPECT_EQ(der::Input(policy_1_2_3_der), policies[0]); | 
 |   } | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, | 
 |        InvalidPolicyWithDuplicatePolicyOid) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("invalid-policy_1_2_3_dupe.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, | 
 |        InvalidPolicyWithEmptyQualifiersSequence) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData( | 
 |       "invalid-policy_1_2_3_with_empty_qualifiers_sequence.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, | 
 |        InvalidPolicyInformationHasUnconsumedData) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData( | 
 |       "invalid-policy_1_2_3_policyinformation_unconsumed_data.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, | 
 |        InvalidPolicyQualifierInfoHasUnconsumedData) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData( | 
 |       "invalid-policy_1_2_3_policyqualifierinfo_unconsumed_data.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, TwoPolicies) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3_and_1_2_4.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 |   ASSERT_EQ(2U, policies.size()); | 
 |   EXPECT_EQ(der::Input(policy_1_2_3_der), policies[0]); | 
 |   EXPECT_EQ(der::Input(policy_1_2_4_der), policies[1]); | 
 | } | 
 |  | 
 | TEST_P(ParseCertificatePoliciesExtensionOidsTest, TwoPoliciesWithQualifiers) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3_and_1_2_4_with_qualifiers.pem", &der)); | 
 |   std::vector<der::Input> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE(ParseCertificatePoliciesExtensionOids( | 
 |       der::Input(der), fail_parsing_unknown_qualifier_oids(), &policies, | 
 |       &errors)); | 
 |   ASSERT_EQ(2U, policies.size()); | 
 |   EXPECT_EQ(der::Input(policy_1_2_3_der), policies[0]); | 
 |   EXPECT_EQ(der::Input(policy_1_2_4_der), policies[1]); | 
 | } | 
 |  | 
 | TEST(ParseCertificatePoliciesExtensionTest, InvalidEmpty) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("invalid-empty.pem", &der)); | 
 |   std::vector<PolicyInformation> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE( | 
 |       ParseCertificatePoliciesExtension(der::Input(der), &policies, &errors)); | 
 | } | 
 |  | 
 | TEST(ParseCertificatePoliciesExtensionTest, | 
 |      InvalidPolicyWithDuplicatePolicyOid) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("invalid-policy_1_2_3_dupe.pem", &der)); | 
 |   std::vector<PolicyInformation> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_FALSE( | 
 |       ParseCertificatePoliciesExtension(der::Input(der), &policies, &errors)); | 
 | } | 
 |  | 
 | TEST(ParseCertificatePoliciesExtensionTest, OnePolicyWithCustomQualifier) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3_with_custom_qualifier.pem", &der)); | 
 |   std::vector<PolicyInformation> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE( | 
 |       ParseCertificatePoliciesExtension(der::Input(der), &policies, &errors)); | 
 |   ASSERT_EQ(1U, policies.size()); | 
 |   PolicyInformation& policy = policies[0]; | 
 |   EXPECT_EQ(der::Input(policy_1_2_3_der), policy.policy_oid); | 
 |  | 
 |   ASSERT_EQ(1U, policy.policy_qualifiers.size()); | 
 |   PolicyQualifierInfo& qualifier = policy.policy_qualifiers[0]; | 
 |   // 1.2.3.4 | 
 |   const uint8_t kExpectedQualifierOid[] = {0x2a, 0x03, 0x04}; | 
 |   EXPECT_EQ(der::Input(kExpectedQualifierOid), qualifier.qualifier_oid); | 
 |   // UTF8String { "hi" } | 
 |   const uint8_t kExpectedQualifier[] = {0x0c, 0x02, 0x68, 0x69}; | 
 |   EXPECT_EQ(der::Input(kExpectedQualifier), qualifier.qualifier); | 
 | } | 
 |  | 
 | TEST(ParseCertificatePoliciesExtensionTest, TwoPolicies) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3_and_1_2_4.pem", &der)); | 
 |   std::vector<PolicyInformation> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE( | 
 |       ParseCertificatePoliciesExtension(der::Input(der), &policies, &errors)); | 
 |   ASSERT_EQ(2U, policies.size()); | 
 |   { | 
 |     PolicyInformation& policy = policies[0]; | 
 |     EXPECT_EQ(der::Input(policy_1_2_3_der), policy.policy_oid); | 
 |     EXPECT_EQ(0U, policy.policy_qualifiers.size()); | 
 |   } | 
 |   { | 
 |     PolicyInformation& policy = policies[1]; | 
 |     EXPECT_EQ(der::Input(policy_1_2_4_der), policy.policy_oid); | 
 |     EXPECT_EQ(0U, policy.policy_qualifiers.size()); | 
 |   } | 
 | } | 
 |  | 
 | TEST(ParseCertificatePoliciesExtensionTest, TwoPoliciesWithQualifiers) { | 
 |   std::string der; | 
 |   ASSERT_TRUE(LoadTestData("policy_1_2_3_and_1_2_4_with_qualifiers.pem", &der)); | 
 |   std::vector<PolicyInformation> policies; | 
 |   CertErrors errors; | 
 |   EXPECT_TRUE( | 
 |       ParseCertificatePoliciesExtension(der::Input(der), &policies, &errors)); | 
 |   ASSERT_EQ(2U, policies.size()); | 
 |   { | 
 |     PolicyInformation& policy = policies[0]; | 
 |     EXPECT_EQ(der::Input(policy_1_2_3_der), policy.policy_oid); | 
 |     ASSERT_EQ(1U, policy.policy_qualifiers.size()); | 
 |     PolicyQualifierInfo& qualifier = policy.policy_qualifiers[0]; | 
 |     EXPECT_EQ(der::Input(kCpsPointerId), qualifier.qualifier_oid); | 
 |     // IA5String { "https://example.com/1_2_3" } | 
 |     const uint8_t kExpectedQualifier[] = { | 
 |         0x16, 0x19, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, | 
 |         0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, | 
 |         0x63, 0x6f, 0x6d, 0x2f, 0x31, 0x5f, 0x32, 0x5f, 0x33}; | 
 |     EXPECT_EQ(der::Input(kExpectedQualifier), qualifier.qualifier); | 
 |   } | 
 |   { | 
 |     PolicyInformation& policy = policies[1]; | 
 |     EXPECT_EQ(der::Input(policy_1_2_4_der), policy.policy_oid); | 
 |     ASSERT_EQ(1U, policy.policy_qualifiers.size()); | 
 |     PolicyQualifierInfo& qualifier = policy.policy_qualifiers[0]; | 
 |     EXPECT_EQ(der::Input(kCpsPointerId), qualifier.qualifier_oid); | 
 |     // IA5String { "http://example.com/1_2_4" } | 
 |     const uint8_t kExpectedQualifier[] = { | 
 |         0x16, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, | 
 |         0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, | 
 |         0x6f, 0x6d, 0x2f, 0x31, 0x5f, 0x32, 0x5f, 0x34}; | 
 |     EXPECT_EQ(der::Input(kExpectedQualifier), qualifier.qualifier); | 
 |   } | 
 | } | 
 |  | 
 | // NOTE: The tests for ParseInhibitAnyPolicy() are part of | 
 | // parsed_certificate_unittest.cc | 
 |  | 
 | }  // namespace | 
 | }  // namespace net |