security: Add general interface to chain validation policies

Change-Id: I1a0d47aeb847455a2d7d6d48185f6edd9024d298
Refs: #3920
diff --git a/src/security/v2/validation-policy.hpp b/src/security/v2/validation-policy.hpp
index 7d85803..66216c8 100644
--- a/src/security/v2/validation-policy.hpp
+++ b/src/security/v2/validation-policy.hpp
@@ -40,10 +40,41 @@
   using ValidationContinuation = std::function<void(const shared_ptr<CertificateRequest>& certRequest,
                                                     const shared_ptr<ValidationState>& state)>;
 
+  ValidationPolicy()
+    : m_validator(nullptr)
+  {
+  }
+
   virtual
   ~ValidationPolicy() = default;
 
   /**
+   * @brief Set inner policy
+   *
+   * Multiple assignments of the inner policy will create a "chain" of linked policies.
+   * The inner policy from the latest invocation of setInnerPolicy will be at the bottom
+   * of the policy list.
+   *
+   * For example, sequence of `this->setInnerPolicy(policy1)` and
+   * `this->setInnerPolicy(policy2)`, will result in `this->m_innerPolicy == policy1`,
+   * this->m_innerPolicy->m_innerPolicy == policy2', and
+   * `this->m_innerPolicy->m_innerPolicy->m_innerPolicy == nullptr`.
+   *
+   * @throw std::invalid_argument exception, if @p innerPolicy is nullptr.
+   */
+  void
+  setInnerPolicy(unique_ptr<ValidationPolicy> innerPolicy);
+
+  ValidationPolicy&
+  getInnerPolicy();
+
+  /**
+   * @brief Set validator to which the policy is associated
+   */
+  void
+  setValidator(Validator& validator);
+
+  /**
    * @brief Check @p data against the policy
    *
    * Depending on implementation of the policy, this check can be done synchronously or
@@ -101,6 +132,10 @@
   {
     checkPolicy(static_cast<const Data&>(certificate), state, continueValidation);
   }
+
+NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PROTECTED:
+  Validator* m_validator;
+  unique_ptr<ValidationPolicy> m_innerPolicy;
 };
 
 } // namespace v2