Adding KeyChainFactory (#4)

- Adding KeyChainUtils
- Version bump
- Changed class name to Factory from Utils
diff --git a/pom.xml b/pom.xml
index 19093d7..f34b4b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
 
   <groupId>com.intel.jndn.utils</groupId>
   <artifactId>jndn-utils</artifactId>
-  <version>1.1.0</version>
+  <version>1.1.1</version>
   <name>jndn-utils</name>
   <description>Collection of tools to simplify synchronous and asynchronous data transfer over the NDN network
   </description>
diff --git a/src/main/java/com/intel/jndn/utils/impl/KeyChainFactory.java b/src/main/java/com/intel/jndn/utils/impl/KeyChainFactory.java
new file mode 100644
index 0000000..d8fdc59
--- /dev/null
+++ b/src/main/java/com/intel/jndn/utils/impl/KeyChainFactory.java
@@ -0,0 +1,106 @@
+/*

+ * ******************************************************************************

+ *

+ * INTEL CONFIDENTIAL

+ *

+ * Copyright 2013 - 2016 Intel Corporation All Rights Reserved.

+ *

+ * The source code contained or described herein and all documents related to

+ * the source code ("Material") are owned by Intel Corporation or its suppliers

+ * or licensors. Title to the Material remains with Intel Corporation or its

+ * suppliers and licensors. The Material contains trade secrets and proprietary

+ * and confidential information of Intel or its suppliers and licensors. The

+ * Material is protected by worldwide copyright and trade secret laws and treaty

+ * provisions. No part of the Material may be used, copied, reproduced,

+ * modified, published, uploaded, posted, transmitted, distributed, or disclosed

+ * in any way without Intel's prior express written permission.

+ *

+ * No license under any patent, copyright, trade secret or other intellectual

+ * property right is granted to or conferred upon you by disclosure or delivery

+ * of the Materials, either expressly, by implication, inducement, estoppel or

+ * otherwise. Any license under such intellectual property rights must be

+ * express and approved by Intel in writing.

+ *

+ * Unless otherwise agreed by Intel in writing, you may not remove or alter this

+ * notice or any other notice embedded in Materials by Intel or Intel's

+ * suppliers or licensors in any way.

+ *

+ * ******************************************************************************

+ */

+

+package com.intel.jndn.utils.impl;

+

+import net.named_data.jndn.Name;

+import net.named_data.jndn.security.KeyChain;

+import net.named_data.jndn.security.certificate.IdentityCertificate;

+import net.named_data.jndn.security.identity.BasicIdentityStorage;

+import net.named_data.jndn.security.identity.FilePrivateKeyStorage;

+import net.named_data.jndn.security.identity.IdentityManager;

+import net.named_data.jndn.security.identity.IdentityStorage;

+import net.named_data.jndn.security.identity.MemoryIdentityStorage;

+import net.named_data.jndn.security.identity.MemoryPrivateKeyStorage;

+import net.named_data.jndn.security.identity.PrivateKeyStorage;

+import net.named_data.jndn.security.policy.SelfVerifyPolicyManager;

+

+/**

+ * Utility class for creating NDN key chains necessary for signing packets.

+ *

+ * @author Andrew Brown, andrew.brown@intel.com

+ */

+public class KeyChainFactory {

+    /**

+     * Build and configure an NDN {@link KeyChain} from the file system; looks in the ~/.ndn folder for keys and

+     * identity SQLite DB.

+     *

+     * @param deviceName the identity of the device; this identity will be created if it does not exist

+     * @return a configured {@link KeyChain}

+     * @throws net.named_data.jndn.security.SecurityException if key chain creation fails

+     */

+    public static KeyChain configureKeyChain(Name deviceName) throws net.named_data.jndn.security.SecurityException {

+        // access key chain in ~/.ndn; creates if necessary

+        PrivateKeyStorage keyStorage = new FilePrivateKeyStorage();

+        IdentityStorage identityStorage = new BasicIdentityStorage();

+        KeyChain keyChain = new KeyChain(new IdentityManager(identityStorage, keyStorage),

+                new SelfVerifyPolicyManager(identityStorage));

+

+        // create keys, certs if necessary

+        if (!identityStorage.doesIdentityExist(deviceName)) {

+            Name certificateName = keyChain.createIdentityAndCertificate(deviceName);

+            Name keyName = IdentityCertificate.certificateNameToPublicKeyName(certificateName);

+            keyChain.setDefaultKeyForIdentity(keyName);

+        }

+

+        // set default identity

+        keyChain.getIdentityManager().setDefaultIdentity(deviceName);

+

+        return keyChain;

+    }

+

+    /**

+     * Retrieve an in-memory test key chain. Similar to {@link #configureKeyChain(Name)} but does not interact with

+     * file system; use this for testing.

+     *

+     * @param name the identity of the device; will be created because the key chain is in memory

+     * @return a configured {@link KeyChain} with the created identity as default.

+     * @throws net.named_data.jndn.security.SecurityException if key chain creation fails

+     */

+    public static KeyChain configureTestKeyChain(Name name) throws net.named_data.jndn.security.SecurityException {

+        // access key chain in ~/.ndn; create if necessary

+        PrivateKeyStorage keyStorage = new MemoryPrivateKeyStorage();

+        IdentityStorage identityStorage = new MemoryIdentityStorage();

+        KeyChain keyChain = new KeyChain(new IdentityManager(identityStorage, keyStorage),

+                new SelfVerifyPolicyManager(identityStorage));

+

+        // create keys, certs if necessary

+        if (!identityStorage.doesIdentityExist(name)) {

+            Name certName = keyChain.createIdentityAndCertificate(name);

+            Name keyName = IdentityCertificate.certificateNameToPublicKeyName(certName);

+            keyChain.setDefaultKeyForIdentity(keyName, name);

+        }

+

+        // set default identity

+        keyChain.getIdentityManager().setDefaultIdentity(name);

+

+        return keyChain;

+    }

+}
\ No newline at end of file