/* * * Panbox - encryption for cloud storage * Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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, see <http://www.gnu.org/licenses/>. * * Additonally, third party code may be provided with notices and open source * licenses from communities and third parties that govern the use of those * portions, and any licenses granted hereunder do not alter any rights and * obligations you may have under such open source licenses, however, the * disclaimer of warranty and limitation of liability provisions of the GPLv3 * will apply to all the product. * */ package org.panbox.core.keymgmt; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.util.TreeMap; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.panbox.core.exception.ShareMetaDataException; public class TestAddDevice { @Rule public TemporaryFolder folder = new TemporaryFolder(); static PrivateKey A_Key_sig_priv; static PublicKey A_Key_sig_pub; static PrivateKey A_Key_enc_priv; static PublicKey A_Key_enc_pub; static PublicKey A_devKey1_enc_pub; static PrivateKey A_devKey1_enc_priv; static PublicKey A_devKey2_enc_pub; static PrivateKey A_devKey2_enc_priv; static PublicKey A_devKey3_enc_pub; static PrivateKey A_devKey3_enc_priv; static PrivateKey B_Key_sig_priv; static PublicKey B_Key_sig_pub; static PrivateKey B_Key_enc_priv; static PublicKey B_Key_enc_pub; static PublicKey B_devKey1_enc_pub; static PrivateKey B_devKey1_enc_priv; static PublicKey B_devKey2_enc_pub; static PrivateKey B_devKey2_enc_priv; static PublicKey B_devKey3_enc_pub; static PrivateKey B_devKey3_enc_priv; private String dbName = "./"; private static String aliasOwner = "Owner"; private static String aliasGuest = "Guest"; private static String deviceAliasOwner1 = "OwnerDev1"; // private static String deviceAliasGuest1 = "GuestDev1"; private static String deviceAliasOwner2 = "OwnerDev2"; // private static String deviceAliasGuest2 = "GuestDev2"; private static String deviceAliasOwner3 = "OwnerDev3"; // private static String deviceAliasGuest3 = "GuestDev3"; @BeforeClass public static void setUpClass() { try { KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", new BouncyCastleProvider()); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); gen.initialize(1024, random); KeyPair pair = gen.generateKeyPair(); A_Key_sig_priv = pair.getPrivate(); A_Key_sig_pub = pair.getPublic(); gen.generateKeyPair(); A_Key_enc_priv = pair.getPrivate(); A_Key_enc_pub = pair.getPublic(); pair = gen.generateKeyPair(); A_devKey1_enc_priv = pair.getPrivate(); A_devKey1_enc_pub = pair.getPublic(); pair = gen.generateKeyPair(); A_devKey2_enc_priv = pair.getPrivate(); A_devKey2_enc_pub = pair.getPublic(); pair = gen.generateKeyPair(); A_devKey3_enc_priv = pair.getPrivate(); A_devKey3_enc_pub = pair.getPublic(); pair = gen.generateKeyPair(); B_Key_sig_priv = pair.getPrivate(); B_Key_sig_pub = pair.getPublic(); gen.generateKeyPair(); B_Key_enc_priv = pair.getPrivate(); B_Key_enc_pub = pair.getPublic(); pair = gen.generateKeyPair(); B_devKey1_enc_priv = pair.getPrivate(); B_devKey1_enc_pub = pair.getPublic(); pair = gen.generateKeyPair(); B_devKey2_enc_priv = pair.getPrivate(); B_devKey2_enc_pub = pair.getPublic(); pair = gen.generateKeyPair(); B_devKey3_enc_priv = pair.getPrivate(); B_devKey3_enc_pub = pair.getPublic(); } catch (NoSuchAlgorithmException e) { fail(e.getMessage()); } } @Before public void setUp() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException { File newFolder = folder.newFolder(".metadata"); System.out.println("Create temporary folder: " + newFolder.mkdirs()); dbName = newFolder.getAbsolutePath(); File db = new File(dbName + File.separator + Volume.DB_FILE); if (db.exists()) db.delete(); } @After public void tearDown() { File db = new File(dbName + Volume.DB_FILE); if (db.exists()) db.delete(); System.out.println("cleanup"); } @SuppressWarnings("unchecked") @Test public void test() { // Create Share IVolume volume = new Volume(dbName); assertNotNull(volume); ShareMetaData smd = null; try { smd = volume.createShareMetaData(aliasOwner, A_Key_sig_pub, A_Key_sig_priv, A_Key_enc_pub, A_Key_enc_priv, deviceAliasOwner1, A_devKey1_enc_pub); assertNotNull(smd); } catch (Exception e) { e.printStackTrace(System.err); fail(e.getMessage()); } assertEquals(1, smd.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertNull(smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(1, smd.shareKeys.size()); assertEquals(0, smd.shareKeys.getLastEntry().getVersion()); assertEquals(2, smd.shareKeys.getLastEntry().size()); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) != null); // add device try { volume.addDevice(aliasOwner, A_Key_sig_pub, A_Key_sig_priv, deviceAliasOwner2, A_devKey2_enc_pub, A_Key_enc_pub, A_Key_enc_priv); } catch (IllegalArgumentException | ShareMetaDataException e) { e.printStackTrace(System.err); fail(e.getMessage()); } assertEquals(1, smd.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertNull(smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(1, smd.shareKeys.size()); assertEquals(0, smd.shareKeys.getLastEntry().getVersion()); assertEquals(3, smd.shareKeys.getLastEntry().size()); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); try { ObfuscationKeyDB okdb = smd.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(3, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload volume to check persistency IVolume volume2 = new Volume(dbName); ShareMetaData smd2 = null; try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(1, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd2.getSharePartList().getPublicKey(aliasOwner)); assertNull(smd2.getSharePartList().getPublicKey(aliasGuest)); assertEquals(1, smd2.shareKeys.size()); assertEquals(0, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(3, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(3, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // add another device try { volume.addDevice(aliasOwner, A_Key_sig_pub, A_Key_sig_priv, deviceAliasOwner3, A_devKey3_enc_pub, A_Key_enc_pub, A_Key_enc_priv); } catch (IllegalArgumentException | ShareMetaDataException e) { e.printStackTrace(System.err); fail(e.getMessage()); } assertEquals(1, smd.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertNull(smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(1, smd.shareKeys.size()); assertEquals(0, smd.shareKeys.getLastEntry().getVersion()); assertEquals(4, smd.shareKeys.getLastEntry().size()); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(4, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload volume to check persistency volume2 = new Volume(dbName); smd2 = null; try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(1, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd2.getSharePartList().getPublicKey(aliasOwner)); assertNull(smd2.getSharePartList().getPublicKey(aliasGuest)); assertEquals(1, smd2.shareKeys.size()); assertEquals(0, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(4, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(4, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // remove device /* try { volume.removeDevice(aliasOwner, A_Key_sig_pub, A_Key_sig_priv, deviceAliasOwner1); } catch (IllegalArgumentException | ShareMetaDataException e) { e.printStackTrace(System.err); fail(e.getMessage()); } assertEquals(1, smd.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertNull(smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd.shareKeys.size()); assertEquals(1, smd.shareKeys.getLastEntry().getVersion()); assertEquals(3, smd.shareKeys.getLastEntry().size()); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(3, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload volume to check persistency volume2 = new Volume(dbName); smd2 = null; try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(1, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd2.getSharePartList().getPublicKey(aliasOwner)); assertNull(smd2.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(3, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(3, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // Invite user try { volume.inviteUser(aliasOwner, A_Key_sig_priv, A_Key_enc_pub, A_Key_enc_priv, aliasGuest, B_Key_enc_pub, B_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd.shareKeys.size()); assertEquals(1, smd.shareKeys.getLastEntry().getVersion()); assertEquals(4, smd.shareKeys.getLastEntry().size()); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) == null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) == null); try { ObfuscationKeyDB okdb = smd.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(4, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } volume2 = new Volume(dbName); try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); assertNotNull(smd); } catch (Exception e) { fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(4, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) == null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(4, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // accept invitation volume2 = new Volume(dbName); try { smd2 = volume2.acceptInvitation(A_Key_sig_pub, aliasGuest, B_Key_sig_pub, B_Key_sig_priv, deviceAliasGuest1, B_devKey1_enc_pub, B_Key_enc_pub, B_Key_enc_priv); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(5, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) == null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(5, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload share to verify integrity volume2 = new Volume(dbName); try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(5, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) == null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(5, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // let user B add another device try { volume2.addDevice(aliasGuest, B_Key_sig_pub, B_Key_sig_priv, deviceAliasGuest2, B_devKey2_enc_pub, B_Key_enc_pub, B_Key_enc_priv); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(6, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) == null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(6, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload share to verify integrity volume2 = new Volume(dbName); try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(6, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) == null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(6, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // let user B add another device try { volume2.addDevice(aliasGuest, B_Key_sig_pub, B_Key_sig_priv, deviceAliasGuest3, B_devKey3_enc_pub, B_Key_enc_pub, B_Key_enc_priv); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(7, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(7, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload share to verify integrity volume2 = new Volume(dbName); try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(2, smd2.shareKeys.size()); assertEquals(1, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(7, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(7, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // let B remove a device // let user B add another device try { volume2.removeDevice(aliasGuest, B_Key_sig_pub, B_Key_sig_priv, deviceAliasGuest2); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(3, smd2.shareKeys.size()); assertEquals(2, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(6, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(6, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload share to verify integrity volume2 = new Volume(dbName); try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(3, smd2.shareKeys.size()); assertEquals(2, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(6, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(6, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // let user B add another device try { volume2.removeDevice(aliasGuest, B_Key_sig_pub, B_Key_sig_priv, deviceAliasGuest1); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(4, smd2.shareKeys.size()); assertEquals(3, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(5, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(5, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } // reload share to verify integrity volume2 = new Volume(dbName); try { smd2 = volume2.loadShareMetaData(A_Key_sig_pub); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } assertEquals(2, smd2.getSharePartList().size()); assertEquals(A_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasOwner)); assertEquals(B_Key_sig_pub, smd.getSharePartList().getPublicKey(aliasGuest)); assertEquals(4, smd2.shareKeys.size()); assertEquals(3, smd2.shareKeys.getLastEntry().getVersion()); assertEquals(5, smd2.shareKeys.getLastEntry().size()); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(A_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey2_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( A_devKey3_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey(B_Key_enc_pub) != null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey1_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey2_enc_pub) == null); assertTrue(smd2.shareKeys.getLastEntry().getEncryptedKey( B_devKey3_enc_pub) != null); try { ObfuscationKeyDB okdb = smd2.obfuscationKeys; Field f = ObfuscationKeyDB.class .getDeclaredField("obfuscationKeys"); f.setAccessible(true); TreeMap<PublicKey, byte[]> obkeys = (TreeMap<PublicKey, byte[]>) f .get(okdb); int size = obkeys.size(); assertEquals(5, size); assertTrue(obkeys.containsKey(A_Key_enc_pub)); assertTrue(!obkeys.containsKey(A_devKey1_enc_pub)); assertTrue(obkeys.containsKey(A_devKey2_enc_pub)); assertTrue(obkeys.containsKey(A_devKey3_enc_pub)); assertTrue(obkeys.containsKey(B_Key_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey1_enc_pub)); assertTrue(!obkeys.containsKey(B_devKey2_enc_pub)); assertTrue(obkeys.containsKey(B_devKey3_enc_pub)); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } */ } }