|  | // Copyright 2016 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BSSL_PKI_NIST_PKITS_UNITTEST_H_ | 
|  | #define BSSL_PKI_NIST_PKITS_UNITTEST_H_ | 
|  |  | 
|  | #include <set> | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  | #include "parse_values.h" | 
|  | #include "test_helpers.h" | 
|  |  | 
|  | BSSL_NAMESPACE_BEGIN | 
|  |  | 
|  | // Describes the inputs and outputs (other than the certificates) for | 
|  | // the PKITS tests. | 
|  | struct PkitsTestInfo { | 
|  | // Default construction results in the "default settings". | 
|  | PkitsTestInfo(); | 
|  | PkitsTestInfo(const PkitsTestInfo &other); | 
|  | ~PkitsTestInfo(); | 
|  |  | 
|  | // Sets |initial_policy_set| to the specified policies. The | 
|  | // policies are described as comma-separated symbolic strings like | 
|  | // "anyPolicy" and "NIST-test-policy-1". | 
|  | // | 
|  | // If this isn't called, the default is "anyPolicy". | 
|  | void SetInitialPolicySet(const char *const policy_names); | 
|  |  | 
|  | // Sets |user_constrained_policy_set| to the specified policies. The | 
|  | // policies are described as comma-separated symbolic strings like | 
|  | // "anyPolicy" and "NIST-test-policy-1". | 
|  | // | 
|  | // If this isn't called, the default is "NIST-test-policy-1". | 
|  | void SetUserConstrainedPolicySet(const char *const policy_names); | 
|  |  | 
|  | void SetInitialExplicitPolicy(bool b); | 
|  | void SetInitialPolicyMappingInhibit(bool b); | 
|  | void SetInitialInhibitAnyPolicy(bool b); | 
|  |  | 
|  | // ---------------- | 
|  | // Info | 
|  | // ---------------- | 
|  |  | 
|  | // The PKITS test number. For example, "4.1.1". | 
|  | const char *test_number = nullptr; | 
|  |  | 
|  | // ---------------- | 
|  | // Inputs | 
|  | // ---------------- | 
|  |  | 
|  | // A set of policy OIDs to use for "initial-policy-set". | 
|  | std::set<der::Input> initial_policy_set; | 
|  |  | 
|  | // The value of "initial-explicit-policy". | 
|  | InitialExplicitPolicy initial_explicit_policy = InitialExplicitPolicy::kFalse; | 
|  |  | 
|  | // The value of "initial-policy-mapping-inhibit". | 
|  | InitialPolicyMappingInhibit initial_policy_mapping_inhibit = | 
|  | InitialPolicyMappingInhibit::kFalse; | 
|  |  | 
|  | // The value of "initial-inhibit-any-policy". | 
|  | InitialAnyPolicyInhibit initial_inhibit_any_policy = | 
|  | InitialAnyPolicyInhibit::kFalse; | 
|  |  | 
|  | // This is the time when PKITS was published. | 
|  | der::GeneralizedTime time = {2011, 4, 15, 0, 0, 0}; | 
|  |  | 
|  | // ---------------- | 
|  | // Expected outputs | 
|  | // ---------------- | 
|  |  | 
|  | // Whether path validation should succeed. | 
|  | bool should_validate = false; | 
|  |  | 
|  | std::set<der::Input> user_constrained_policy_set; | 
|  | }; | 
|  |  | 
|  | // Parameterized test class for PKITS tests. | 
|  | // The instantiating code should define a PkitsTestDelegate with an appropriate | 
|  | // static RunTest method, and then INSTANTIATE_TYPED_TEST_SUITE_P for each | 
|  | // testcase (each TYPED_TEST_SUITE_P in pkits_testcases-inl.h). | 
|  | template <typename PkitsTestDelegate> | 
|  | class PkitsTest : public ::testing::Test { | 
|  | public: | 
|  | template <size_t num_certs, size_t num_crls> | 
|  | void RunTest(const char *const (&cert_names)[num_certs], | 
|  | const char *const (&crl_names)[num_crls], | 
|  | const PkitsTestInfo &info) { | 
|  | std::vector<std::string> cert_ders; | 
|  | for (const std::string s : cert_names) { | 
|  | cert_ders.push_back(bssl::ReadTestFileToString( | 
|  | "testdata/nist-pkits/certs/" + s + ".crt")); | 
|  | } | 
|  | std::vector<std::string> crl_ders; | 
|  | for (const std::string s : crl_names) { | 
|  | crl_ders.push_back( | 
|  | bssl::ReadTestFileToString("testdata/nist-pkits/crls/" + s + ".crl")); | 
|  | } | 
|  |  | 
|  | std::string_view test_number = info.test_number; | 
|  |  | 
|  | // Some of the PKITS tests are intentionally given different expectations | 
|  | // from PKITS.pdf. | 
|  | // | 
|  | // Empty user_constrained_policy_set due to short-circuit on invalid | 
|  | // signatures: | 
|  | // | 
|  | //   4.1.2 - Invalid CA Signature Test2 | 
|  | //   4.1.3 - Invalid EE Signature Test3 | 
|  | //   4.1.6 - Invalid DSA Signature Test6 | 
|  | // | 
|  | // Expected to fail because DSA signatures are not supported: | 
|  | // | 
|  | //   4.1.4 - Valid DSA Signatures Test4 | 
|  | //   4.1.5 - Valid DSA Parameter Inheritance Test5 | 
|  | // | 
|  | // Expected to fail because Name constraints on | 
|  | // uniformResourceIdentifiers are not supported: | 
|  | // | 
|  | //   4.13.34 - Valid URI nameConstraints Test34 | 
|  | //   4.13.36 - Valid URI nameConstraints Test36 | 
|  | if (test_number == "4.1.2" || test_number == "4.1.3" || | 
|  | test_number == "4.1.6") { | 
|  | PkitsTestInfo modified_info = info; | 
|  | modified_info.user_constrained_policy_set = {}; | 
|  | PkitsTestDelegate::RunTest(cert_ders, crl_ders, modified_info); | 
|  | } else if (test_number == "4.1.4" || test_number == "4.1.5") { | 
|  | PkitsTestInfo modified_info = info; | 
|  | modified_info.user_constrained_policy_set = {}; | 
|  | modified_info.should_validate = false; | 
|  | PkitsTestDelegate::RunTest(cert_ders, crl_ders, modified_info); | 
|  | } else if (test_number == "4.13.34" || test_number == "4.13.36") { | 
|  | PkitsTestInfo modified_info = info; | 
|  | modified_info.should_validate = false; | 
|  | PkitsTestDelegate::RunTest(cert_ders, crl_ders, modified_info); | 
|  | } else { | 
|  | PkitsTestDelegate::RunTest(cert_ders, crl_ders, info); | 
|  | } | 
|  | } | 
|  | }; | 
|  |  | 
|  | // Inline the generated test code: | 
|  | #include "testdata/nist-pkits/pkits_testcases-inl.h" | 
|  |  | 
|  | BSSL_NAMESPACE_END | 
|  |  | 
|  | #endif  // BSSL_PKI_NIST_PKITS_UNITTEST_H_ |