diff --git a/tools/ndnsec-key-gen.hpp b/tools/ndnsec-key-gen.hpp
index 3df9c6b..76aa69c 100644
--- a/tools/ndnsec-key-gen.hpp
+++ b/tools/ndnsec-key-gen.hpp
@@ -10,20 +10,20 @@
 
 #include "ndnsec-util.hpp"
 
-int 
-ndnsec_key_gen(int argc, char** argv)	
+int
+ndnsec_key_gen(int argc, char** argv)
 {
   using namespace ndn;
   namespace po = boost::program_options;
 
   std::string identityName;
-  bool notDefault = false;
+  bool isDefault = true;
   char keyType = 'r';
   int keySize = 2048;
   std::string outputFilename;
 
-  po::options_description desc("General Usage\n  ndnsec key-gen [-h] [-n] identity\nGeneral options");
-  desc.add_options()
+  po::options_description description("General Usage\n  ndnsec key-gen [-h] [-n] identity\nGeneral options");
+  description.add_options()
     ("help,h", "produce help message")
     ("identity,i", po::value<std::string>(&identityName), "identity name, for example, /ndn/ucla.edu/alice")
     ("not_default,n", "optional, if not specified, the target identity will be set as the default identity of the system")
@@ -33,84 +33,64 @@
 
   po::positional_options_description p;
   p.add("identity", 1);
-  
-  po::variables_map vm;
-  po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
-  po::notify(vm);
 
-  if (vm.count("help")) 
+  po::variables_map vm;
+  try
     {
-      std::cerr << desc << std::endl;
+      po::store(po::command_line_parser(argc, argv).options(description).positional(p).run(),
+                vm);
+      po::notify(vm);
+    }
+  catch (const std::exception& e)
+    {
+      std::cerr << "ERROR: " << e.what() << std::endl;
+      std::cerr << description << std::endl;
+      return 1;
+    }
+
+  if (vm.count("help") != 0)
+    {
+      std::cerr << description << std::endl;
       return 0;
     }
 
-  if (0 == vm.count("identity"))
+  if (vm.count("identity") == 0)
     {
       std::cerr << "identity must be specified" << std::endl;
-      std::cerr << desc << std::endl;
+      std::cerr << description << std::endl;
       return 1;
     }
-  
-  if (vm.count("not_default"))
-    notDefault = true;
-  
-  if (true)
-    {
-      switch(keyType)
-        {
-        case 'r':
-          {
-            shared_ptr<IdentityCertificate> idcert;
-            try
-              {
-                KeyChain keyChain;
-                
-                Name keyName = keyChain.generateRSAKeyPair(Name(identityName), true, keySize);            
-                
-                if(0 == keyName.size())
-                  {                  
-                    return 1;
-                  }
-                
-                keyChain.setDefaultKeyNameForIdentity(keyName);
-            
-                idcert = keyChain.selfSign(keyName);
-                
-                if(!notDefault)
-                  {
-                    keyChain.setDefaultIdentity(Name(identityName));
-                  }
-              }
-            catch(const SecPublicInfo::Error& e)
-              {
-                std::cerr << "ERROR: " << e.what() << std::endl;
-                return 1;
-              }
-            catch(const SecTpm::Error& e)
-              {
-                std::cerr << "ERROR: " << e.what() << std::endl;
-                return 1;
-              }
 
-            try
-              {
-                CryptoPP::StringSource ss(idcert->wireEncode().wire(), 
-                                          idcert->wireEncode().size(), 
-                                          true,
-                                          new CryptoPP::Base64Encoder(new CryptoPP::FileSink(std::cout), true, 64));
-                return 0;
-              }
-            catch(const CryptoPP::Exception& e)
-              {
-                std::cerr << "ERROR: " << e.what() << std::endl;
-                return 1;
-              }
-        }
-      default:
-        std::cerr << "Unrecongized key type" << "\n";
-        std::cerr << desc << std::endl;
-        return 1;
+  if (vm.count("not_default") != 0)
+    isDefault = false;
+
+  switch (keyType)
+    {
+    case 'r':
+      {
+        shared_ptr<IdentityCertificate> identityCert;
+
+        KeyChain keyChain;
+
+        Name keyName = keyChain.generateRSAKeyPair(Name(identityName), true, keySize);
+
+        if (0 == keyName.size())
+          return 1;
+
+        keyChain.setDefaultKeyNameForIdentity(keyName);
+
+        identityCert = keyChain.selfSign(keyName);
+
+        if (isDefault)
+          keyChain.setDefaultIdentity(Name(identityName));
+
+        io::save(*identityCert, std::cout);
+        return 0;
       }
+    default:
+      std::cerr << "Unrecongized key type" << "\n";
+      std::cerr << description << std::endl;
+      return 1;
     }
 
   return 0;
