fix CHALLENGE state error

Change-Id: Ic555b6be9bceeebe9076847be9fd6f139943ef16
diff --git a/src/protocol-detail/challenge.cpp b/src/protocol-detail/challenge.cpp
index 0116923..bc53b8c 100644
--- a/src/protocol-detail/challenge.cpp
+++ b/src/protocol-detail/challenge.cpp
@@ -23,14 +23,22 @@
 namespace ndn {
 namespace ndncert {
 
+_LOG_INIT(ndncert.encoding.challenge);
+
 Block
 CHALLENGE::encodeDataPayload(const CaState& request)
 {
   Block response = makeEmptyBlock(tlv_encrypted_payload);
   response.push_back(makeNonNegativeIntegerBlock(tlv_status, static_cast<size_t>(request.m_status)));
-  response.push_back(makeStringBlock(tlv_challenge_status, request.m_challengeState->m_challengeStatus));
-  response.push_back(makeNonNegativeIntegerBlock(tlv_remaining_tries, request.m_challengeState->m_remainingTries));
-  response.push_back(makeNonNegativeIntegerBlock(tlv_remaining_time, request.m_challengeState->m_remainingTime.count()));
+  if (request.m_challengeState) {
+    response.push_back(makeStringBlock(tlv_challenge_status, request.m_challengeState->m_challengeStatus));
+    response.push_back(
+            makeNonNegativeIntegerBlock(tlv_remaining_tries, request.m_challengeState->m_remainingTries));
+    response.push_back(
+            makeNonNegativeIntegerBlock(tlv_remaining_time, request.m_challengeState->m_remainingTime.count()));
+  } else if (request.m_status != Status::SUCCESS || request.m_status != Status::FAILURE){
+      _LOG_ERROR("Unsuccessful challenge does not have a challenge state");
+  }
   response.encode();
   return response;
 }
@@ -39,17 +47,22 @@
 CHALLENGE::decodeDataPayload(const Block& data){
     data.parse();
     Status status = static_cast<Status>(readNonNegativeInteger(data.get(tlv_status)));
-    std::string challengeStatus = readString(data.get(tlv_challenge_status));
-    size_t remainingTries = readNonNegativeInteger(data.get(tlv_remaining_tries));
-    time::seconds remainingTime = time::seconds(readNonNegativeInteger(data.get(tlv_remaining_time)));
-
+    DecodedData decodedData{status, nullopt, nullopt, nullopt, nullopt};
+    if (data.find(tlv_challenge_status) != data.elements_end()) {
+      decodedData.challengeStatus = readString(data.get(tlv_challenge_status));
+    }
+    if (data.find(tlv_remaining_tries) != data.elements_end()) {
+      decodedData.remainingTries = readNonNegativeInteger(data.get(tlv_remaining_tries));
+    }
+    if (data.find(tlv_remaining_time) != data.elements_end()) {
+      decodedData.remainingTime = time::seconds(readNonNegativeInteger(data.get(tlv_remaining_time)));
+    }
     if (data.find(tlv_issued_cert_name) != data.elements_end()) {
-        Block issuedCertNameBlock = data.get(tlv_issued_cert_name);
-        issuedCertNameBlock.parse();
-        return DecodedData{status, challengeStatus, remainingTries, remainingTime, Name(issuedCertNameBlock.get(tlv::Name))};
+      Block issuedCertNameBlock = data.get(tlv_issued_cert_name);
+      decodedData.issuedCertName = Name(issuedCertNameBlock.blockFromValue());
     }
 
-    return DecodedData{status, challengeStatus, remainingTries, remainingTime, nullopt};
+    return decodedData;
 }
 
 } // namespace ndncert
diff --git a/src/protocol-detail/challenge.hpp b/src/protocol-detail/challenge.hpp
index e50d01e..42eb485 100644
--- a/src/protocol-detail/challenge.hpp
+++ b/src/protocol-detail/challenge.hpp
@@ -33,9 +33,9 @@
 
   struct DecodedData{
       Status status;
-      std::string challengeStatus;
-      size_t remainingTries;
-      time::seconds remainingTime;
+      optional<std::string> challengeStatus;
+      optional<size_t> remainingTries;
+      optional<time::seconds> remainingTime;
       optional<Name> issuedCertName;
   };