From ad0972877b405a7f664d64ee84b8875ce91b6be9 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Mon, 14 Dec 2015 17:29:28 +0000 Subject: [PATCH] Updated TestStreamEncrypter/Decrypter. --- .../transport/TestStreamDecrypter.java | 32 ++++++++++++----- .../transport/TestStreamEncrypter.java | 35 ++++++++++--------- .../transport/TransportIntegrationTest.java | 26 +++++--------- 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/briar-tests/src/org/briarproject/transport/TestStreamDecrypter.java b/briar-tests/src/org/briarproject/transport/TestStreamDecrypter.java index 5a47083e83..f95e467409 100644 --- a/briar-tests/src/org/briarproject/transport/TestStreamDecrypter.java +++ b/briar-tests/src/org/briarproject/transport/TestStreamDecrypter.java @@ -1,6 +1,5 @@ package org.briarproject.transport; -import org.briarproject.api.FormatException; import org.briarproject.api.crypto.StreamDecrypter; import org.briarproject.util.ByteUtils; @@ -11,35 +10,52 @@ import java.io.InputStream; import static org.briarproject.api.transport.TransportConstants.FRAME_HEADER_LENGTH; import static org.briarproject.api.transport.TransportConstants.MAC_LENGTH; import static org.briarproject.api.transport.TransportConstants.MAX_FRAME_LENGTH; +import static org.briarproject.api.transport.TransportConstants.STREAM_HEADER_LENGTH; class TestStreamDecrypter implements StreamDecrypter { private final InputStream in; private final byte[] frame; + private boolean readStreamHeader = true, finalFrame = false; + TestStreamDecrypter(InputStream in) { this.in = in; frame = new byte[MAX_FRAME_LENGTH]; } public int readFrame(byte[] payload) throws IOException { + if (finalFrame) return -1; + if (readStreamHeader) readStreamHeader(); int offset = 0; while (offset < FRAME_HEADER_LENGTH) { int read = in.read(frame, offset, FRAME_HEADER_LENGTH - offset); if (read == -1) throw new EOFException(); offset += read; } - boolean finalFrame = (frame[0] & 0x80) == 0x80; + finalFrame = (frame[0] & 0x80) == 0x80; int payloadLength = ByteUtils.readUint16(frame, 0) & 0x7FFF; - while (offset < frame.length) { - int read = in.read(frame, offset, frame.length - offset); - if (read == -1) break; + int paddingLength = ByteUtils.readUint16(frame, 2); + int frameLength = FRAME_HEADER_LENGTH + payloadLength + paddingLength + + MAC_LENGTH; + while (offset < frameLength) { + int read = in.read(frame, offset, frameLength - offset); + if (read == -1) throw new EOFException(); offset += read; } - if (!finalFrame && offset < frame.length) throw new EOFException(); - if (offset < FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH) - throw new FormatException(); System.arraycopy(frame, FRAME_HEADER_LENGTH, payload, 0, payloadLength); return payloadLength; } + + private void readStreamHeader() throws IOException { + byte[] streamHeader = new byte[STREAM_HEADER_LENGTH]; + int offset = 0; + while (offset < STREAM_HEADER_LENGTH) { + int read = in.read(streamHeader, offset, + STREAM_HEADER_LENGTH - offset); + if (read == -1) throw new EOFException(); + offset += read; + } + readStreamHeader = false; + } } diff --git a/briar-tests/src/org/briarproject/transport/TestStreamEncrypter.java b/briar-tests/src/org/briarproject/transport/TestStreamEncrypter.java index 24a0dc783a..2315acfa94 100644 --- a/briar-tests/src/org/briarproject/transport/TestStreamEncrypter.java +++ b/briar-tests/src/org/briarproject/transport/TestStreamEncrypter.java @@ -8,38 +8,41 @@ import java.io.OutputStream; import static org.briarproject.api.transport.TransportConstants.FRAME_HEADER_LENGTH; import static org.briarproject.api.transport.TransportConstants.MAC_LENGTH; -import static org.briarproject.api.transport.TransportConstants.MAX_FRAME_LENGTH; +import static org.briarproject.api.transport.TransportConstants.STREAM_HEADER_LENGTH; class TestStreamEncrypter implements StreamEncrypter { private final OutputStream out; - private final byte[] tag, frame; + private final byte[] tag; - private boolean writeTag = true; + private boolean writeTagAndHeader = true; TestStreamEncrypter(OutputStream out, byte[] tag) { this.out = out; this.tag = tag; - frame = new byte[MAX_FRAME_LENGTH]; } public void writeFrame(byte[] payload, int payloadLength, int paddingLength, boolean finalFrame) throws IOException { - if (writeTag) { - out.write(tag); - writeTag = false; - } - ByteUtils.writeUint16(payloadLength, frame, 0); - if (finalFrame) frame[0] |= 0x80; - System.arraycopy(payload, 0, frame, FRAME_HEADER_LENGTH, payloadLength); - for (int i = FRAME_HEADER_LENGTH + payloadLength; i < frame.length; i++) - frame[i] = 0; - if (finalFrame) - out.write(frame, 0, FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH); - else out.write(frame, 0, frame.length); + if (writeTagAndHeader) writeTagAndHeader(); + byte[] frameHeader = new byte[FRAME_HEADER_LENGTH]; + ByteUtils.writeUint16(payloadLength, frameHeader, 0); + ByteUtils.writeUint16(paddingLength, frameHeader, 2); + if (finalFrame) frameHeader[0] |= 0x80; + out.write(frameHeader); + out.write(payload, 0, payloadLength); + out.write(new byte[paddingLength]); + out.write(new byte[MAC_LENGTH]); } public void flush() throws IOException { + if (writeTagAndHeader) writeTagAndHeader(); out.flush(); } + + private void writeTagAndHeader() throws IOException { + out.write(tag); + out.write(new byte[STREAM_HEADER_LENGTH]); + writeTagAndHeader = false; + } } diff --git a/briar-tests/src/org/briarproject/transport/TransportIntegrationTest.java b/briar-tests/src/org/briarproject/transport/TransportIntegrationTest.java index b373970611..24e401a537 100644 --- a/briar-tests/src/org/briarproject/transport/TransportIntegrationTest.java +++ b/briar-tests/src/org/briarproject/transport/TransportIntegrationTest.java @@ -12,30 +12,19 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Random; -import static org.briarproject.api.transport.TransportConstants.MAX_FRAME_LENGTH; +import static org.briarproject.api.transport.TransportConstants.FRAME_HEADER_LENGTH; +import static org.briarproject.api.transport.TransportConstants.MAC_LENGTH; +import static org.briarproject.api.transport.TransportConstants.STREAM_HEADER_LENGTH; import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; public class TransportIntegrationTest extends BriarTestCase { - private final Random random; - - public TransportIntegrationTest() { - random = new Random(); - } + private final Random random = new Random(); @Test - public void testInitiatorWriteAndRead() throws Exception { - testWriteAndRead(true); - } - - @Test - public void testResponderWriteAndRead() throws Exception { - testWriteAndRead(false); - } - - private void testWriteAndRead(boolean initiator) throws Exception { + public void testWriteAndRead() throws Exception { // Generate a random tag byte[] tag = new byte[TAG_LENGTH]; random.nextBytes(tag); @@ -53,7 +42,10 @@ public class TransportIntegrationTest extends BriarTestCase { streamWriter.write(payload2); streamWriter.flush(); byte[] output = out.toByteArray(); - assertEquals(TAG_LENGTH + MAX_FRAME_LENGTH * 2, output.length); + assertEquals(TAG_LENGTH + STREAM_HEADER_LENGTH + + FRAME_HEADER_LENGTH + payload1.length + MAC_LENGTH + + FRAME_HEADER_LENGTH + payload2.length + MAC_LENGTH, + output.length); // Read the tag back ByteArrayInputStream in = new ByteArrayInputStream(output); byte[] recoveredTag = new byte[tag.length]; -- GitLab