Change credential challenge to possession

Change-Id: Ib36ef7bfe8d879e0ae117f79a1aab52062184e68
diff --git a/src/detail/challenge-encoder.cpp b/src/detail/challenge-encoder.cpp
index 023b2c1..9ab567a 100644
--- a/src/detail/challenge-encoder.cpp
+++ b/src/detail/challenge-encoder.cpp
@@ -34,6 +34,15 @@
         makeNonNegativeIntegerBlock(tlv::RemainingTries, request.challengeState->remainingTries));
     response.push_back(
         makeNonNegativeIntegerBlock(tlv::RemainingTime, request.challengeState->remainingTime.count()));
+    if (request.challengeState->challengeStatus == "need-proof") {
+      response.push_back(
+              makeStringBlock(tlv::ParameterKey, "nonce")
+              );
+      auto nonce = fromHex(request.challengeState->secrets.get("nonce", ""));
+      response.push_back(
+              makeBinaryBlock(tlv::ParameterValue, nonce->data(), 16)
+            );
+    }
   }
   if (!issuedCertName.empty()) {
     response.push_back(makeNestedBlock(tlv::IssuedCertName, issuedCertName));
@@ -65,6 +74,16 @@
     Block issuedCertNameBlock = data.get(tlv::IssuedCertName);
     state.issuedCertName = Name(issuedCertNameBlock.blockFromValue());
   }
+  if (data.find(tlv::ParameterKey) != data.elements_end() && readString(data.get(tlv::ParameterKey)) == "nonce") {
+    if (data.find(tlv::ParameterKey) == data.elements_end()) {
+        NDN_THROW(std::runtime_error("Parameter Key found, but no value found"));
+    }
+    Block nonceBlock = data.get(tlv::ParameterValue);
+    if (nonceBlock.value_size() != 16) {
+        NDN_THROW(std::runtime_error("Wrong nonce length"));
+    }
+    memcpy(state.nonce.data(), nonceBlock.value(), 16);
+  }
 }
 
 } // namespace ndncert