diff --git a/src/challenge-module/challenge-credential.cpp b/src/challenge-module/challenge-credential.cpp
new file mode 100644
index 0000000..0e5a053
--- /dev/null
+++ b/src/challenge-module/challenge-credential.cpp
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2017, Regents of the University of California.
+ *
+ * This file is part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#include "challenge-credential.hpp"
+#include "../logging.hpp"
+#include <ndn-cxx/security/verification-helpers.hpp>
+#include <ndn-cxx/util/io.hpp>
+
+namespace ndn {
+namespace ndncert {
+
+_LOG_INIT(ndncert.ChallengeCredential);
+
+NDNCERT_REGISTER_CHALLENGE(ChallengeCredential, "Credential");
+
+const std::string ChallengeCredential::FAILURE_INVALID_FORMAT = "failure-invalid-format";
+const std::string ChallengeCredential::FAILURE_INVALID_CREDENTIAL = "failure-invalid-credential";
+
+const std::string ChallengeCredential::JSON_CREDENTIAL = "signed-cert";
+
+ChallengeCredential::ChallengeCredential(const std::string& configPath)
+  : ChallengeModule("CREDENTIAL")
+  , m_configFile(configPath)
+{
+  parseConfigFile();
+}
+
+void
+ChallengeCredential::parseConfigFile()
+{
+  JsonSection config;
+  try {
+    boost::property_tree::read_json(m_configFile, config);
+  }
+  catch (const boost::property_tree::info_parser_error& error) {
+    BOOST_THROW_EXCEPTION(Error("Failed to parse configuration file " + m_configFile +
+                                " " + error.message() + " line " + std::to_string(error.line())));
+  }
+
+  if (config.begin() == config.end()) {
+    BOOST_THROW_EXCEPTION(Error("Error processing configuration file: " + m_configFile + " no data"));
+  }
+
+  m_trustAnchors.clear();
+  auto anchorList = config.get_child("anchor-list");
+  auto it = anchorList.begin();
+  for (; it != anchorList.end(); it++) {
+    std::istringstream ss(it->second.get<std::string>("certificate"));
+    security::v2::Certificate cert = *(io::load<security::v2::Certificate>(ss));
+    m_trustAnchors.push_back(cert);
+  }
+}
+
+JsonSection
+ChallengeCredential::processSelectInterest(const Interest& interest, CertificateRequest& request)
+{
+  // interest format: /caName/CA/_SELECT/{"request-id":"id"}/CREDENTIAL/{"credential":"..."}/<signature>
+  request.setChallengeType(CHALLENGE_TYPE);
+  JsonSection credentialJson = getJsonFromNameComponent(interest.getName(),
+                                                        request.getCaName().size() + 4);
+  std::istringstream ss(credentialJson.get<std::string>(JSON_CREDENTIAL));
+
+  security::v2::Certificate credential;
+  try {
+    credential = *(io::load<security::v2::Certificate>(ss));
+  }
+  catch (const std::exception& e) {
+    _LOG_TRACE("Cannot load credential parameter" << e.what());
+    request.setStatus(FAILURE_INVALID_FORMAT);
+    return genResponseChallengeJson(request.getRequestId(), CHALLENGE_TYPE, FAILURE_INVALID_FORMAT);
+  }
+
+  if (credential.getContent() != request.getCert().getContent()
+      || credential.getKeyName() != request.getCert().getKeyName()) {
+    request.setStatus(FAILURE_INVALID_CREDENTIAL);
+    return genResponseChallengeJson(request.getRequestId(), CHALLENGE_TYPE, FAILURE_INVALID_CREDENTIAL);
+  }
+  Name signingKeyName = credential.getSignature().getKeyLocator().getName();
+
+  for (auto anchor : m_trustAnchors) {
+    if (anchor.getKeyName() == signingKeyName) {
+      if (security::verifySignature(credential, anchor)) {
+        request.setStatus(SUCCESS);
+        return genResponseChallengeJson(request.getRequestId(), CHALLENGE_TYPE, SUCCESS);
+      }
+    }
+  }
+  request.setStatus(FAILURE_INVALID_CREDENTIAL);
+  return genResponseChallengeJson(request.getRequestId(), CHALLENGE_TYPE, FAILURE_INVALID_CREDENTIAL);
+}
+
+JsonSection
+ChallengeCredential::processValidateInterest(const Interest& interest, CertificateRequest& request)
+{
+  // there is no validate request here, do nothing
+  return genResponseChallengeJson(request.getRequestId(), CHALLENGE_TYPE, FAILURE_INVALID_FORMAT);
+}
+
+std::list<std::string>
+ChallengeCredential::getSelectRequirements()
+{
+  std::list<std::string> result;
+  result.push_back("Please input the bytes of a same key certificate signed by trust anchor");
+  return result;
+}
+
+std::list<std::string>
+ChallengeCredential::getValidateRequirements(const std::string& status)
+{
+  // there is no validate request here, do nothing
+  std::list<std::string> result;
+  return result;
+}
+
+JsonSection
+ChallengeCredential::doGenSelectParamsJson(const std::string& status,
+                                           const std::list<std::string>& paramList)
+{
+  JsonSection result;
+  BOOST_ASSERT(status == WAIT_SELECTION);
+  BOOST_ASSERT(paramList.size() == 1);
+  result.put(JSON_CREDENTIAL, paramList.front());
+  return result;
+}
+
+JsonSection
+ChallengeCredential::doGenValidateParamsJson(const std::string& status,
+                                             const std::list<std::string>& paramList)
+{
+  JsonSection result;
+  BOOST_ASSERT(paramList.size() == 0);
+  return result;
+}
+
+} // namespace ndncert
+} // namespace ndn
diff --git a/src/challenge-module/challenge-credential.hpp b/src/challenge-module/challenge-credential.hpp
new file mode 100644
index 0000000..07f4b88
--- /dev/null
+++ b/src/challenge-module/challenge-credential.hpp
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2017, Regents of the University of California.
+ *
+ * This file is part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#ifndef NDNCERT_CHALLENGE_CREDENTIAL_HPP
+#define NDNCERT_CHALLENGE_CREDENTIAL_HPP
+
+#include "../challenge-module.hpp"
+
+namespace ndn {
+namespace ndncert {
+
+/**
+ * @brief Provide Credential based challenge
+ *
+ * Credential here means the certificate issued by a trust anchor. Once the requester
+ * could proof his/her possession of an existing certificate from other certificate, th
+ * requester could finish the challenge.
+ *
+ * The main process of this challenge module is:
+ *   1. Requester provides a certificate signed by that trusted certificate as credential.
+ *   2. The challenge module will verify the signature of the credential.
+ *
+ * There are several challenge status in EMAIL challenge:
+ *   FAILURE_INVALID_SIG: When the credential cannot be validated.
+ */
+class ChallengeCredential : public ChallengeModule
+{
+public:
+  ChallengeCredential(const std::string& configPath = "challenge-credential.conf");
+
+PUBLIC_WITH_TESTS_ELSE_PROTECTED:
+  JsonSection
+  processSelectInterest(const Interest& interest, CertificateRequest& request) override;
+
+  JsonSection
+  processValidateInterest(const Interest& interest, CertificateRequest& request) override;
+
+  std::list<std::string>
+  getSelectRequirements() override;
+
+  std::list<std::string>
+  getValidateRequirements(const std::string& status) override;
+
+  JsonSection
+  doGenSelectParamsJson(const std::string& status,
+                        const std::list<std::string>& paramList) override;
+
+  JsonSection
+  doGenValidateParamsJson(const std::string& status,
+                          const std::list<std::string>& paramList) override;
+
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
+  void
+  parseConfigFile();
+
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
+  static const std::string FAILURE_INVALID_CREDENTIAL;
+  static const std::string FAILURE_INVALID_FORMAT;
+  static const std::string JSON_CREDENTIAL;
+
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
+  std::list<security::v2::Certificate> m_trustAnchors;
+  std::string m_configFile;
+};
+
+} // namespace ndncert
+} // namespace ndn
+
+#endif // NDNCERT_CHALLENGE_CREDENTIAL_HPP
diff --git a/src/challenge-module/challenge-email.cpp b/src/challenge-module/challenge-email.cpp
index 59f471d..036ccd2 100644
--- a/src/challenge-module/challenge-email.cpp
+++ b/src/challenge-module/challenge-email.cpp
@@ -139,6 +139,7 @@
                                       const std::list<std::string>& paramList)
 {
   JsonSection result;
+  BOOST_ASSERT(status == WAIT_SELECTION);
   BOOST_ASSERT(paramList.size() == 1);
   result.put(JSON_EMAIL, paramList.front());
   return result;
diff --git a/src/challenge-module/challenge-pin.cpp b/src/challenge-module/challenge-pin.cpp
index 8507bcf..94ea3e7 100644
--- a/src/challenge-module/challenge-pin.cpp
+++ b/src/challenge-module/challenge-pin.cpp
@@ -124,6 +124,7 @@
                                     const std::list<std::string>& paramList)
 {
   JsonSection result;
+  BOOST_ASSERT(status == WAIT_SELECTION);
   BOOST_ASSERT(paramList.size() == 0);
   return result;
 }
