/* * A CCNx library test. * * Copyright (C) 2010-2012 Palo Alto Research Center, Inc. * * This work is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2 as published by the * Free Software Foundation. * This work 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 General Public License * for more details. You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.ccnx.ccn.test.impl.security.keys; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import junit.framework.Assert; import org.ccnx.ccn.impl.security.keys.SecureKeyCache; import org.ccnx.ccn.impl.support.DataUtils; import org.ccnx.ccn.impl.support.Log; import org.ccnx.ccn.io.content.WrappedKey; import org.ccnx.ccn.protocol.ContentName; import org.ccnx.ccn.protocol.PublisherPublicKeyDigest; import org.junit.BeforeClass; import org.junit.AfterClass; import org.junit.Test; /** * Tests saving a SecureKeyCache to disk */ public class MergeSecureKeyCacheTestRepo { static KeyPair pair2 = null; static KeyPair myPair2 = null; static Key key2 = null; static KeyPair pair1 = null; static KeyPair myPair1 = null; static Key key1 = null; static SecureKeyCache cache1 = null; static SecureKeyCache cache2 = null; static byte[] pubIdentifier2 = null; static byte[] myPubIdentifier2 = null; static byte[] keyIdentifier2 = null; static ContentName keyName2 = null; static ContentName privateKeyName2 = null; static byte[] pubIdentifier1 = null; static byte[] myPubIdentifier1 = null; static byte[] keyIdentifier1 = null; static ContentName keyName1 = null; static ContentName privateKeyName1 = null; static KeyPairGenerator kpg = null; @BeforeClass public static void setUpBeforeClass() throws Exception { kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(512); } @Test public void testDisjointMerge() throws Exception { Log.info(Log.FAC_TEST, "Starting testDisjointMerge"); populateCache1(); populateCache2(); byte[] origKey1 = pair1.getPrivate().getEncoded(); byte[] origMyKey1 = myPair1.getPrivate().getEncoded(); byte[] origSymKey1 = key1.getEncoded(); byte[] origKey2 = pair2.getPrivate().getEncoded(); byte[] origMyKey2 = myPair2.getPrivate().getEncoded(); byte[] origSymKey2 = key2.getEncoded(); cache1.merge(cache2); // check contents Assert.assertTrue(cache1.size() == 6); Assert.assertTrue(cache1.getPrivateKeys().length == 4); Assert.assertTrue(cache1.containsKey(keyName1)); Assert.assertTrue(cache1.containsKey(privateKeyName1)); Assert.assertTrue(cache1.containsKey(keyName2)); Assert.assertTrue(cache1.containsKey(privateKeyName2)); Assert.assertFalse(cache1.containsKey(ContentName.fromNative("/nothere"))); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(myPubIdentifier1).getEncoded(), origMyKey1) == 0); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(pubIdentifier1).getEncoded(), origKey1) == 0); Assert.assertTrue(DataUtils.compare(cache1.getKey(keyIdentifier1).getEncoded(), origSymKey1)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(privateKeyName1), pubIdentifier1)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(keyName1), keyIdentifier1)== 0); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(myPubIdentifier2).getEncoded(), origMyKey2) == 0); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(pubIdentifier2).getEncoded(), origKey2) == 0); Assert.assertTrue(DataUtils.compare(cache1.getKey(keyIdentifier2).getEncoded(), origSymKey2)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(privateKeyName2), pubIdentifier2)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(keyName2), keyIdentifier2)== 0); Log.info(Log.FAC_TEST, "Completed testDisjointMerge"); } @Test public void testSameCache() throws Exception { Log.info(Log.FAC_TEST, "Starting testSameCache"); populateCache1(); populateCache2(); cache2 = cache1; cache1.merge(cache2); byte[] origKey1 = pair1.getPrivate().getEncoded(); byte[] origMyKey1 = myPair1.getPrivate().getEncoded(); byte[] origSymKey1 = key1.getEncoded(); Assert.assertTrue(cache1.size() == 3); Assert.assertTrue(cache1.getPrivateKeys().length == 2); Assert.assertTrue(cache1.containsKey(keyName1)); Assert.assertTrue(cache1.containsKey(privateKeyName1)); Assert.assertFalse(cache1.containsKey(keyName2)); Assert.assertFalse(cache1.containsKey(privateKeyName2)); Assert.assertFalse(cache1.containsKey(ContentName.fromNative("/nothere"))); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(myPubIdentifier1).getEncoded(), origMyKey1) == 0); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(pubIdentifier1).getEncoded(), origKey1) == 0); Assert.assertTrue(DataUtils.compare(cache1.getKey(keyIdentifier1).getEncoded(), origSymKey1)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(privateKeyName1), pubIdentifier1)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(keyName1), keyIdentifier1)== 0); Log.info(Log.FAC_TEST, "Completed testSameCache"); } @Test public void testDomination() throws Exception { Log.info(Log.FAC_TEST, "Started testDomination"); populateCache1(); cache2 = new SecureKeyCache(); ContentName newPrivName = ContentName.fromNative("/test/newpriv"); cache2.addPrivateKey(newPrivName, pubIdentifier1, pair1.getPrivate()); cache2.addMySigningKey(myPubIdentifier1, myPair1.getPrivate()); ContentName newKeyName = ContentName.fromNative("/test/newkey"); cache2.addKey(newKeyName, key1); cache1.merge(cache2); byte[] origKey1 = pair1.getPrivate().getEncoded(); byte[] origMyKey1 = myPair1.getPrivate().getEncoded(); byte[] origSymKey1 = key1.getEncoded(); Assert.assertTrue(cache1.size() == 3); Assert.assertTrue(cache1.getPrivateKeys().length == 2); Assert.assertTrue(cache1.containsKey(keyName1)); Assert.assertTrue(cache1.containsKey(privateKeyName1)); Assert.assertFalse(cache1.containsKey(newKeyName)); Assert.assertFalse(cache1.containsKey(newPrivName)); Assert.assertFalse(cache1.containsKey(ContentName.fromNative("/nothere"))); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(myPubIdentifier1).getEncoded(), origMyKey1) == 0); Assert.assertTrue(DataUtils.compare(cache1.getPrivateKey(pubIdentifier1).getEncoded(), origKey1) == 0); Assert.assertTrue(DataUtils.compare(cache1.getKey(keyIdentifier1).getEncoded(), origSymKey1)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(privateKeyName1), pubIdentifier1)== 0); Assert.assertTrue(DataUtils.compare(cache1.getKeyID(keyName1), keyIdentifier1)== 0); Log.info(Log.FAC_TEST, "Completed testDomination"); } @AfterClass public static void setUpAfterClass() throws Exception { } private void populateCache1() throws Exception { // A private key pair1 = kpg.generateKeyPair(); privateKeyName1 = ContentName.fromNative("/test/priv1"); cache1 = new SecureKeyCache(); pubIdentifier1 = new PublisherPublicKeyDigest(pair1.getPublic()).digest(); cache1.addPrivateKey(privateKeyName1, pubIdentifier1, pair1.getPrivate()); // My private key myPair1 = kpg.generateKeyPair(); myPubIdentifier1 = new PublisherPublicKeyDigest(myPair1.getPublic()).digest(); cache1.addMySigningKey(myPubIdentifier1, myPair1.getPrivate()); // a symmetric key key1 = WrappedKey.generateNonceKey(); keyName1 = ContentName.fromNative("/test/key1"); keyIdentifier1 = SecureKeyCache.getKeyIdentifier(key1); cache1.addKey(keyName1, key1); } private void populateCache2() throws Exception { // A private key pair2 = kpg.generateKeyPair(); privateKeyName2 = ContentName.fromNative("/test/priv2"); cache2 = new SecureKeyCache(); pubIdentifier2 = new PublisherPublicKeyDigest(pair2.getPublic()).digest(); cache2.addPrivateKey(privateKeyName2, pubIdentifier2, pair2.getPrivate()); // My private key myPair2 = kpg.generateKeyPair(); myPubIdentifier2 = new PublisherPublicKeyDigest(myPair2.getPublic()).digest(); cache2.addMySigningKey(myPubIdentifier2, myPair2.getPrivate()); // a symmetric key key2 = WrappedKey.generateNonceKey(); keyName2 = ContentName.fromNative("/test/key2"); keyIdentifier2 = SecureKeyCache.getKeyIdentifier(key2); cache2.addKey(keyName2, key2); } }