Add forwarding hint support

Change-Id: Ie8a1d45f3abe0377a3b6c0cff08d27824b2861b1
diff --git a/src/detail/challenge-encoder.cpp b/src/detail/challenge-encoder.cpp
index 0f85fdc..c2bdd68 100644
--- a/src/detail/challenge-encoder.cpp
+++ b/src/detail/challenge-encoder.cpp
@@ -41,6 +41,7 @@
   }
   if (!issuedCertName.empty()) {
     response.push_back(makeNestedBlock(tlv::IssuedCertName, issuedCertName));
+    response.push_back(makeNestedBlock(ndn::tlv::ForwardingHint, Name(request.caPrefix).append("CA")));
   }
   response.encode();
 
@@ -81,6 +82,9 @@
         case tlv::IssuedCertName:
           state.m_issuedCertName = Name(item.blockFromValue());
           break;
+        case ndn::tlv::ForwardingHint:
+          state.m_forwardingHint = Name(item.blockFromValue());
+          break;
         case tlv::ParameterKey:
           if (readString(item) == "nonce") {
             lookingForNonce = true;
diff --git a/src/requester-request.cpp b/src/requester-request.cpp
index 5d9896f..e8d6b26 100644
--- a/src/requester-request.cpp
+++ b/src/requester-request.cpp
@@ -277,6 +277,9 @@
 {
   Name interestName = m_issuedCertName;
   auto interest = std::make_shared<Interest>(interestName);
+  if (!m_forwardingHint.empty()) {
+    interest->setForwardingHint({m_forwardingHint});
+  }
   interest->setMustBeFresh(false);
   interest->setCanBePrefix(false);
   return interest;
diff --git a/src/requester-request.hpp b/src/requester-request.hpp
index acd06cc..9291958 100644
--- a/src/requester-request.hpp
+++ b/src/requester-request.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2017-2021, Regents of the University of California.
+ * Copyright (c) 2017-2022, Regents of the University of California.
  *
  * This file is part of ndncert, a certificate management system based on NDN.
  *
@@ -249,6 +249,10 @@
    */
   Name m_issuedCertName;
   /**
+   * @brief The optional forwarding hint.
+   */
+  Name m_forwardingHint;
+  /**
    * @brief ecdh state.
    */
   ECDHState m_ecdh;