security: string representation for SigningInfo

Change-Id: I92b227a0d0cb89654536043f703cea9e7b40fa64
refs: #3281
diff --git a/src/security/signing-info.cpp b/src/security/signing-info.cpp
index c231cc5..283484b 100644
--- a/src/security/signing-info.cpp
+++ b/src/security/signing-info.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "signing-info.hpp"
+#include "key-chain.hpp"
 
 namespace ndn {
 namespace security {
@@ -37,6 +38,41 @@
 {
 }
 
+SigningInfo::SigningInfo(const std::string& signingStr)
+{
+  if (signingStr.empty()) {
+    *this = SigningInfo();
+    return;
+  }
+
+  size_t pos = signingStr.find(':');
+
+  if (pos == std::string::npos) {
+    BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid signing string cannot represent SigningInfo"));
+  }
+
+  std::string scheme = signingStr.substr(0, pos);
+  std::string nameArg = signingStr.substr(pos + 1);
+
+  if (scheme == "id") {
+    if (nameArg == KeyChain::DIGEST_SHA256_IDENTITY.toUri()) {
+      setSha256Signing();
+    }
+    else {
+      setSigningIdentity(nameArg);
+    }
+  }
+  else if (scheme == "key") {
+    setSigningKeyName(nameArg);
+  }
+  else if (scheme == "cert") {
+    setSigningCertName(nameArg);
+  }
+  else {
+    BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid signing string scheme"));
+  }
+}
+
 void
 SigningInfo::setSigningIdentity(const Name& identity)
 {
@@ -70,5 +106,31 @@
   m_info = signatureInfo;
 }
 
-} // namespace ndn
+std::ostream&
+operator<<(std::ostream& os, const SigningInfo& si)
+{
+  switch (si.getSignerType()) {
+    case SigningInfo::SIGNER_TYPE_NULL:
+      return os;
+    case SigningInfo::SIGNER_TYPE_ID:
+      os << "id:";
+      break;
+    case SigningInfo::SIGNER_TYPE_KEY:
+      os << "key:";
+      break;
+    case SigningInfo::SIGNER_TYPE_CERT:
+      os << "cert:";
+      break;
+    case SigningInfo::SIGNER_TYPE_SHA256:
+      os << "id:" << KeyChain::DIGEST_SHA256_IDENTITY;
+      return os;
+    default:
+      BOOST_THROW_EXCEPTION(std::invalid_argument("Unknown signer type"));
+  }
+
+  os << si.getSignerName();
+  return os;
+}
+
 } // namespace security
+} // namespace ndn