package net.tomp2p.p2p; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PublicKey; import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; import net.tomp2p.futures.FutureDHT; import net.tomp2p.peers.Number160; import net.tomp2p.storage.Data; import net.tomp2p.storage.StorageGeneric.ProtectionEnable; import net.tomp2p.storage.StorageGeneric.ProtectionMode; import net.tomp2p.storage.StorageMemory; import net.tomp2p.utils.Utils; import org.junit.Assert; import org.junit.Test; public class TestSecurity { final private static Random rnd = new Random(42L); //TODO: enable this again /*@Test public void testPublicKeyReceived() throws Exception { final Random rnd = new Random(43L); Peer master = null; Peer slave1 = null; KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA"); KeyPair pair1 = gen.generateKeyPair(); KeyPair pair2 = gen.generateKeyPair(); // make master try { master = new PeerMaker(new Number160(rnd)).setKeyPair(pair1).setPorts(4001).makeAndListen(); // make slave slave1 = new PeerMaker(new Number160(rnd)).setKeyPair(pair2).setMasterPeer(master).makeAndListen(); final AtomicBoolean gotPK = new AtomicBoolean(false); // set storage to test PK slave1.getPeerBean().setStorage(new StorageMemory() { @Override public PutStatus put(Number160 locationKey, Number160 domainKey, Number160 contentKey, Data newData, PublicKey publicKey, boolean putIfAbsent, boolean domainProtection) { System.err.println("P is " + publicKey); gotPK.set(publicKey != null); System.err.println("PK is " + gotPK); return super.put(locationKey, domainKey, contentKey, newData, publicKey, putIfAbsent, domainProtection); } }); // perfect routing boolean peerInMap1 = master.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); boolean peerInMap2 = slave1.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); Assert.assertEquals(true, peerInMap1); Assert.assertEquals(true, peerInMap2); // Number160 locationKey = new Number160(50); RequestP2PConfiguration rc = new RequestP2PConfiguration(1, 1, 0); master.put(locationKey).setData(new Data(new byte[100000])).setRequestP2PConfiguration(rc).setSignMessage() .start().awaitUninterruptibly(); // master.put(locationKey, new Data("test"), // cs1).awaitUninterruptibly(); Assert.assertEquals(true, gotPK.get()); // without PK, this test should fail. master.put(locationKey).setData(new Data("test1")).setRequestP2PConfiguration(rc).start() .awaitUninterruptibly(); Assert.assertEquals(false, gotPK.get()); } finally { master.halt(); slave1.halt(); } } @Test public void testPublicKeyReceivedDomain() throws Exception { final Random rnd = new Random(43L); Peer master = null; try { KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA"); KeyPair pair1 = gen.generateKeyPair(); // make master master = new PeerMaker(new Number160(rnd)).setKeyPair(pair1).setPorts(4001).makeAndListen(); // make slave final AtomicBoolean gotPK = new AtomicBoolean(false); // set storage to test PK master.getPeerBean().setStorage(new StorageMemory() { @Override public PutStatus put(Number160 locationKey, Number160 domainKey, Number160 contentKey, Data newData, PublicKey publicKey, boolean putIfAbsent, boolean domainProtection) { gotPK.set(publicKey != null); System.err.println("PK is " + gotPK); return super.put(locationKey, domainKey, contentKey, newData, publicKey, putIfAbsent, domainProtection); } }); // Number160 locationKey = new Number160(50); RequestP2PConfiguration rc = new RequestP2PConfiguration(1, 1, 0); master.put(locationKey).setData(Number160.ONE, new Data(new byte[2000])).setRequestP2PConfiguration(rc) .setDomainKey(Number160.ONE).setSignMessage().start().awaitUninterruptibly(); Assert.assertEquals(true, gotPK.get()); // without PK master.put(locationKey).setData(Number160.ONE, new Data("test1")).setRequestP2PConfiguration(rc) .setDomainKey(Number160.ONE).start().awaitUninterruptibly(); Assert.assertEquals(false, gotPK.get()); } finally { master.halt(); } } @Test public void testProtection() throws Exception { final Random rnd = new Random(43L); Peer master = null; Peer slave1 = null; Peer slave2 = null; KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA"); KeyPair pair1 = gen.generateKeyPair(); KeyPair pair2 = gen.generateKeyPair(); KeyPair pair3 = gen.generateKeyPair(); System.err.println("PPK1 " + pair1.getPublic()); System.err.println("PPK2 " + pair2.getPublic()); System.err.println("PPK3 " + pair3.getPublic()); try { master = new PeerMaker(new Number160(rnd)).setKeyPair(pair1).setPorts(4001).makeAndListen(); master.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); slave1 = new PeerMaker(new Number160(rnd)).setKeyPair(pair2).setMasterPeer(master).makeAndListen(); slave1.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); slave2 = new PeerMaker(new Number160(rnd)).setKeyPair(pair3).setMasterPeer(master).makeAndListen(); slave2.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); // perfect routing master.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); master.getPeerBean().getPeerMap().peerFound(slave2.getPeerAddress(), null); // slave1.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); slave1.getPeerBean().getPeerMap().peerFound(slave2.getPeerAddress(), null); // slave2.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); slave2.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); Number160 locationKey = new Number160(50); FutureDHT fdht1 = master.put(locationKey).setData(new Number160(10), new Data("test1")) .setDomainKey(Utils.makeSHAHash(pair3.getPublic().getEncoded())).setProtectDomain().start(); fdht1.awaitUninterruptibly(); Assert.assertEquals(true, fdht1.isSuccess()); // try to insert in same domain from different peer FutureDHT fdht2 = slave1.put(locationKey).setData(new Number160(11), new Data("tes2")) .setDomainKey(Utils.makeSHAHash(pair3.getPublic().getEncoded())).setProtectDomain().start(); fdht2.awaitUninterruptibly(); Assert.assertEquals(false, fdht2.isSuccess()); // insert from same peer but with public key protection FutureDHT fdht3 = slave2.put(locationKey).setData(new Number160(12), new Data("tes2")) .setDomainKey(Utils.makeSHAHash(pair3.getPublic().getEncoded())).setProtectDomain().start(); fdht3.awaitUninterruptibly(); Assert.assertEquals(true, fdht3.isSuccess()); // // get at least 3 results, because we want to test the domain // removel feature RequestP2PConfiguration rc = new RequestP2PConfiguration(3, 3, 3); FutureDHT fdht4 = slave1.get(locationKey).setAll().setRequestP2PConfiguration(rc) .setDomainKey(Utils.makeSHAHash(pair3.getPublic().getEncoded())).start(); fdht4.awaitUninterruptibly(); Assert.assertEquals(true, fdht4.isSuccess()); Assert.assertEquals(2, fdht4.getDataMap().size()); } finally { master.halt(); slave1.halt(); slave2.halt(); } } @Test public void testProtectionWithRemove() throws Exception { final Random rnd = new Random(42L); Peer master = null; Peer slave1 = null; Peer slave2 = null; KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA"); KeyPair pair1 = gen.generateKeyPair(); KeyPair pair2 = gen.generateKeyPair(); KeyPair pair3 = gen.generateKeyPair(); System.err.println("PPK1 " + pair1.getPublic()); System.err.println("PPK2 " + pair2.getPublic()); System.err.println("PPK3 " + pair3.getPublic()); try { master = new PeerMaker(new Number160(rnd)).setKeyPair(pair1).setPorts(4001).makeAndListen(); master.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); slave1 = new PeerMaker(new Number160(rnd)).setKeyPair(pair2).setMasterPeer(master).makeAndListen(); slave1.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); slave2 = new PeerMaker(new Number160(rnd)).setKeyPair(pair3).setMasterPeer(master).makeAndListen(); slave2.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); // perfect routing master.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); master.getPeerBean().getPeerMap().peerFound(slave2.getPeerAddress(), null); // slave1.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); slave1.getPeerBean().getPeerMap().peerFound(slave2.getPeerAddress(), null); // slave2.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); slave2.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); Number160 locationKey = new Number160(50); FutureDHT fdht1 = master.put(locationKey).setData(new Data("test1")) .setDomainKey(Utils.makeSHAHash(pair1.getPublic().getEncoded())).setProtectDomain().start(); fdht1.awaitUninterruptibly(); // remove from different peer, should fail FutureDHT fdht2 = slave1.remove(locationKey) .setDomainKey(Utils.makeSHAHash(pair1.getPublic().getEncoded())).setSignMessage().start(); fdht2.awaitUninterruptibly(); Assert.assertEquals(0, fdht2.getKeys().size()); // this should work FutureDHT fdht3 = master.remove(locationKey) .setDomainKey(Utils.makeSHAHash(pair1.getPublic().getEncoded())).setSignMessage().start(); fdht3.awaitUninterruptibly(); Assert.assertEquals(1, fdht3.getKeys().size()); } finally { master.halt(); slave1.halt(); slave2.halt(); } } @Test public void testProtectionDomain() throws Exception { final Random rnd = new Random(43L); Peer master = null; Peer slave1 = null; KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA"); KeyPair pair1 = gen.generateKeyPair(); KeyPair pair2 = gen.generateKeyPair(); // make master try { master = new PeerMaker(new Number160(rnd)).setKeyPair(pair1).setPorts(4001).makeAndListen(); // make slave slave1 = new PeerMaker(new Number160(rnd)).setKeyPair(pair2).setMasterPeer(master).makeAndListen(); master.getPeerBean().setStorage(new StorageMemory() { public PutStatus put(Number160 locationKey, Number160 domainKey, Number160 contentKey, Data newData, PublicKey publicKey, boolean putIfAbsent, boolean domainProtection) { // System.out.println("store1"); return super.put(locationKey, domainKey, contentKey, newData, publicKey, putIfAbsent, domainProtection); } }); slave1.getPeerBean().setStorage(new StorageMemory() { @Override public PutStatus put(Number160 locationKey, Number160 domainKey, Number160 contentKey, Data newData, PublicKey publicKey, boolean putIfAbsent, boolean domainProtection) { // System.out.println("store2"); return super.put(locationKey, domainKey, contentKey, newData, publicKey, putIfAbsent, domainProtection); } }); // perfect routing boolean peerInMap1 = master.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); boolean peerInMap2 = slave1.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); Assert.assertEquals(true, peerInMap1); Assert.assertEquals(true, peerInMap2); // since we have to peers, we store on both, otherwise this test may // sometimes work, sometimes not. RequestP2PConfiguration rc = new RequestP2PConfiguration(1, 1, 1); Number160 locationKey = Number160.createHash("loctaion"); FutureDHT futureDHT = master.put(locationKey).setData(Number160.createHash("content1"), new Data("test1")) .setDomainKey(Number160.createHash("domain1")).setProtectDomain().setRequestP2PConfiguration(rc) .start(); futureDHT.awaitUninterruptibly(); Assert.assertEquals(true, futureDHT.isSuccess()); // now the slave stores with different in the same domain. This // should not work futureDHT = slave1.put(locationKey).setData(Number160.createHash("content2"), new Data("test2")) .setDomainKey(Number160.createHash("domain1")).setProtectDomain().setRequestP2PConfiguration(rc) .start(); futureDHT.awaitUninterruptibly(); System.err.println(futureDHT.getFailedReason()); Assert.assertEquals(false, futureDHT.isSuccess()); } finally { master.halt(); slave1.halt(); } } @Test public void testSecurePutGet1() throws Exception { Peer master = null; Peer slave1 = null; Peer slave2 = null; KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA"); KeyPair pair1 = gen.generateKeyPair(); KeyPair pair2 = gen.generateKeyPair(); KeyPair pair3 = gen.generateKeyPair(); System.err.println("PPK1 " + pair1.getPublic()); System.err.println("PPK2 " + pair2.getPublic()); System.err.println("PPK3 " + pair3.getPublic()); try { // make slave master = new PeerMaker(new Number160(rnd)).setKeyPair(pair1).setPorts(4001).makeAndListen(); master.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); slave1 = new PeerMaker(new Number160(rnd)).setKeyPair(pair2).setMasterPeer(master).makeAndListen(); slave1.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); slave2 = new PeerMaker(new Number160(rnd)).setKeyPair(pair3).setMasterPeer(master).makeAndListen(); slave2.getPeerBean() .getStorage() .setProtection(ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY, ProtectionEnable.ALL, ProtectionMode.MASTER_PUBLIC_KEY); // perfect routing master.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); master.getPeerBean().getPeerMap().peerFound(slave2.getPeerAddress(), null); // slave1.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); slave1.getPeerBean().getPeerMap().peerFound(slave2.getPeerAddress(), null); // slave2.getPeerBean().getPeerMap().peerFound(master.getPeerAddress(), null); slave2.getPeerBean().getPeerMap().peerFound(slave1.getPeerAddress(), null); Number160 locationKey = new Number160(50); Data data1 = new Data("test1"); data1.setProtectedEntry(true); FutureDHT fdht1 = master.put(locationKey).setData(data1).start(); fdht1.awaitUninterruptibly(); fdht1.getFutureRequests().awaitUninterruptibly(); Assert.assertEquals(true, fdht1.isSuccess()); // store again Data data2 = new Data("test1"); data2.setProtectedEntry(true); FutureDHT fdht2 = slave1.put(locationKey).setData(data2).start(); fdht2.awaitUninterruptibly(); fdht2.getFutureRequests().awaitUninterruptibly(); Assert.assertEquals(0, fdht2.getKeys().size()); Assert.assertEquals(false, fdht2.isSuccess()); // Utils.sleep(1000000); // try to removze it FutureDHT fdht3 = slave2.remove(locationKey).start(); fdht3.awaitUninterruptibly(); // true, since we have domain protection yet Assert.assertEquals(true, fdht3.isSuccess()); Assert.assertEquals(0, fdht3.getKeys().size()); // try to put another thing Data data3 = new Data("test2"); data3.setProtectedEntry(true); FutureDHT fdht4 = master.put(locationKey).setData(new Number160(33), data3).start(); fdht4.awaitUninterruptibly(); fdht4.getFutureRequests().awaitUninterruptibly(); Assert.assertEquals(true, fdht4.isSuccess()); // get it FutureDHT fdht7 = slave2.get(locationKey).setAll().start(); fdht7.awaitUninterruptibly(); Assert.assertEquals(2, fdht7.getDataMap().size()); Assert.assertEquals(true, fdht7.isSuccess()); // if(true) // System.exit(0); // try to remove for real, all FutureDHT fdht5 = master.remove(locationKey).setAll().setSignMessage().start(); fdht5.awaitUninterruptibly(); System.err.println(fdht5.getFailedReason()); Assert.assertEquals(true, fdht5.isSuccess()); // get all, they should be removed now FutureDHT fdht6 = slave2.get(locationKey).setAll().start(); fdht6.awaitUninterruptibly(); Assert.assertEquals(0, fdht6.getDataMap().size()); Assert.assertEquals(false, fdht6.isSuccess()); // put there the data again... FutureDHT fdht8 = slave1.put(locationKey) .setData(Utils.makeSHAHash(pair1.getPublic().getEncoded()), new Data("test1")).start(); fdht8.awaitUninterruptibly(); fdht8.getFutureRequests().awaitUninterruptibly(); Assert.assertEquals(true, fdht8.isSuccess()); // overwrite Data data4 = new Data("test1"); data4.setProtectedEntry(true); FutureDHT fdht9 = master.put(locationKey).setData(Utils.makeSHAHash(pair1.getPublic().getEncoded()), data4) .start(); fdht9.awaitUninterruptibly(); fdht9.getFutureRequests().awaitUninterruptibly(); System.err.println("reason " + fdht9.getFailedReason()); Assert.assertEquals(true, fdht9.isSuccess()); } finally { // Utils.sleep(1000000); master.halt(); slave1.halt(); slave2.halt(); } }*/ }