diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 8b8d4bb..42ea9e2 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -112,7 +112,7 @@
 void
 CaModule::setStatusUpdateCallback(const StatusUpdateCallback& onUpdateCallback)
 {
-  m_config.m_statusUpdateCallback = onUpdateCallback;
+  m_statusUpdateCallback = onUpdateCallback;
 }
 
 Data
@@ -326,8 +326,8 @@
                                                              m_config.m_caItem.m_supportedChallenges));
   m_keyChain.sign(result, signingByIdentity(m_config.m_caItem.m_caPrefix));
   m_face.put(result);
-  if (m_config.m_statusUpdateCallback) {
-    m_config.m_statusUpdateCallback(requestState);
+  if (m_statusUpdateCallback) {
+    m_statusUpdateCallback(requestState);
   }
 }
 
@@ -424,8 +424,8 @@
   result.setContent(payload);
   m_keyChain.sign(result, signingByIdentity(m_config.m_caItem.m_caPrefix));
   m_face.put(result);
-  if (m_config.m_statusUpdateCallback) {
-    m_config.m_statusUpdateCallback(*requestState);
+  if (m_statusUpdateCallback) {
+    m_statusUpdateCallback(*requestState);
   }
 }
 
diff --git a/src/ca-module.hpp b/src/ca-module.hpp
index 209352c..5a3da6a 100644
--- a/src/ca-module.hpp
+++ b/src/ca-module.hpp
@@ -29,6 +29,16 @@
 namespace ndncert {
 namespace ca {
 
+/**
+ * @brief The function would be invoked whenever the certificate request status is updated.
+ * The callback is used to notice the CA application or CA command line tool. The callback is
+ * fired whenever a request instance is created, challenge status is updated, and when certificate
+ * is issued.
+ *
+ * @param RequestState The state of the certificate request whose status is updated.
+ */
+using StatusUpdateCallback = function<void(const RequestState&)>;
+
 class CaModule : noncopyable
 {
 public:
@@ -90,6 +100,10 @@
   security::KeyChain& m_keyChain;
   uint8_t m_requestIdGenKey[32];
   std::unique_ptr<Data> m_profileData;
+  /**
+   * StatusUpdate Callback function
+   */
+  StatusUpdateCallback m_statusUpdateCallback;
 
   std::list<RegisteredPrefixHandle> m_registeredPrefixHandles;
   std::list<InterestFilterHandle> m_interestFilterHandles;
diff --git a/src/configuration.cpp b/src/configuration.cpp
index f53ebda..a56f490 100644
--- a/src/configuration.cpp
+++ b/src/configuration.cpp
@@ -251,6 +251,12 @@
   m_caItems.push_back(profile);
 }
 
+const std::list<CaProfile>&
+ProfileStorage::getCaItems() const
+{
+  return m_caItems;
+}
+
 } // namespace requester
 } // namespace ndncert
 } // namespace ndn
diff --git a/src/configuration.hpp b/src/configuration.hpp
index ec8ccb1..4e466e2 100644
--- a/src/configuration.hpp
+++ b/src/configuration.hpp
@@ -28,6 +28,21 @@
 namespace ndncert {
 
 struct CaProfile {
+public:
+  /**
+   * Parse the configuration json and modify current struct to the result.
+   * @param configJson the configuration json to parse
+   */
+  void
+  parse(const JsonSection& configJson);
+
+  /**
+   * @return the JSON representation of this profile.
+   */
+  JsonSection
+  toJson() const;
+
+public:
   /**
    * CA Name prefix (without /CA suffix).
    */
@@ -65,12 +80,6 @@
    */
   std::shared_ptr<security::Certificate> m_cert;
 
-  void
-  parse(const JsonSection& configJson);
-
-  JsonSection
-  toJson() const;
-
 private:
   void
   parseProbeParameters(const JsonSection& section);
@@ -82,19 +91,8 @@
 namespace ca {
 
 /**
- * @brief The function would be invoked whenever the certificate request status is updated.
- * The callback is used to notice the CA application or CA command line tool. The callback is
- * fired whenever a request instance is created, challenge status is updated, and when certificate
- * is issued.
- *
- * @param RequestState The state of the certificate request whose status is updated.
- */
-using StatusUpdateCallback = function<void(const RequestState&)>;
-
-/**
  * @brief CA's configuration on NDNCERT.
- * For CA configuration format, please refer to:
- *   https://github.com/named-data/ndncert/wiki/NDNCERT-Protocol-0.3#213-ca-profile
+ * @sa https://github.com/named-data/ndncert/wiki/NDNCERT-Protocol-0.3#213-ca-profile
  *
  * The format of CA configuration in JSON
  * {
@@ -124,17 +122,14 @@
   void
   load(const std::string& fileName);
 
+public:
   CaProfile m_caItem;
   /**
-   * Used for CA redirection as specified in
-   * https://github.com/named-data/ndncert/wiki/NDNCERT-Protocol-0.3-PROBE-Extensions#probe-extension-for-redirection
+   * Used for CA redirection
+   * @sa https://github.com/named-data/ndncert/wiki/NDNCERT-Protocol-0.3-PROBE-Extensions#probe-extension-for-redirection
    */
   optional<std::vector<std::shared_ptr<security::Certificate>>> m_redirection = nullopt;
   /**
-   * StatusUpdate Callback function
-   */
-  StatusUpdateCallback m_statusUpdateCallback;
-  /**
    * Name Assignment Functions
    */
   std::vector<std::unique_ptr<NameAssignmentFunc>> m_nameAssignmentFuncs;
@@ -146,9 +141,7 @@
 
 /**
  * @brief Represents Client configuration
- *
- * For Client configuration format, please refer to:
- *   https://github.com/named-data/ndncert/wiki/Client-Configuration-Sample
+ * @sa https://github.com/named-data/ndncert/wiki/Client-Configuration-Sample
  */
 class ProfileStorage
 {
@@ -177,6 +170,10 @@
   void
   addCaProfile(const CaProfile& profile);
 
+  const std::list<CaProfile>&
+  getCaItems() const;
+
+private:
   std::list<CaProfile> m_caItems;
 };
 
diff --git a/src/detail/challenge-encoder.cpp b/src/detail/challenge-encoder.cpp
index 6d68869..0cc98a3 100644
--- a/src/detail/challenge-encoder.cpp
+++ b/src/detail/challenge-encoder.cpp
@@ -26,7 +26,7 @@
 Block
 challengeEncoder::encodeDataContent(ca::RequestState& request, const Name& issuedCertName)
 {
-  Block response = makeEmptyBlock(tlv::EncryptedPayload);
+  Block response(tlv::EncryptedPayload);
   response.push_back(makeNonNegativeIntegerBlock(tlv::Status, static_cast<uint64_t>(request.m_status)));
   if (request.m_challengeState) {
     response.push_back(makeStringBlock(tlv::ChallengeStatus, request.m_challengeState->m_challengeStatus));
diff --git a/src/detail/crypto-helpers.cpp b/src/detail/crypto-helpers.cpp
index 3142268..cc09a95 100644
--- a/src/detail/crypto-helpers.cpp
+++ b/src/detail/crypto-helpers.cpp
@@ -356,7 +356,7 @@
   uint8_t tag[16];
   size_t encryptedPayloadLen = aesGcm128Encrypt(payload, payloadSize, associatedData, associatedDataSize,
                                                 key, iv.data(), encryptedPayload.data(), tag);
-  auto content = makeEmptyBlock(tlvType);
+  Block content(tlvType);
   content.push_back(makeBinaryBlock(tlv::InitializationVector, iv.data(), iv.size()));
   content.push_back(makeBinaryBlock(tlv::AuthenticationTag, tag, 16));
   content.push_back(makeBinaryBlock(tlv::EncryptedPayload, encryptedPayload.data(), encryptedPayloadLen));
diff --git a/src/detail/error-encoder.cpp b/src/detail/error-encoder.cpp
index 8d30103..b503f86 100644
--- a/src/detail/error-encoder.cpp
+++ b/src/detail/error-encoder.cpp
@@ -26,7 +26,7 @@
 Block
 errorEncoder::encodeDataContent(ErrorCode errorCode, const std::string& description)
 {
-  Block response = makeEmptyBlock(ndn::tlv::Content);
+  Block response(ndn::tlv::Content);
   response.push_back(makeNonNegativeIntegerBlock(tlv::ErrorCode, static_cast<size_t>(errorCode)));
   response.push_back(makeStringBlock(tlv::ErrorInfo, description));
   response.encode();
diff --git a/src/detail/info-encoder.cpp b/src/detail/info-encoder.cpp
index 0a26f8a..746aafc 100644
--- a/src/detail/info-encoder.cpp
+++ b/src/detail/info-encoder.cpp
@@ -26,7 +26,7 @@
 Block
 infoEncoder::encodeDataContent(const CaProfile& caConfig, const security::Certificate& certificate)
 {
-  auto content = makeEmptyBlock(ndn::tlv::Content);
+  Block content(ndn::tlv::Content);
   content.push_back(makeNestedBlock(tlv::CaPrefix, caConfig.m_caPrefix));
   std::string caInfo = "";
   if (caConfig.m_caInfo == "") {
diff --git a/src/detail/new-renew-revoke-encoder.cpp b/src/detail/new-renew-revoke-encoder.cpp
index 0863d9b..bdde1cf 100644
--- a/src/detail/new-renew-revoke-encoder.cpp
+++ b/src/detail/new-renew-revoke-encoder.cpp
@@ -32,7 +32,7 @@
 newRenewRevokeEncoder::encodeApplicationParameters(RequestType requestType, const std::vector<uint8_t>& ecdhPub,
                                                    const security::Certificate& certRequest)
 {
-  Block request = makeEmptyBlock(ndn::tlv::ApplicationParameters);
+  Block request(ndn::tlv::ApplicationParameters);
   std::stringstream ss;
   try {
     security::transform::bufferSource(certRequest.wireEncode().wire(), certRequest.wireEncode().size())
@@ -84,7 +84,7 @@
                                          const RequestId& requestId, const Status& status,
                                          const std::list<std::string>& challenges)
 {
-  Block response = makeEmptyBlock(ndn::tlv::Content);
+  Block response(ndn::tlv::Content);
   response.push_back(makeBinaryBlock(tlv::EcdhPub, ecdhKey.data(), ecdhKey.size()));
   response.push_back(makeBinaryBlock(tlv::Salt, salt.data(), salt.size()));
   response.push_back(makeBinaryBlock(tlv::RequestId, requestId.data(), requestId.size()));
diff --git a/src/detail/probe-encoder.cpp b/src/detail/probe-encoder.cpp
index a4271f5..2a5fa08 100644
--- a/src/detail/probe-encoder.cpp
+++ b/src/detail/probe-encoder.cpp
@@ -26,7 +26,7 @@
 Block
 probeEncoder::encodeApplicationParameters(std::vector<std::tuple<std::string, std::string>>&& parameters)
 {
-  auto content = makeEmptyBlock(ndn::tlv::ApplicationParameters);
+  Block content(ndn::tlv::ApplicationParameters);
   for (size_t i = 0; i < parameters.size(); ++i) {
     content.push_back(makeStringBlock(tlv::ParameterKey, std::get<0>(parameters[i])));
     content.push_back(makeStringBlock(tlv::ParameterValue, std::get<1>(parameters[i])));
@@ -40,9 +40,10 @@
 {
   std::vector<std::tuple<std::string, std::string>> result;
   block.parse();
-  for (size_t i = 0; i < block.elements().size() - 1; ++i) {
-    if (block.elements().at(i).type() == tlv::ParameterKey && block.elements().at(i + 1).type() == tlv::ParameterValue) {
-      result.push_back(std::make_tuple(readString(block.elements().at(i)), readString(block.elements().at(i + 1))));
+  for (size_t i = 0; i < block.elements().size() - 1; i++) {
+    if (block.elements()[i].type() == tlv::ParameterKey && block.elements()[i + 1].type() == tlv::ParameterValue) {
+      result.emplace_back(readString(block.elements().at(i)), readString(block.elements().at(i + 1)));
+      i ++;
     }
   }
   return result;
@@ -52,7 +53,7 @@
 probeEncoder::encodeDataContent(const std::vector<Name>& identifiers, optional<size_t> maxSuffixLength,
                                 optional<std::vector<std::shared_ptr<security::Certificate>>> redirectionItems)
 {
-  Block content = makeEmptyBlock(ndn::tlv::Content);
+  Block content(ndn::tlv::Content);
   for (const auto& name : identifiers) {
     Block item(tlv::ProbeResponse);
     item.push_back(name.wireEncode());
@@ -81,7 +82,7 @@
       item.parse();
       Name elementName;
       int maxSuffixLength = 0;
-      for (const auto& subBlock: item.elements()) {
+      for (const auto& subBlock : item.elements()) {
           if (subBlock.type() == ndn::tlv::Name) {
               if (!elementName.empty()) {
                   NDN_THROW(std::runtime_error("Invalid probe format"));
diff --git a/src/identity-challenge/challenge-credential.cpp b/src/identity-challenge/challenge-credential.cpp
index adee8b0..7e72805 100644
--- a/src/identity-challenge/challenge-credential.cpp
+++ b/src/identity-challenge/challenge-credential.cpp
@@ -137,7 +137,7 @@
 ChallengeCredential::genChallengeRequestTLV(Status status, const std::string& challengeStatus,
                                             std::vector<std::tuple<std::string, std::string>>&& params)
 {
-  Block request = makeEmptyBlock(tlv::EncryptedPayload);
+  Block request(tlv::EncryptedPayload);
   if (status == Status::BEFORE_CHALLENGE) {
     if (params.size() != 2) {
       NDN_THROW(std::runtime_error("Wrong parameter provided."));
@@ -146,7 +146,7 @@
     for (const auto& item : params) {
       if (std::get<0>(item) == PARAMETER_KEY_CREDENTIAL_CERT) {
         request.push_back(makeStringBlock(tlv::ParameterKey, PARAMETER_KEY_CREDENTIAL_CERT));
-        Block valueBlock = makeEmptyBlock(tlv::ParameterValue);
+        Block valueBlock(tlv::ParameterValue);
         auto& certTlvStr = std::get<1>(item);
         valueBlock.push_back(Block((uint8_t*)certTlvStr.c_str(), certTlvStr.size()));
         request.push_back(valueBlock);
diff --git a/src/identity-challenge/challenge-email.cpp b/src/identity-challenge/challenge-email.cpp
index e979753..332ef96 100644
--- a/src/identity-challenge/challenge-email.cpp
+++ b/src/identity-challenge/challenge-email.cpp
@@ -20,6 +20,7 @@
 
 #include "challenge-email.hpp"
 #include <regex>
+#include <boost/process.hpp>
 
 namespace ndn {
 namespace ndncert {
@@ -125,7 +126,7 @@
 ChallengeEmail::genChallengeRequestTLV(Status status, const std::string& challengeStatus,
                                        std::vector<std::tuple<std::string, std::string>>&& params)
 {
-  Block request = makeEmptyBlock(tlv::EncryptedPayload);
+  Block request(tlv::EncryptedPayload);
   if (status == Status::BEFORE_CHALLENGE) {
     if (params.size() != 1 || std::get<0>(params[0]) != PARAMETER_KEY_EMAIL) {
       NDN_THROW(std::runtime_error("Wrong parameter provided."));
@@ -165,13 +166,13 @@
   command += " \"" + emailAddress + "\" \"" + secret + "\" \"" +
              request.m_caPrefix.toUri() + "\" \"" +
              request.m_cert.getName().toUri() + "\"";
-  int result = system(command.c_str());
-  if (result == -1) {
+  boost::process::child child(command);
+  child.wait();
+  if (child.exit_code() != 0) {
     NDN_LOG_TRACE("EmailSending Script " + m_sendEmailScript + " fails.");
   }
   NDN_LOG_TRACE("EmailSending Script " + m_sendEmailScript +
-             " was executed successfully with return value" + std::to_string(result) + ".");
-  return;
+             " was executed successfully with return value 0.");
 }
 
 } // namespace ndncert
diff --git a/src/identity-challenge/challenge-pin.cpp b/src/identity-challenge/challenge-pin.cpp
index 66f5fec..34b987d 100644
--- a/src/identity-challenge/challenge-pin.cpp
+++ b/src/identity-challenge/challenge-pin.cpp
@@ -107,7 +107,7 @@
 ChallengePin::genChallengeRequestTLV(Status status, const std::string& challengeStatus,
                                      std::vector<std::tuple<std::string, std::string>>&& params)
 {
-  Block request = makeEmptyBlock(tlv::EncryptedPayload);
+  Block request(tlv::EncryptedPayload);
   if (status == Status::BEFORE_CHALLENGE) {
     request.push_back(makeStringBlock(tlv::SelectedChallenge, CHALLENGE_TYPE));
   }
diff --git a/src/name-assignment/assignment-func.cpp b/src/name-assignment/assignment-func.cpp
index 6a55cc2..22eb35e 100644
--- a/src/name-assignment/assignment-func.cpp
+++ b/src/name-assignment/assignment-func.cpp
@@ -43,15 +43,15 @@
 unique_ptr<NameAssignmentFunc>
 NameAssignmentFunc::createNameAssignmentFunc(const std::string& challengeType, const std::string& format)
 {
-  FuncFactoryFactory& factory = getFactory();
+  CurriedFuncFactory& factory = getFactory();
   auto i = factory.find(challengeType);
   return i == factory.end() ? nullptr : i->second(format);
 }
 
-NameAssignmentFunc::FuncFactoryFactory&
+NameAssignmentFunc::CurriedFuncFactory&
 NameAssignmentFunc::getFactory()
 {
-  static NameAssignmentFunc::FuncFactoryFactory factory;
+  static NameAssignmentFunc::CurriedFuncFactory factory;
   return factory;
 }
 
diff --git a/src/name-assignment/assignment-func.hpp b/src/name-assignment/assignment-func.hpp
index a574d05..e122ed2 100644
--- a/src/name-assignment/assignment-func.hpp
+++ b/src/name-assignment/assignment-func.hpp
@@ -28,9 +28,10 @@
 
 class NameAssignmentFunc : noncopyable
 {
-public:
+protected:
   explicit NameAssignmentFunc(const std::string& factoryType, const std::string& format = "");
 
+public:
   virtual ~NameAssignmentFunc() = default;
 
   /**
@@ -47,26 +48,28 @@
   assignName(const std::vector<std::tuple<std::string, std::string>>& params) = 0;
 
   const std::string FACTORY_TYPE;
-  std::vector<std::string> m_nameFormat;
 
 public:
-  template <class ChallengeType>
+  template <class AssignmentType>
   static void
   registerNameAssignmentFunc(const std::string& typeName)
   {
-    FuncFactoryFactory& factory = getFactory();
+    CurriedFuncFactory& factory = getFactory();
     BOOST_ASSERT(factory.count(typeName) == 0);
-    factory[typeName] = [](const std::string& format) { return std::make_unique<ChallengeType>(format); };
+    factory[typeName] = [](const std::string& format) { return std::make_unique<AssignmentType>(format); };
   }
 
   static unique_ptr<NameAssignmentFunc>
   createNameAssignmentFunc(const std::string& challengeType, const std::string& format = "");
 
+NDNCERT_PUBLIC_WITH_TESTS_ELSE_PRIVATE:
+    std::vector<std::string> m_nameFormat;
+    
 private:
   typedef function<unique_ptr<NameAssignmentFunc>(const std::string&)> FactoryCreateFunc;
-  typedef std::map<std::string, FactoryCreateFunc> FuncFactoryFactory;
+  typedef std::map<std::string, FactoryCreateFunc> CurriedFuncFactory;
 
-  static FuncFactoryFactory&
+  static CurriedFuncFactory&
   getFactory();
 };
 
diff --git a/src/name-assignment/assignment-param.hpp b/src/name-assignment/assignment-param.hpp
index bc1a084..8a31dc6 100644
--- a/src/name-assignment/assignment-param.hpp
+++ b/src/name-assignment/assignment-param.hpp
@@ -36,6 +36,7 @@
 
   std::vector<PartialName>
   assignName(const std::vector<std::tuple<std::string, std::string>>& params) override;
+
 };
 
 } // namespace ndncert
diff --git a/tests/unit-tests/configuration.t.cpp b/tests/unit-tests/configuration.t.cpp
index c3086f4..3ba4567 100644
--- a/tests/unit-tests/configuration.t.cpp
+++ b/tests/unit-tests/configuration.t.cpp
@@ -93,9 +93,9 @@
 {
   requester::ProfileStorage profileStorage;
   profileStorage.load("tests/unit-tests/config-files/config-client-1");
-  BOOST_CHECK_EQUAL(profileStorage.m_caItems.size(), 2);
+  BOOST_CHECK_EQUAL(profileStorage.getCaItems().size(), 2);
 
-  auto& profile1 = profileStorage.m_caItems.front();
+  auto& profile1 = profileStorage.getCaItems().front();
   BOOST_CHECK_EQUAL(profile1.m_caPrefix, "/ndn/edu/ucla");
   BOOST_CHECK_EQUAL(profile1.m_caInfo, "ndn testbed ca");
   BOOST_CHECK_EQUAL(profile1.m_maxValidityPeriod, time::seconds(864000));
@@ -105,7 +105,7 @@
   BOOST_CHECK_EQUAL(profile1.m_cert->getName(),
                     "/ndn/site1/KEY/%11%BC%22%F4c%15%FF%17/self/%FD%00%00%01Y%C8%14%D9%A5");
 
-  auto& profile2 = profileStorage.m_caItems.back();
+  auto& profile2 = profileStorage.getCaItems().back();
   BOOST_CHECK_EQUAL(profile2.m_caPrefix, "/ndn/edu/ucla/zhiyi");
   BOOST_CHECK_EQUAL(profile2.m_caInfo, "");
   BOOST_CHECK_EQUAL(profile2.m_maxValidityPeriod, time::seconds(86400));
@@ -135,14 +135,14 @@
   item.m_caPrefix = Name("/test");
   item.m_caInfo = "test";
 
-  profileStorage.m_caItems.push_back(item);
-  BOOST_CHECK_EQUAL(profileStorage.m_caItems.size(), 3);
-  auto lastItem = profileStorage.m_caItems.back();
+  profileStorage.addCaProfile(item);
+  BOOST_CHECK_EQUAL(profileStorage.getCaItems().size(), 3);
+  auto lastItem = profileStorage.getCaItems().back();
   BOOST_CHECK_EQUAL(lastItem.m_caPrefix, "/test");
 
   profileStorage.removeCaProfile(Name("/test"));
-  BOOST_CHECK_EQUAL(profileStorage.m_caItems.size(), 2);
-  lastItem = profileStorage.m_caItems.back();
+  BOOST_CHECK_EQUAL(profileStorage.getCaItems().size(), 2);
+  lastItem = profileStorage.getCaItems().back();
   BOOST_CHECK_EQUAL(lastItem.m_caPrefix, "/ndn/edu/ucla/zhiyi");
 }
 
diff --git a/tests/unit-tests/protocol-encoders.t.cpp b/tests/unit-tests/protocol-encoders.t.cpp
index 56add32..532049b 100644
--- a/tests/unit-tests/protocol-encoders.t.cpp
+++ b/tests/unit-tests/protocol-encoders.t.cpp
@@ -40,7 +40,7 @@
 
   requester::ProfileStorage caCache;
   caCache.load("tests/unit-tests/config-files/config-client-1");
-  auto& cert = caCache.m_caItems.front().m_cert;
+  auto& cert = caCache.getCaItems().front().m_cert;
 
   auto b = infoEncoder::encodeDataContent(config.m_caItem, *cert);
   auto item = infoEncoder::decodeDataContent(b);
@@ -106,7 +106,7 @@
 {
   requester::ProfileStorage caCache;
   caCache.load("tests/unit-tests/config-files/config-client-1");
-  auto& certRequest = caCache.m_caItems.front().m_cert;
+  auto& certRequest = caCache.getCaItems().front().m_cert;
   std::vector<uint8_t> pub = ECDHState().getSelfPubKey();
   auto b = newRenewRevokeEncoder::encodeApplicationParameters(RequestType::REVOKE, pub, *certRequest);
   std::vector<uint8_t> returnedPub;
@@ -147,7 +147,7 @@
                          0xe0, 0xff, 0x56, 0x83, 0xf2, 0x43, 0xb2, 0x13};
   requester::ProfileStorage caCache;
   caCache.load("tests/unit-tests/config-files/config-client-1");
-  security::Certificate certRequest = *caCache.m_caItems.front().m_cert;
+  security::Certificate certRequest = *caCache.getCaItems().front().m_cert;
   RequestId id = {102};
   std::array<uint8_t, 16> aesKey;
   std::memcpy(aesKey.data(), key, sizeof(key));
@@ -156,7 +156,7 @@
                          std::move(aesKey), 0);
   auto contentBlock = challengeEncoder::encodeDataContent(state, Name("/ndn/ucla/a/b/c"));
 
-  requester::RequestState context(m_keyChain, caCache.m_caItems.front(), RequestType::NEW);
+  requester::RequestState context(m_keyChain, caCache.getCaItems().front(), RequestType::NEW);
   context.m_requestId = id;
   std::memcpy(context.m_aesKey.data(), key, sizeof(key));
   challengeEncoder::decodeDataContent(contentBlock, context);
