security: Implement IdentityCertificate.
diff --git a/ndn-cpp/security/certificate/identity-certificate.cpp b/ndn-cpp/security/certificate/identity-certificate.cpp
new file mode 100644
index 0000000..72e9531
--- /dev/null
+++ b/ndn-cpp/security/certificate/identity-certificate.cpp
@@ -0,0 +1,68 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#include <ndn-cpp/security/security-exception.hpp>
+#include <ndn-cpp/security/certificate/identity-certificate.hpp>
+
+using namespace std;
+
+namespace ndn {
+
+IdentityCertificate::IdentityCertificate(const Data& data)
+ : Certificate(data)
+{
+ if (!isCorrectName(data.getName()))
+ throw SecurityException("Wrong Identity Certificate Name!");
+}
+
+bool
+IdentityCertificate::isCorrectName(const Name& name)
+{
+ int i = name.size() - 1;
+
+ for (; i >= 0; i--) {
+ if(name.get(i).toEscapedString() == string("ID-CERT"))
+ break;
+ }
+
+ if (i < 0)
+ return false;
+
+ return true;
+}
+
+Data&
+IdentityCertificate::setName(const Name& name)
+{
+ if (!isCorrectName(name))
+ throw SecurityException("Wrong Identity Certificate Name!");
+
+ Data::setName(name);
+ return *this;
+}
+
+Name
+IdentityCertificate::getPublicKeyName() const
+{
+ const Name& certificateName = getName();
+ int i = certificateName.size() - 1;
+
+ for (; i >= 0; i--)
+ if(certificateName.get(i).toEscapedString() == string("ID-CERT"))
+ break;
+
+ return certificateName.getSubName(0, i);
+}
+
+bool
+IdentityCertificate::isIdentityCertificate(const Certificate& certificate)
+{
+ return isCorrectName(certificate.getName());
+}
+
+}