public static VpncoinTxMessage create(String message) throws IllegalArgumentException { return new VpncoinTxMessage(message); }
static String decrypt(long key, String fullMessage) throws DataFormatException { byte[] bytes = decryptBytes(key, Base64.decode(fullMessage)); return new String(bytes); }
@Override @Nullable public MessageFactory getMessagesFactory() { return VpncoinTxMessage.getFactory(); } }
static VpncoinTxMessage parseEncrypted(long key, String fullMessage) throws Exception { return parseUnencrypted(decrypt(key, fullMessage)); }
@Test public void messageSerialization() { VpncoinTxMessage message = new VpncoinTxMessage(FROM_USER, SUBJECT, MESSAGE); String expected = "@FROM="+FROM_USER+"@SUBJ="+SUBJECT+"@MSG="+MESSAGE; assertArrayEquals(expected.getBytes(Charsets.UTF_8), message.serialize()); message = new VpncoinTxMessage(MESSAGE); assertNull(message.getFrom()); assertNull(message.getSubject()); assertArrayEquals(("@MSG=" + MESSAGE).getBytes(Charsets.UTF_8), message.serialize()); }
@Test public void messageStringParsing() { VpncoinTxMessage message = VpncoinTxMessage.parse("@FROM=" + FROM_USER + "@SUBJ=" + SUBJECT + "@MSG=" + MESSAGE); assertEquals(FROM_USER, message.getFrom()); assertEquals(SUBJECT, message.getSubject()); assertEquals(MESSAGE, message.getMessage()); assertEquals(FROM_USER + "\n\n"+SUBJECT+"\n\n"+MESSAGE, message.toString()); message = VpncoinTxMessage.parse("@MSG=" + MESSAGE); assertNull(message.getFrom()); assertNull(message.getSubject()); assertEquals(MESSAGE, message.getMessage()); assertEquals(MESSAGE, message.toString()); }
static byte[] decryptBytes(long key, byte[] data) throws DataFormatException { byte[] m_keyParts = makeKey(key); byte version = data[0]; if (CryptoFlag.CryptoFlagChecksum.isSet(flags)) { int storedChecksum = buffer.getShort() & 0xffff; int checksum = checksum(buffer.array(), buffer.position()); integrityOk = (checksum == storedChecksum); } else if (CryptoFlag.CryptoFlagHash.isSet(flags)) { return uncompress(buffer); } else { return Arrays.copyOfRange(buffer.array(), buffer.position(), buffer.array().length);
@Test public void emptyMessages() { MessageFactory factory = VpncoinTxMessage.getFactory(); assertEquals("", factory.createPublicMessage("").toString()); assertEquals("", factory.createPublicMessage(" ").toString()); assertEquals("", factory.createPublicMessage("\n\n").toString()); assertEquals("", factory.createPublicMessage(" \t \t").toString()); assertEquals(0, ((VpncoinTxMessage)factory.createPublicMessage("")).serialize().length); assertEquals(0, ((VpncoinTxMessage)factory.createPublicMessage(" ")).serialize().length); assertEquals(0, ((VpncoinTxMessage)factory.createPublicMessage("\n\n")).serialize().length); assertEquals(0, ((VpncoinTxMessage)factory.createPublicMessage(" \t \t")).serialize().length); }
static VpncoinTxMessage parseUnencrypted(String fullMessage) throws Exception { checkArgument(fullMessage.length() <= MAX_TX_DATA, "Maximum data size exceeded"); Matcher matcher = MESSAGE_REGEX.matcher(fullMessage); VpncoinTxMessage msg = new VpncoinTxMessage(); while (matcher.find()) { String part = matcher.group(); // Be more relaxed about each field size that we receive from the network if (part.startsWith(FROM)) { msg.from = part.replace(FROM, ""); } else if (part.startsWith(SUBJ)) { msg.subject = part.replace(SUBJ, ""); } else if (part.startsWith(MSG)) { msg.message = part.replace(MSG, ""); } } if (msg.isEmpty()) { throw new Exception("Message is empty"); } return msg; }
@Test public void messageToString() { VpncoinTxMessage message = new VpncoinTxMessage(FROM_USER, SUBJECT, MESSAGE); assertEquals(FROM_USER + "\n\n"+SUBJECT+"\n\n"+MESSAGE, message.toString()); message = new VpncoinTxMessage(MESSAGE); assertEquals(MESSAGE, message.toString()); } /*
@Override @Nullable public TxMessage extractPublicMessage(AbstractTransaction transaction) { return parse(transaction); } }
@Override public void serializeTo(AbstractTransaction transaction) { if (transaction instanceof BitTransaction) { Transaction rawTx = ((BitTransaction) transaction).getRawTransaction(); rawTx.setExtraBytes(serialize()); } }
@Test public void uncompress() throws Exception { assertArrayEquals(ORIGINAL_BYTES, VpncoinTxMessage.uncompress(ByteBuffer.wrap(COMPRESSED))); }
@Override public TxMessage createPublicMessage(String message) { return create(message); }
@Test public void decrypt() throws Exception { assertArrayEquals(ORIGINAL_BYTES, VpncoinTxMessage.decryptBytes(ENCRYPTION_KEY, ENCRYPTED)); }