diff --git a/src/challenge-modules/challenge-credential.cpp b/src/challenge-modules/challenge-credential.cpp
index cf429b5..50a15c0 100644
--- a/src/challenge-modules/challenge-credential.cpp
+++ b/src/challenge-modules/challenge-credential.cpp
@@ -82,18 +82,19 @@
   if (m_trustAnchors.empty()) {
     parseConfigFile();
   }
-  shared_ptr<security::v2::Certificate> credential;
+  security::v2::Certificate credential;
   const uint8_t* signature;
   size_t signatureLen;
   const auto& elements = params.elements();
   for (size_t i = 0; i < elements.size(); i++) {
     if (elements[i].type() == tlv_parameter_key) {
       if (readString(elements[i]) == PARAMETER_KEY_CREDENTIAL_CERT) {
-        std::istringstream ss(readString(elements[i + 1]));
-        credential = io::load<security::v2::Certificate>(ss);
-        if (credential == nullptr) {
-          _LOG_ERROR("Cannot load challenge parameter: credential");
-          return returnWithError(request, ErrorCode::INVALID_PARAMETER, "Cannot challenge credential: credential.");
+        try {
+          credential.wireDecode(elements[i + 1].blockFromValue());
+        }
+        catch (const std::exception& e) {
+          _LOG_ERROR("Cannot load challenge parameter: credential " << e.what());
+          return returnWithError(request, ErrorCode::INVALID_PARAMETER, "Cannot challenge credential: credential." + std::string(e.what()));
         }
       }
       else if (readString(elements[i]) == PARAMETER_KEY_PROOF_OF_PRIVATE_KEY) {
@@ -104,13 +105,13 @@
   }
 
   // verify the credential and the self-signed cert
-  Name signingKeyName = credential->getSignature().getKeyLocator().getName();
+  Name signingKeyName = credential.getSignature().getKeyLocator().getName();
   security::transform::PublicKey key;
-  const auto& pubKeyBuffer = credential->getPublicKey();
+  const auto& pubKeyBuffer = credential.getPublicKey();
   key.loadPkcs8(pubKeyBuffer.data(), pubKeyBuffer.size());
   for (auto anchor : m_trustAnchors) {
     if (anchor.getKeyName() == signingKeyName) {
-      if (security::verifySignature(*credential, anchor) &&
+      if (security::verifySignature(credential, anchor) &&
           security::verifySignature((uint8_t*)request.m_requestId.c_str(), request.m_requestId.size(), signature, signatureLen, key)) {
         return returnWithSuccess(request);
       }
diff --git a/tests/unit-tests/ca-module.t.cpp b/tests/unit-tests/ca-module.t.cpp
index b1e4d22..66a929b 100644
--- a/tests/unit-tests/ca-module.t.cpp
+++ b/tests/unit-tests/ca-module.t.cpp
@@ -194,17 +194,15 @@
     contentBlock.parse();
 
     // Test CA sent redirections
-    BOOST_CHECK_EQUAL(true, contentBlock.get(tlv_probe_redirect).hasValue());
-    Block probeRedirect = contentBlock.get(tlv_probe_redirect);
-    probeRedirect.parse();
-    // Test the case where we have multiple probeRedirects
-    BOOST_CHECK_EQUAL(probeRedirect.elements().size(), 2);
-    for (const auto& item : probeRedirect.elements()) {
-        Name caName;
-        caName.wireDecode(item.get(tlv::Name));
-        // TODO: Checkout the format of the name
-        BOOST_CHECK_EQUAL(caName, "/ndn/example");
+    std::vector<Name> redirectionItems;
+    for (auto item : contentBlock.elements()) {
+      if (item.type() == tlv_probe_redirect) {
+        redirectionItems.push_back(Name(item.blockFromValue()));
+      }
     }
+    BOOST_CHECK_EQUAL(redirectionItems.size(), 2);
+    BOOST_CHECK_EQUAL(security::v2::extractIdentityFromCertName(redirectionItems[0].getPrefix(-1)), "/ndn/site1");
+    BOOST_CHECK_EQUAL(security::v2::extractIdentityFromCertName(redirectionItems[1].getPrefix(-1)), "/ndn/site1");
   });
   face.receive(interest);
   advanceClocks(time::milliseconds(20), 60);
diff --git a/tests/unit-tests/challenge-credential.t.cpp b/tests/unit-tests/challenge-credential.t.cpp
index 0854155..65d3a3d 100644
--- a/tests/unit-tests/challenge-credential.t.cpp
+++ b/tests/unit-tests/challenge-credential.t.cpp
@@ -67,13 +67,14 @@
   SignatureInfo signatureInfo;
   signatureInfo.setValidityPeriod(security::ValidityPeriod(system_clock::now(), system_clock::now() + time::minutes(1)));
   m_keyChain.sign(credential, signingByCertificate(trustAnchor).setSignatureInfo(signatureInfo));
+  m_keyChain.addCertificate(keyB, credential);
 
   // using private key to sign cert request
-  std::vector<std::tuple<std::string, std::string>> params;
+  auto params = challenge.getRequestedParameterList(state.m_status, "");
   ChallengeCredential::fulfillParameters(params, m_keyChain, credential.getName(), "123");
-  Block paramsTlv = challenge.genChallengeRequestTLV(Status::BEFORE_CHALLENGE, "", std::move(params));
+  Block paramsTlv = challenge.genChallengeRequestTLV(state.m_status, "", std::move(params));
   challenge.handleChallengeRequest(paramsTlv, state);
-  BOOST_CHECK(state.m_status == Status::PENDING);
+  BOOST_CHECK_EQUAL(statusToString(state.m_status), statusToString(Status::PENDING));
 }
 
 BOOST_AUTO_TEST_SUITE_END()
