Implement encoding/decoding SignedInfo content Type.
diff --git a/ndn-cpp/c/encoding/binary-xml-data.c b/ndn-cpp/c/encoding/binary-xml-data.c
index 4b75fd8..7dd3983 100644
--- a/ndn-cpp/c/encoding/binary-xml-data.c
+++ b/ndn-cpp/c/encoding/binary-xml-data.c
@@ -73,9 +73,26 @@
       (encoder, ndn_BinaryXml_DTag_Timestamp, signedInfo->timestampMilliseconds)))
     return error;
   
-  if (signedInfo->type != ndn_ContentType_DATA) {
+  if (!(signedInfo->type < 0 || signedInfo->type == ndn_ContentType_DATA)) {
     // Not the default of DATA, so we need to encode the type.
-    // TODO: Implement converting the type from an int and encoding.
+    unsigned char *typeBytes;
+    unsigned int typeBytesLength = 3;
+    if (signedInfo->type == ndn_ContentType_ENCR)
+      typeBytes = "\x10\xD0\x91";
+    else if (signedInfo->type == ndn_ContentType_GONE)
+      typeBytes = "\x18\xE3\x44";
+    else if (signedInfo->type == ndn_ContentType_KEY)
+      typeBytes = "\x28\x46\x3F";
+    else if (signedInfo->type == ndn_ContentType_LINK)
+      typeBytes = "\x2C\x83\x4A";
+    else if (signedInfo->type == ndn_ContentType_NACK)
+      typeBytes = "\x34\x00\x8A";
+    else
+      return NDN_ERROR_unrecognized_ndn_ContentType;
+
+    if ((error = ndn_BinaryXmlEncoder_writeBlobDTagElement
+        (encoder, ndn_BinaryXml_DTag_Type, typeBytes, typeBytesLength)))
+      return error;
   }
   
   if ((error = ndn_BinaryXmlEncoder_writeOptionalUnsignedDecimalIntDTagElement
@@ -109,8 +126,33 @@
       (decoder, ndn_BinaryXml_DTag_Timestamp, &signedInfo->timestampMilliseconds))
     return error;
   
-  // TODO: Implement reading the type and converting to an int.
-  signedInfo->type = ndn_ContentType_DATA;
+  unsigned char *typeBytes;
+  unsigned int typeBytesLength;
+  if ((error = ndn_BinaryXmlDecoder_readOptionalBinaryDTagElement
+      (decoder, ndn_BinaryXml_DTag_Type, 0, &typeBytes, &typeBytesLength)))
+    return error;
+  if (typeBytesLength == 0)
+    // The default Type is DATA.
+    signedInfo->type = ndn_ContentType_DATA;
+  else if (typeBytesLength == 3) {
+    // All the recognized content types are 3 bytes.
+    if (ndn_memcmp(typeBytes, "\x0C\x04\xC0", typeBytesLength) == 0)
+      signedInfo->type = ndn_ContentType_DATA;
+    else if (ndn_memcmp(typeBytes, "\x10\xD0\x91", typeBytesLength) == 0)
+      signedInfo->type = ndn_ContentType_ENCR;
+    else if (ndn_memcmp(typeBytes, "\x18\xE3\x44", typeBytesLength) == 0)
+      signedInfo->type = ndn_ContentType_GONE;
+    else if (ndn_memcmp(typeBytes, "\x28\x46\x3F", typeBytesLength) == 0)
+      signedInfo->type = ndn_ContentType_KEY;
+    else if (ndn_memcmp(typeBytes, "\x2C\x83\x4A", typeBytesLength) == 0)
+      signedInfo->type = ndn_ContentType_LINK;
+    else if (ndn_memcmp(typeBytes, "\x34\x00\x8A", typeBytesLength) == 0)
+      signedInfo->type = ndn_ContentType_NACK;
+    else
+      return NDN_ERROR_unrecognized_ndn_ContentType;
+  }
+  else
+    return NDN_ERROR_unrecognized_ndn_ContentType;
  
   if ((error = ndn_BinaryXmlDecoder_readOptionalUnsignedIntegerDTagElement
       (decoder, ndn_BinaryXml_DTag_FreshnessSeconds, &signedInfo->freshnessSeconds)))