/*
* Created on 04-Jul-2004
*/
package org.jgroups.protocols;
import org.jgroups.Global;
import org.jgroups.Message;
import org.jgroups.conf.ClassConfigurator;
import org.jgroups.stack.Protocol;
import org.jgroups.util.MessageBatch;
import org.testng.annotations.Test;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
/**
* @author xenephon
* @author Bela Ban
*/
@Test(groups=Global.FUNCTIONAL, sequential=false)
public class ENCRYPTKeystoreTest {
static final short ENCRYPT_ID=ClassConfigurator.getProtocolId(SYM_ENCRYPT.class);
public void testInitWrongKeystoreProperties() {
SYM_ENCRYPT encrypt=new SYM_ENCRYPT().keystoreName("unkownKeystore.keystore");
try {
encrypt.init();
}
catch(Exception e) {
System.out.println("didn't find incorrect keystore (as expected): " + e.getMessage());
}
}
public void testInitKeystoreProperties() throws Exception {
SYM_ENCRYPT encrypt=new SYM_ENCRYPT().keystoreName("defaultStore.keystore");
encrypt.init();
}
public void testMessageDownEncode() throws Exception {
SYM_ENCRYPT encrypt=create("defaultStore.keystore");
MockProtocol observer=new MockProtocol();
encrypt.setDownProtocol(observer);
String messageText="hello this is a test message";
Message msg=new Message(null, messageText.getBytes());
encrypt.down(msg);
Message sentMsg=observer.getDownMessages().get("message0");
String encText=new String(sentMsg.getBuffer());
assert !encText.equals(messageText);
byte[] decodedBytes=encrypt.code(sentMsg.getRawBuffer(), sentMsg.getOffset(), sentMsg.getLength(), true);
String temp=new String(decodedBytes);
System.out.printf("decoded text: '%s'\n", temp);
assert temp.equals(messageText) : String.format("sent: '%s', decoded: '%s'", messageText, temp);
}
public void testMessageUpDecode() throws Exception {
SYM_ENCRYPT encrypt=create("defaultStore.keystore"), encrypt2=create("defaultStore.keystore");
MockProtocol observer=new MockProtocol();
encrypt.setUpProtocol(observer);
String messageText="hello this is a test message";
byte[] bytes=messageText.getBytes();
byte[] encodedBytes=encrypt2.code(bytes, 0, bytes.length, false);
assert !new String(encodedBytes).equals(messageText);
MessageDigest digest=MessageDigest.getInstance("MD5");
digest.reset();
digest.update(encrypt.secretKey().getEncoded());
byte[] symVersion=digest.digest();
Message msg=new Message(null, encodedBytes).putHeader(ENCRYPT_ID, new EncryptHeader(EncryptHeader.ENCRYPT, symVersion));
encrypt.up(msg);
Message rcvdMsg=observer.getUpMessages().get("message0");
String decText=new String(rcvdMsg.getBuffer());
assert decText.equals(messageText);
}
public void testMessageUpWrongKey() throws Exception {
SYM_ENCRYPT encrypt=create("defaultStore.keystore"), encrypt2=create("defaultStore2.keystore");
MockProtocol observer=new MockProtocol();
encrypt.setUpProtocol(observer);
String messageText="hello this is a test message";
byte[] bytes=messageText.getBytes();
byte[] encodedBytes=encrypt2.code(bytes, 0, bytes.length, false);
assert !new String(encodedBytes).equals(messageText);
MessageDigest digest=MessageDigest.getInstance("MD5");
digest.reset();
digest.update(encrypt2.secretKey().getEncoded());
byte[] symVersion=digest.digest();
Message msg=new Message(null, encodedBytes).putHeader(ENCRYPT_ID, new EncryptHeader(EncryptHeader.ENCRYPT, symVersion));
encrypt.up(msg);
assert observer.getUpMessages().isEmpty();
}
public void testMessageUpNoEncryptHeader() throws Exception {
SYM_ENCRYPT encrypt=create("defaultStore.keystore"), encrypt2=create("defaultStore.keystore");
MockProtocol observer=new MockProtocol();
encrypt.setUpProtocol(observer);
String messageText="hello this is a test message";
byte[] bytes=messageText.getBytes();
byte[] encodedBytes=encrypt2.code(bytes, 0, bytes.length, false);
assert !new String(encodedBytes).equals(messageText);
Message msg=new Message(null, encodedBytes);
encrypt.up(msg);
assert observer.getUpMessages().isEmpty();
}
public void testEventUpNoMessage() throws Exception {
SYM_ENCRYPT encrypt=create("defaultStore.keystore");
MockProtocol observer=new MockProtocol();
encrypt.setUpProtocol(observer);
encrypt.up((Message)null);
assert observer.getUpMessages().isEmpty();
}
public void testMessageUpNoBuffer() throws Exception {
SYM_ENCRYPT encrypt=create("defaultStore.keystore");
MockProtocol observer=new MockProtocol();
encrypt.setUpProtocol(observer);
encrypt.up(new Message().putHeader(ENCRYPT_ID, new EncryptHeader(EncryptHeader.ENCRYPT, "bla".getBytes())));
assert observer.getUpMessages().isEmpty();
}
public void testEncryptEntireMessage() throws Exception {
SYM_ENCRYPT encrypt=create("defaultStore.keystore").encryptEntireMessage(true);
Message msg=new Message(null, "hello world".getBytes()).putHeader((short)1, new TpHeader("cluster"));
MockProtocol mock=new MockProtocol();
encrypt.setDownProtocol(mock);
encrypt.down(msg);
Message encrypted_msg=mock.getDownMessages().get("message0");
encrypt.setDownProtocol(null);
encrypt.setUpProtocol(mock);
encrypt.up(encrypted_msg);
Message decrypted_msg=mock.getUpMessages().get("message1");
String temp=new String(decrypted_msg.getBuffer());
assert "hello world".equals(temp);
}
protected static SYM_ENCRYPT create(String keystore) throws Exception {
SYM_ENCRYPT encrypt=new SYM_ENCRYPT().keystoreName(keystore).encryptEntireMessage(false);
encrypt.init();
return encrypt;
}
protected static class MockProtocol extends Protocol {
private final Map<String,Message> upMessages=new HashMap<>();
private final Map<String,Message> downMessages=new HashMap<>();
private int counter;
public Map<String,Message> getDownMessages() {return downMessages;}
public Map<String,Message> getUpMessages() {return upMessages;}
public Object down(Message msg) {
downMessages.put("message" + counter++, msg);
return null;
}
public Object up(Message msg) {
upMessages.put("message" + counter++, msg);
return null;
}
public void up(MessageBatch batch) {throw new UnsupportedOperationException();}
}
}