diff --git a/src/encoding/tlv.hpp b/src/encoding/tlv.hpp
index e56695c..9d70ee6 100644
--- a/src/encoding/tlv.hpp
+++ b/src/encoding/tlv.hpp
@@ -75,17 +75,21 @@
   AppPrivateBlock2 = 32767
 };
 
-enum SignatureType {
+enum SignatureTypeValue {
   DigestSha256 = 0,
-  SignatureSha256WithRsa = 1
+  SignatureSha256WithRsa = 1,
+  SignatureSha256WithEcdsa = 3
 };
 
-enum ConentType {
+enum ContentTypeValue {
   ContentType_Default = 0,
   ContentType_Link = 1,
   ContentType_Key = 2
 };
 
+/// @deprecated use ContentType instead
+typedef ContentTypeValue ConentType;
+
 /**
  * @brief Read VAR-NUMBER in NDN-TLV encoding
  *
diff --git a/src/security/signature-sha256-with-ecdsa.hpp b/src/security/signature-sha256-with-ecdsa.hpp
new file mode 100644
index 0000000..84cbe51
--- /dev/null
+++ b/src/security/signature-sha256-with-ecdsa.hpp
@@ -0,0 +1,61 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#ifndef NDN_SECURITY_SIGNATURE_SHA256_WITH_ECDSA_HPP
+#define NDN_SECURITY_SIGNATURE_SHA256_WITH_ECDSA_HPP
+
+#include "signature-with-public-key.hpp"
+
+namespace ndn {
+
+/**
+ * represents a Sha256WithEcdsa signature.
+ */
+class SignatureSha256WithEcdsa : public SignatureWithPublicKey
+{
+public:
+  class Error : public SignatureWithPublicKey::Error
+  {
+  public:
+    explicit
+    Error(const std::string& what)
+      : SignatureWithPublicKey::Error(what)
+    {
+    }
+  };
+
+  SignatureSha256WithEcdsa()
+    : SignatureWithPublicKey(Tlv::SignatureSha256WithEcdsa)
+  {
+  }
+
+  explicit
+  SignatureSha256WithEcdsa(const Signature& signature)
+    : SignatureWithPublicKey(signature)
+  {
+    if (getType() != Signature::Sha256WithEcdsa)
+      throw Error("Incorrect signature type");
+  }
+};
+
+} // namespace ndn
+
+#endif //NDN_SECURITY_SIGNATURE_SHA256_WITH_ECDSA_HPP
diff --git a/src/security/signature-sha256-with-rsa.hpp b/src/security/signature-sha256-with-rsa.hpp
index 8acda6e..bd3fd32 100644
--- a/src/security/signature-sha256-with-rsa.hpp
+++ b/src/security/signature-sha256-with-rsa.hpp
@@ -22,67 +22,38 @@
 #ifndef NDN_SECURITY_SIGNATURE_SHA256_WITH_RSA_HPP
 #define NDN_SECURITY_SIGNATURE_SHA256_WITH_RSA_HPP
 
-#include "../data.hpp"
-#include "../encoding/tlv.hpp"
+#include "signature-with-public-key.hpp"
 
 namespace ndn {
 
 /**
- * Representing of SHA256-with-RSA signature in a data packet.
+ * Represent a SHA256-with-RSA signature.
  */
-class SignatureSha256WithRsa : public Signature
+class SignatureSha256WithRsa : public SignatureWithPublicKey
 {
 public:
-  class Error : public Signature::Error
+  class Error : public SignatureWithPublicKey::Error
   {
   public:
     explicit
     Error(const std::string& what)
-      : Signature::Error(what)
+      : SignatureWithPublicKey::Error(what)
     {
     }
   };
 
   SignatureSha256WithRsa()
+    : SignatureWithPublicKey(Tlv::SignatureSha256WithRsa)
   {
-    m_info = Block(Tlv::SignatureInfo);
-
-    m_type = Signature::Sha256WithRsa;
-    m_info.push_back(nonNegativeIntegerBlock(Tlv::SignatureType, Tlv::SignatureSha256WithRsa));
-    m_info.push_back(m_keyLocator.wireEncode());
   }
 
+  explicit
   SignatureSha256WithRsa(const Signature& signature)
-    : Signature(signature)
+    : SignatureWithPublicKey(signature)
   {
     if (getType() != Signature::Sha256WithRsa)
       throw Error("Incorrect signature type");
-
-    m_info.parse();
-    Block::element_const_iterator i = m_info.find(Tlv::KeyLocator);
-    if (i != m_info.elements_end())
-      {
-        m_keyLocator.wireDecode(*i);
-      }
   }
-
-  const KeyLocator&
-  getKeyLocator() const
-  {
-    return m_keyLocator;
-  }
-
-  void
-  setKeyLocator(const KeyLocator& keyLocator)
-  {
-    m_keyLocator = keyLocator;
-
-    m_info.remove(ndn::Tlv::KeyLocator);
-    m_info.push_back(m_keyLocator.wireEncode());
-  }
-
-private:
-  KeyLocator m_keyLocator;
 };
 
 } // namespace ndn
diff --git a/src/security/signature-with-public-key.hpp b/src/security/signature-with-public-key.hpp
new file mode 100644
index 0000000..abaa85a
--- /dev/null
+++ b/src/security/signature-with-public-key.hpp
@@ -0,0 +1,89 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#ifndef NDN_SECURITY_SIGNATURE_WITH_PUBLIC_KEY_HPP
+#define NDN_SECURITY_SIGNATURE_WITH_PUBLIC_KEY_HPP
+
+#include "../data.hpp"
+#include "../encoding/tlv.hpp"
+
+namespace ndn {
+
+/**
+ * Base class of public key signature.
+ */
+class SignatureWithPublicKey : public Signature
+{
+public:
+  class Error : public Signature::Error
+  {
+  public:
+    explicit
+    Error(const std::string& what)
+      : Signature::Error(what)
+    {
+    }
+  };
+
+  explicit
+  SignatureWithPublicKey(const Tlv::SignatureTypeValue& signatureType)
+  {
+    m_info = Block(Tlv::SignatureInfo);
+
+    m_type = signatureType;
+    m_info.push_back(nonNegativeIntegerBlock(Tlv::SignatureType, signatureType));
+    m_info.push_back(m_keyLocator.wireEncode());
+  }
+
+  explicit
+  SignatureWithPublicKey(const Signature& signature)
+    : Signature(signature)
+  {
+    m_info.parse();
+    Block::element_const_iterator i = m_info.find(Tlv::KeyLocator);
+    if (i != m_info.elements_end())
+      {
+        m_keyLocator.wireDecode(*i);
+      }
+  }
+
+  const KeyLocator&
+  getKeyLocator() const
+  {
+    return m_keyLocator;
+  }
+
+  void
+  setKeyLocator(const KeyLocator& keyLocator)
+  {
+    m_keyLocator = keyLocator;
+
+    m_info.remove(ndn::Tlv::KeyLocator);
+    m_info.push_back(m_keyLocator.wireEncode());
+  }
+
+private:
+  KeyLocator m_keyLocator;
+};
+
+} // namespace ndn
+
+#endif //NDN_SECURITY_SIGNATURE_WITH_PUBLIC_KEY_HPP
diff --git a/src/signature.hpp b/src/signature.hpp
index d678c8e..3546c4c 100644
--- a/src/signature.hpp
+++ b/src/signature.hpp
@@ -22,6 +22,8 @@
 #ifndef NDN_SIGNATURE_HPP
 #define NDN_SIGNATURE_HPP
 
+#include "encoding/tlv.hpp"
+
 namespace ndn {
 
 /**
@@ -41,8 +43,9 @@
   };
 
   enum {
-    Sha256 = 0,
-    Sha256WithRsa = 1
+    Sha256 = Tlv::DigestSha256,
+    Sha256WithRsa = Tlv::SignatureSha256WithRsa,
+    Sha256WithEcdsa = Tlv::SignatureSha256WithEcdsa
   };
 
   Signature()
diff --git a/tests/unit-tests/security/test-signature-sha256-ecdsa.cpp b/tests/unit-tests/security/test-signature-sha256-ecdsa.cpp
new file mode 100644
index 0000000..bcf01be
--- /dev/null
+++ b/tests/unit-tests/security/test-signature-sha256-ecdsa.cpp
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#include "security/signature-sha256-with-ecdsa.hpp"
+
+#include "boost-test.hpp"
+
+namespace ndn {
+
+BOOST_AUTO_TEST_SUITE(SecurityTestSignatureSha256WithEcdsa)
+
+const uint8_t sigInfo[] = {
+0x16, 0x1b, // SignatureInfo
+  0x1b, 0x01, // SignatureType
+    0x03,
+  0x1c, 0x16, // KeyLocator
+    0x07, 0x14, // Name
+      0x08, 0x04,
+        0x74, 0x65, 0x73, 0x74,
+      0x08, 0x03,
+        0x6b, 0x65, 0x79,
+      0x08, 0x07,
+        0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
+};
+
+const uint8_t sigValue[] = {
+0x17, 0x40, // SignatureValue
+  0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+  0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+  0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+  0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+  0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b
+};
+
+
+BOOST_AUTO_TEST_CASE(Decoding)
+{
+  Block sigInfoBlock(sigInfo, sizeof(sigInfo));
+  Block sigValueBlock(sigValue, sizeof(sigValue));
+
+  Signature sig(sigInfoBlock, sigValueBlock);
+  BOOST_REQUIRE_NO_THROW(SignatureSha256WithEcdsa(sig));
+}
+
+BOOST_AUTO_TEST_CASE(Encoding)
+{
+  SignatureSha256WithEcdsa sig;
+
+  Name name("/test/key/locator");
+  KeyLocator keyLocator(name);
+
+  sig.setKeyLocator(keyLocator);
+
+  const Block& encodeSigInfoBlock = sig.getInfo();
+
+  Block sigInfoBlock(sigInfo, sizeof(sigInfo));
+
+  BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(),
+                                sigInfoBlock.wire() + sigInfoBlock.size(),
+                                encodeSigInfoBlock.wire(),
+                                encodeSigInfoBlock.wire() + encodeSigInfoBlock.size());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace ndn
diff --git a/tests/unit-tests/security/test-signature-sha256-rsa.cpp b/tests/unit-tests/security/test-signature-sha256-rsa.cpp
new file mode 100644
index 0000000..e1ea73c
--- /dev/null
+++ b/tests/unit-tests/security/test-signature-sha256-rsa.cpp
@@ -0,0 +1,89 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#include "security/signature-sha256-with-rsa.hpp"
+
+#include "boost-test.hpp"
+
+namespace ndn {
+
+BOOST_AUTO_TEST_SUITE(SecurityTestSignatureSha256WithRsa)
+
+const uint8_t sigInfo[] = {
+0x16, 0x1b, // SignatureInfo
+  0x1b, 0x01, // SignatureType
+    0x01,
+  0x1c, 0x16, // KeyLocator
+    0x07, 0x14, // Name
+      0x08, 0x04,
+        0x74, 0x65, 0x73, 0x74,
+      0x08, 0x03,
+        0x6b, 0x65, 0x79,
+      0x08, 0x07,
+        0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72
+};
+
+const uint8_t sigValue[] = {
+0x17, 0x80, // SignatureValue
+  0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+  0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+  0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+  0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+  0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+  0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+  0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+  0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+  0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+  0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
+};
+
+
+BOOST_AUTO_TEST_CASE(Decoding)
+{
+  Block sigInfoBlock(sigInfo, sizeof(sigInfo));
+  Block sigValueBlock(sigValue, sizeof(sigValue));
+
+  Signature sig(sigInfoBlock, sigValueBlock);
+  BOOST_REQUIRE_NO_THROW(SignatureSha256WithRsa(sig));
+}
+
+BOOST_AUTO_TEST_CASE(Encoding)
+{
+  SignatureSha256WithRsa sig;
+
+  Name name("/test/key/locator");
+  KeyLocator keyLocator(name);
+
+  sig.setKeyLocator(keyLocator);
+
+  const Block& encodeSigInfoBlock = sig.getInfo();
+
+  Block sigInfoBlock(sigInfo, sizeof(sigInfo));
+
+  BOOST_CHECK_EQUAL_COLLECTIONS(sigInfoBlock.wire(),
+                                sigInfoBlock.wire() + sigInfoBlock.size(),
+                                encodeSigInfoBlock.wire(),
+                                encodeSigInfoBlock.wire() + encodeSigInfoBlock.size());
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace ndn
