encryptasymmetrictest.java
来自「JGRoups源码」· Java 代码 · 共 701 行 · 第 1/2 页
JAVA
701 行
// assert that both now have same key assertEquals(peer.getDesKey(),server.getDesKey()); // send another encrypted message to peer to test queue Message msg2 = new Message(); msg2.setBuffer(cipher.doFinal("hello2".getBytes())); msg2.putHeader(EncryptHeader.KEY, new EncryptHeader( EncryptHeader.ENCRYPT, symVersion)); Event evt2 = new Event(Event.MSG,msg2); peer.up(evt2); // make sure we have the events now in the up layers assertEquals(3,peerObserver.getUpMessages().size()); Event tempEvt = (Event)peerObserver.getUpMessages().get("message2"); assertEquals(new String(((Message)tempEvt.getArg()).getBuffer()),"hello"); tempEvt = (Event)peerObserver.getUpMessages().get("message3"); assertEquals(new String(((Message)tempEvt.getArg()).getBuffer()),"hello2"); } public void testViewChangeNewKeyServerNewKey() throws Exception{ // create peer and server ENCRYPT peer = new ENCRYPT(); try { peer.init(); } catch (Exception e){ fail(e.getMessage()); } ENCRYPT server = new ENCRYPT(); try { server.init(); } catch (Exception e){ fail(e.getMessage()); } ENCRYPT peer2 = new ENCRYPT(); try { peer2.init(); } catch (Exception e){ fail(e.getMessage()); } // set up server server.keyServer = true; MockObserver serverObserver = new MockObserver(); server.setObserver(serverObserver); //set the local address and view change to simulate a started instance Address serverAddress = new MockAddress("server"); server.setLocal_addr(serverAddress); // set the server up as keyserver Vector serverVector = new Vector(); serverVector.add(serverAddress); View tempView = new View(new ViewId(serverAddress,1),serverVector); Event serverEvent = new Event(Event.VIEW_CHANGE,tempView); server.up(serverEvent); // set up peer as if it has started but not recieved view change Address peerAddress = new MockAddress("peer"); peer.setLocal_addr(peerAddress); MockObserver peerObserver = new MockObserver(); peer.setObserver(peerObserver); peer.keyServer = false; // set up peer2 with server as key server Address peer2Address = new MockAddress("peer2"); peer2.setLocal_addr(peer2Address); MockObserver peer2Observer = new MockObserver(); peer2.setObserver(peer2Observer); peer2.keyServer = false; peer2.setKeyServerAddr(serverAddress); // send an encrypted message from the server Message msg = new Message(); msg.setBuffer("hello".getBytes()); Event evt = new Event(Event.MSG,msg); server.down(evt); // message0 is in response to view change Event encEvt = (Event)serverObserver.getDownMessages().get("message1"); // sent to peer encrypted - should be queued in encyption layer as we do not have a keyserver set peer.up(encEvt); //assert that message is queued as we have no key from server assertTrue(peerObserver.getUpMessages().isEmpty()); // send a view change to peer where peer2 is controller Vector peerVector = new Vector(); peerVector.add(peer2Address); View tempPeerView = new View(new ViewId(peer2Address,1),peerVector); Event event = new Event(Event.VIEW_CHANGE,tempPeerView); // send to peer - should set peer2 as keyserver peer.up(event); // assert that peer\ keyserver address is now set assertTrue(peer2Address == peer.getKeyServerAddr()); // get the resulting message from the peer - should be a key request to peer2 Event sent = (Event)peerObserver.getDownMessages().get("message0"); // ensure type and that request contains peers pub key assertTrue(((EncryptHeader)((Message)sent.getArg()).getHeader(ENCRYPT.EncryptHeader.KEY)).getType() == ENCRYPT.EncryptHeader.KEY_REQUEST); assertEquals(new String(((Message)sent.getArg()).getBuffer()),new String(peer.getKpair().getPublic().getEncoded())); //assume that server is no longer available and peer2 is new server // but did not get the key from server before assuming role // send this event to peer2// send a view change to trigger the become key server // we use the fact that our address is now the controller one // send a view change where we are not the controller Vector peer2Vector = new Vector(); peer2Vector.add(peer2Address); View tempPeer2View = new View(new ViewId(peer2Address,1),peer2Vector); Event event2 = new Event(Event.VIEW_CHANGE,tempPeer2View); // this should have changed us to the key server peer2.up(event2); peer2.up(sent); Event reply = (Event)peer2Observer.getDownMessages().get("message1"); //assert that reply is the session key encrypted with peer's public key assertTrue(((EncryptHeader)((Message)reply.getArg()).getHeader(ENCRYPT.EncryptHeader.KEY)).getType() == ENCRYPT.EncryptHeader.SECRETKEY); assertNotSame(peer.getDesKey(),peer2.getDesKey()); assertNotSame(server.getDesKey(),peer2.getDesKey()); // now send back to peer peer.up(reply); // assert that both now have same key assertEquals(peer.getDesKey(),peer2.getDesKey()); assertNotSame(server.getDesKey(),peer.getDesKey()); // send another encrypted message to peer to test queue Message msg2 = new Message(); msg2.setBuffer("hello2".getBytes()); Event evt2 = new Event(Event.MSG,msg2); peer2.down(evt2); Event Evt2 = (Event)peer2Observer.getDownMessages().get("message2"); peer.up(Evt2); // make sure we have the events now in the up layers assertEquals(2,peerObserver.getUpMessages().size()); Event tempEvt = (Event)peerObserver.getUpMessages().get("message2"); assertEquals(new String(((Message)tempEvt.getArg()).getBuffer()),"hello2"); } class MockObserver implements ProtocolObserver { private Map upMessages = new HashMap(); private Map downMessages = new HashMap(); private int counter =0; /* (non-Javadoc) * @see org.jgroups.UpHandler#up(org.jgroups.Event) */ private void storeUp(Event evt){ upMessages.put("message"+counter++,evt); } private void storeDown(Event evt){ downMessages.put("message"+counter++,evt); } public void up(Event evt) { storeUp(evt); System.out.println("Up:"+evt.toString()); } /* (non-Javadoc) * @see org.jgroups.stack.ProtocolObserver#setProtocol(org.jgroups.stack.Protocol) */ public void setProtocol(Protocol prot) { } /* (non-Javadoc) * @see org.jgroups.stack.ProtocolObserver#up(org.jgroups.Event, int) */ public boolean up(Event evt, int num_evts) { System.out.println("Up:"+evt.toString()); return false; } /* (non-Javadoc) * @see org.jgroups.stack.ProtocolObserver#passUp(org.jgroups.Event) */ public boolean passUp(Event evt) { storeUp(evt); System.out.println("PassUp:"+evt.toString()); return false; } /* (non-Javadoc) * @see org.jgroups.stack.ProtocolObserver#down(org.jgroups.Event, int) */ public boolean down(Event evt, int num_evts) { System.out.println("down:"+evt.toString()); return false; } /* (non-Javadoc) * @see org.jgroups.stack.ProtocolObserver#passDown(org.jgroups.Event) */ public boolean passDown(Event evt) { storeDown(evt); System.out.println("passdown:"+evt.toString()); return false; } /** * @return Returns the upMessages. */ protected Map getUpMessages() { return upMessages; } /** * @param upMessages The upMessages to set. */ protected void setUpMessages(Map upMessages) { this.upMessages = upMessages; } /** * @return Returns the downMessages. */ protected Map getDownMessages() { return downMessages; } /** * @param downMessages The downMessages to set. */ protected void setDownMessages(Map downMessages) { this.downMessages = downMessages; } } class MockAddress implements Address{ /* (non-Javadoc) * @see org.jgroups.Address#isMulticastAddress() */ String name; public MockAddress(String name){ this.name = name; } public MockAddress() { } public boolean isMulticastAddress() { return false; } public int size() { return 0; } /* (non-Javadoc) * @see java.io.Externalizable#readExternal(java.io.ObjectInput) */ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { } /* (non-Javadoc) * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) */ public void writeExternal(ObjectOutput out) throws IOException { } /* (non-Javadoc) * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(Object o) { return -1; } public boolean equals(Object obj){ MockAddress address = (MockAddress)obj; if (address.name.equals(this.name)){ return true; } return false; } public void writeTo(DataOutputStream out) throws IOException { } public void readFrom(DataInputStream in) throws IOException, IllegalAccessException, InstantiationException { } } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?