diff --git a/api/net/sf/briar/api/protocol/ProtocolWriter.java b/api/net/sf/briar/api/protocol/ProtocolWriter.java index fa07127b89650c04b79da4c43b44c289240b714d..fc30d803fd7fb7909794e6bd1e96754ba7d81992 100644 --- a/api/net/sf/briar/api/protocol/ProtocolWriter.java +++ b/api/net/sf/briar/api/protocol/ProtocolWriter.java @@ -4,8 +4,6 @@ import java.io.IOException; public interface ProtocolWriter { - void flush() throws IOException; - int getMaxBatchesForAck(long capacity); int getMaxMessagesForOffer(long capacity); @@ -23,4 +21,8 @@ public interface ProtocolWriter { void writeSubscriptionUpdate(SubscriptionUpdate s) throws IOException; void writeTransportUpdate(TransportUpdate t) throws IOException; + + void flush() throws IOException; + + void close() throws IOException; } diff --git a/api/net/sf/briar/api/transport/TransportConstants.java b/api/net/sf/briar/api/transport/TransportConstants.java index e0ee78b2d56eeeb487b7cd769c4c7cd16c1438b0..68eac6de0c5aaa263a62e4d0612993fbfb7192be 100644 --- a/api/net/sf/briar/api/transport/TransportConstants.java +++ b/api/net/sf/briar/api/transport/TransportConstants.java @@ -9,7 +9,7 @@ public interface TransportConstants { static final int MAX_FRAME_LENGTH = 65536; // 2^16, 64 KiB /** The length of the frame header in bytes. */ - static final int FRAME_HEADER_LENGTH = 8; + static final int FRAME_HEADER_LENGTH = 9; /** The length of the MAC in bytes. */ static final int MAC_LENGTH = 32; diff --git a/components/net/sf/briar/protocol/ProtocolWriterImpl.java b/components/net/sf/briar/protocol/ProtocolWriterImpl.java index 51e42998bd2b776eb1cae8c67470b14ad85d174f..467ef49d98dd2382db9e9e173e71cefc11eaa61b 100644 --- a/components/net/sf/briar/protocol/ProtocolWriterImpl.java +++ b/components/net/sf/briar/protocol/ProtocolWriterImpl.java @@ -147,4 +147,8 @@ class ProtocolWriterImpl implements ProtocolWriter { public void flush() throws IOException { out.flush(); } + + public void close() throws IOException { + out.close(); + } } diff --git a/components/net/sf/briar/protocol/duplex/DuplexConnection.java b/components/net/sf/briar/protocol/duplex/DuplexConnection.java index b55689222ecbef72e12066e675c76f6bea7ba372..bb172db2804891122e528474d30c35d0e5cc087a 100644 --- a/components/net/sf/briar/protocol/duplex/DuplexConnection.java +++ b/components/net/sf/briar/protocol/duplex/DuplexConnection.java @@ -215,6 +215,7 @@ abstract class DuplexConnection implements DatabaseListener { task.run(); } writer.flush(); + writer.close(); if(!disposed.getAndSet(true)) transport.dispose(false, true); } catch(DbException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString()); diff --git a/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java b/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java index 8d1082f8f1c9a26119cf760e0da377c0871071d9..880f2f5584cab6c3ab8916a9169aed87e6238f61 100644 --- a/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java +++ b/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java @@ -99,6 +99,7 @@ class OutgoingSimplexConnection { b = db.generateBatch(contactId, (int) capacity); } writer.flush(); + writer.close(); transport.dispose(false); } catch(DbException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString()); diff --git a/components/net/sf/briar/transport/ConnectionReaderImpl.java b/components/net/sf/briar/transport/ConnectionReaderImpl.java index ad539dc63b94d9a0b41f1d61e26e2fd886b3f070..cb84c45cd18c4e168a758ddb6191461c0faa6c3f 100644 --- a/components/net/sf/briar/transport/ConnectionReaderImpl.java +++ b/components/net/sf/briar/transport/ConnectionReaderImpl.java @@ -5,6 +5,7 @@ import static net.sf.briar.api.transport.TransportConstants.FRAME_HEADER_LENGTH; import java.io.IOException; import java.io.InputStream; +import net.sf.briar.api.FormatException; import net.sf.briar.api.transport.ConnectionReader; class ConnectionReaderImpl extends InputStream implements ConnectionReader { @@ -52,15 +53,14 @@ class ConnectionReaderImpl extends InputStream implements ConnectionReader { private boolean readFrame() throws IOException { assert length == 0; - while(true) { - frame.reset(); - if(!in.readFrame(frame)) { - length = -1; - return false; - } - offset = FRAME_HEADER_LENGTH; - length = HeaderEncoder.getPayloadLength(frame.getBuffer()); - return true; + if(HeaderEncoder.isLastFrame(frame.getBuffer())) { + length = -1; + return false; } + frame.reset(); + if(!in.readFrame(frame)) throw new FormatException(); + offset = FRAME_HEADER_LENGTH; + length = HeaderEncoder.getPayloadLength(frame.getBuffer()); + return true; } } diff --git a/components/net/sf/briar/transport/ConnectionWriterImpl.java b/components/net/sf/briar/transport/ConnectionWriterImpl.java index bc95444f19bfd06e3a8067ef7a1cffac95ebbf82..e0a1a16bc0e281de6fdd940114683f6cdb4eae0e 100644 --- a/components/net/sf/briar/transport/ConnectionWriterImpl.java +++ b/components/net/sf/briar/transport/ConnectionWriterImpl.java @@ -45,16 +45,23 @@ class ConnectionWriterImpl extends OutputStream implements ConnectionWriter { return Math.max(0L, capacity - frames * overheadPerFrame); } + @Override + public void close() throws IOException { + if(offset > FRAME_HEADER_LENGTH || frameNumber > 0L) writeFrame(true); + out.flush(); + super.close(); + } + @Override public void flush() throws IOException { - if(offset > FRAME_HEADER_LENGTH) writeFrame(); + if(offset > FRAME_HEADER_LENGTH) writeFrame(false); out.flush(); } @Override public void write(int b) throws IOException { frame.getBuffer()[offset++] = (byte) b; - if(offset + MAC_LENGTH == MAX_FRAME_LENGTH) writeFrame(); + if(offset + MAC_LENGTH == MAX_FRAME_LENGTH) writeFrame(false); } @Override @@ -69,7 +76,7 @@ class ConnectionWriterImpl extends OutputStream implements ConnectionWriter { while(available <= len) { System.arraycopy(b, off, buf, offset, available); offset += available; - writeFrame(); + writeFrame(false); off += available; len -= available; available = MAX_FRAME_LENGTH - offset - MAC_LENGTH; @@ -78,11 +85,12 @@ class ConnectionWriterImpl extends OutputStream implements ConnectionWriter { offset += len; } - private void writeFrame() throws IOException { + private void writeFrame(boolean lastFrame) throws IOException { if(frameNumber > MAX_32_BIT_UNSIGNED) throw new IllegalStateException(); int payload = offset - FRAME_HEADER_LENGTH; - assert payload > 0; - HeaderEncoder.encodeHeader(frame.getBuffer(), frameNumber, payload, 0); + assert payload >= 0; + HeaderEncoder.encodeHeader(frame.getBuffer(), frameNumber, payload, 0, + lastFrame); frame.setLength(offset + MAC_LENGTH); out.writeFrame(frame); frame.reset(); diff --git a/components/net/sf/briar/transport/HeaderEncoder.java b/components/net/sf/briar/transport/HeaderEncoder.java index 42c80d352952d05d37d4692bd0b7cc2071c354a8..4240406e4e8ee13ad32a7c863838be3eb7be65a4 100644 --- a/components/net/sf/briar/transport/HeaderEncoder.java +++ b/components/net/sf/briar/transport/HeaderEncoder.java @@ -1,12 +1,13 @@ package net.sf.briar.transport; import static net.sf.briar.api.transport.TransportConstants.FRAME_HEADER_LENGTH; +import static net.sf.briar.api.transport.TransportConstants.MAC_LENGTH; import net.sf.briar.util.ByteUtils; class HeaderEncoder { static void encodeHeader(byte[] header, long frameNumber, int payload, - int padding) { + int padding, boolean lastFrame) { if(header.length < FRAME_HEADER_LENGTH) throw new IllegalArgumentException(); if(frameNumber < 0 || frameNumber > ByteUtils.MAX_32_BIT_UNSIGNED) @@ -18,6 +19,18 @@ class HeaderEncoder { ByteUtils.writeUint32(frameNumber, header, 0); ByteUtils.writeUint16(payload, header, 4); ByteUtils.writeUint16(padding, header, 6); + if(lastFrame) header[8] = 1; + } + + static boolean checkHeader(byte[] header, int length) { + if(header.length < FRAME_HEADER_LENGTH) + throw new IllegalArgumentException(); + int payload = getPayloadLength(header); + int padding = getPaddingLength(header); + if(FRAME_HEADER_LENGTH + payload + padding + MAC_LENGTH != length) + return false; + if(header[8] != 0 && header[8] != 1) return false; + return true; } static long getFrameNumber(byte[] header) { @@ -37,4 +50,10 @@ class HeaderEncoder { throw new IllegalArgumentException(); return ByteUtils.readUint16(header, 6); } + + static boolean isLastFrame(byte[] header) { + if(header.length < FRAME_HEADER_LENGTH) + throw new IllegalArgumentException(); + return header[8] == 1; + } } diff --git a/components/net/sf/briar/transport/IncomingAuthenticationLayerImpl.java b/components/net/sf/briar/transport/IncomingAuthenticationLayerImpl.java index 81cacbae19a5d29811c0979b6a695e69910ec1cf..d682c9e622eaa352038b6dac9d1857816ceca2da 100644 --- a/components/net/sf/briar/transport/IncomingAuthenticationLayerImpl.java +++ b/components/net/sf/briar/transport/IncomingAuthenticationLayerImpl.java @@ -39,13 +39,12 @@ class IncomingAuthenticationLayerImpl implements FrameReader { if(length < FRAME_HEADER_LENGTH + MAC_LENGTH) throw new FormatException(); if(length > MAX_FRAME_LENGTH) throw new FormatException(); - // Check that the payload and padding lengths are correct + // Check that the header fields are legal and match the length byte[] buf = f.getBuffer(); + if(!HeaderEncoder.checkHeader(buf, length)) throw new FormatException(); + // Check that the padding is all zeroes int payload = HeaderEncoder.getPayloadLength(buf); int padding = HeaderEncoder.getPaddingLength(buf); - if(length != FRAME_HEADER_LENGTH + payload + padding + MAC_LENGTH) - throw new FormatException(); - // Check that the padding is all zeroes int paddingStart = FRAME_HEADER_LENGTH + payload; for(int i = paddingStart; i < paddingStart + padding; i++) { if(buf[i] != 0) throw new FormatException(); diff --git a/test/net/sf/briar/protocol/simplex/SimplexConnectionReadWriteTest.java b/test/net/sf/briar/protocol/simplex/SimplexConnectionReadWriteTest.java index 59bc557661594046317524462ba06f8c46730ec1..64d43f53f4796d6d72859a41106ec8cf7a10a850 100644 --- a/test/net/sf/briar/protocol/simplex/SimplexConnectionReadWriteTest.java +++ b/test/net/sf/briar/protocol/simplex/SimplexConnectionReadWriteTest.java @@ -116,11 +116,11 @@ public class SimplexConnectionReadWriteTest extends BriarTestCase { alice.getInstance(ProtocolWriterFactory.class); TestSimplexTransportWriter transport = new TestSimplexTransportWriter(out, Long.MAX_VALUE, false); - OutgoingSimplexConnection batchOut = new OutgoingSimplexConnection(db, + OutgoingSimplexConnection simplex = new OutgoingSimplexConnection(db, connRegistry, connFactory, protoFactory, contactId, transportId, transportIndex, transport); // Write whatever needs to be written - batchOut.write(); + simplex.write(); assertTrue(transport.getDisposed()); assertFalse(transport.getException()); // Close Alice's database @@ -171,14 +171,14 @@ public class SimplexConnectionReadWriteTest extends BriarTestCase { ProtocolReaderFactory protoFactory = bob.getInstance(ProtocolReaderFactory.class); TestSimplexTransportReader transport = new TestSimplexTransportReader(in); - IncomingSimplexConnection batchIn = new IncomingSimplexConnection( + IncomingSimplexConnection simplex = new IncomingSimplexConnection( new ImmediateExecutor(), new ImmediateExecutor(), db, connRegistry, connFactory, protoFactory, ctx, transportId, transport); // No messages should have been added yet assertFalse(listener.messagesAdded); // Read whatever needs to be read - batchIn.read(); + simplex.read(); assertTrue(transport.getDisposed()); assertFalse(transport.getException()); assertTrue(transport.getRecognised()); diff --git a/test/net/sf/briar/transport/ConnectionReaderImplTest.java b/test/net/sf/briar/transport/ConnectionReaderImplTest.java index 92d431cfa8548ca926fb4820db30ae089bea3ebf..da0c140a29071d43926822a3a4757cf4e5deedb3 100644 --- a/test/net/sf/briar/transport/ConnectionReaderImplTest.java +++ b/test/net/sf/briar/transport/ConnectionReaderImplTest.java @@ -26,7 +26,7 @@ public class ConnectionReaderImplTest extends TransportTest { int payloadLength = 0; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, true); // Calculate the MAC mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); @@ -43,7 +43,7 @@ public class ConnectionReaderImplTest extends TransportTest { int payloadLength = 1; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, true); // Calculate the MAC mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); @@ -60,13 +60,13 @@ public class ConnectionReaderImplTest extends TransportTest { public void testMaxLength() throws Exception { // First frame: max payload length byte[] frame = new byte[MAX_FRAME_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, MAX_PAYLOAD_LENGTH, 0); + HeaderEncoder.encodeHeader(frame, 0, MAX_PAYLOAD_LENGTH, 0, false); mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH); mac.doFinal(frame, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH); // Second frame: max payload length plus one byte[] frame1 = new byte[MAX_FRAME_LENGTH + 1]; - HeaderEncoder.encodeHeader(frame1, 1, MAX_PAYLOAD_LENGTH + 1, 0); + HeaderEncoder.encodeHeader(frame1, 1, MAX_PAYLOAD_LENGTH + 1, 0, false); mac.update(frame1, 0, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH + 1); mac.doFinal(frame1, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH + 1); // Concatenate the frames @@ -92,14 +92,14 @@ public class ConnectionReaderImplTest extends TransportTest { // First frame: max payload length, including padding byte[] frame = new byte[MAX_FRAME_LENGTH]; HeaderEncoder.encodeHeader(frame, 0, MAX_PAYLOAD_LENGTH - paddingLength, - paddingLength); + paddingLength, false); mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH); mac.doFinal(frame, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH); // Second frame: max payload length plus one, including padding byte[] frame1 = new byte[MAX_FRAME_LENGTH + 1]; HeaderEncoder.encodeHeader(frame1, 1, - MAX_PAYLOAD_LENGTH + 1 - paddingLength, paddingLength); + MAX_PAYLOAD_LENGTH + 1 - paddingLength, paddingLength, false); mac.update(frame1, 0, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH + 1); mac.doFinal(frame1, FRAME_HEADER_LENGTH + MAX_PAYLOAD_LENGTH + 1); // Concatenate the frames @@ -124,7 +124,8 @@ public class ConnectionReaderImplTest extends TransportTest { int payloadLength = 10, paddingLength = 10; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + paddingLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, paddingLength); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, paddingLength, + false); // Set a byte of the padding to a non-zero value frame[FRAME_HEADER_LENGTH + payloadLength] = 1; mac.init(macKey); @@ -147,7 +148,7 @@ public class ConnectionReaderImplTest extends TransportTest { int payloadLength = 123; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, false); mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); mac.doFinal(frame, FRAME_HEADER_LENGTH + payloadLength); @@ -155,7 +156,7 @@ public class ConnectionReaderImplTest extends TransportTest { int payloadLength1 = 1234; byte[] frame1 = new byte[FRAME_HEADER_LENGTH + payloadLength1 + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame1, 1, payloadLength1, 0); + HeaderEncoder.encodeHeader(frame1, 1, payloadLength1, 0, true); mac.update(frame1, 0, FRAME_HEADER_LENGTH + payloadLength1); mac.doFinal(frame1, FRAME_HEADER_LENGTH + payloadLength1); // Concatenate the frames @@ -171,6 +172,43 @@ public class ConnectionReaderImplTest extends TransportTest { byte[] read1 = new byte[payloadLength1]; TestUtils.readFully(r.getInputStream(), read1); assertArrayEquals(new byte[payloadLength1], read1); + assertEquals(-1, r.getInputStream().read()); + } + + @Test + public void testLastFrameNotMarkedAsSuch() throws Exception { + // First frame: 123-byte payload + int payloadLength = 123; + byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + + MAC_LENGTH]; + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, false); + mac.init(macKey); + mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); + mac.doFinal(frame, FRAME_HEADER_LENGTH + payloadLength); + // Second frame: 1234-byte payload + int payloadLength1 = 1234; + byte[] frame1 = new byte[FRAME_HEADER_LENGTH + payloadLength1 + + MAC_LENGTH]; + HeaderEncoder.encodeHeader(frame1, 1, payloadLength1, 0, false); + mac.update(frame1, 0, FRAME_HEADER_LENGTH + payloadLength1); + mac.doFinal(frame1, FRAME_HEADER_LENGTH + payloadLength1); + // Concatenate the frames + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(frame); + out.write(frame1); + // Read the frames + ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); + ConnectionReader r = createConnectionReader(in); + byte[] read = new byte[payloadLength]; + TestUtils.readFully(r.getInputStream(), read); + assertArrayEquals(new byte[payloadLength], read); + byte[] read1 = new byte[payloadLength1]; + TestUtils.readFully(r.getInputStream(), read1); + assertArrayEquals(new byte[payloadLength1], read1); + try { + r.getInputStream().read(); + fail(); + } catch(FormatException expected) {} } @Test @@ -178,7 +216,7 @@ public class ConnectionReaderImplTest extends TransportTest { int payloadLength = 8; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, false); // Calculate the MAC mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); @@ -199,7 +237,7 @@ public class ConnectionReaderImplTest extends TransportTest { int payloadLength = 8; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, false); // Calculate the MAC mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); diff --git a/test/net/sf/briar/transport/ConnectionWriterImplTest.java b/test/net/sf/briar/transport/ConnectionWriterImplTest.java index 335b922204e6f3206b604cc962cd4eafdce66e35..5f825e1711839412a1be295132c30af0a45348b6 100644 --- a/test/net/sf/briar/transport/ConnectionWriterImplTest.java +++ b/test/net/sf/briar/transport/ConnectionWriterImplTest.java @@ -33,7 +33,7 @@ public class ConnectionWriterImplTest extends TransportTest { int payloadLength = 1; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, false); // Calculate the MAC mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); @@ -78,7 +78,7 @@ public class ConnectionWriterImplTest extends TransportTest { int payloadLength = 123; byte[] frame = new byte[FRAME_HEADER_LENGTH + payloadLength + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0); + HeaderEncoder.encodeHeader(frame, 0, payloadLength, 0, false); mac.init(macKey); mac.update(frame, 0, FRAME_HEADER_LENGTH + payloadLength); mac.doFinal(frame, FRAME_HEADER_LENGTH + payloadLength); @@ -86,7 +86,7 @@ public class ConnectionWriterImplTest extends TransportTest { int payloadLength1 = 1234; byte[] frame1 = new byte[FRAME_HEADER_LENGTH + payloadLength1 + MAC_LENGTH]; - HeaderEncoder.encodeHeader(frame1, 1, payloadLength1, 0); + HeaderEncoder.encodeHeader(frame1, 1, payloadLength1, 0, false); mac.update(frame1, 0, FRAME_HEADER_LENGTH + 1234); mac.doFinal(frame1, FRAME_HEADER_LENGTH + 1234); // Concatenate the frames diff --git a/test/net/sf/briar/transport/IncomingEncryptionLayerImplTest.java b/test/net/sf/briar/transport/IncomingEncryptionLayerImplTest.java index 58c80823aba6b436d462d340697a56daa57d87d7..1b3f09759393e1607980200a81846b9693b6abb7 100644 --- a/test/net/sf/briar/transport/IncomingEncryptionLayerImplTest.java +++ b/test/net/sf/briar/transport/IncomingEncryptionLayerImplTest.java @@ -42,14 +42,14 @@ public class IncomingEncryptionLayerImplTest extends BriarTestCase { TagEncoder.encodeTag(tag, tagCipher, tagKey); // Calculate the ciphertext for the first frame byte[] plaintext = new byte[FRAME_HEADER_LENGTH + 123 + MAC_LENGTH]; - HeaderEncoder.encodeHeader(plaintext, 0L, 123, 0); + HeaderEncoder.encodeHeader(plaintext, 0L, 123, 0, false); byte[] iv = IvEncoder.encodeIv(0L, frameCipher.getBlockSize()); IvParameterSpec ivSpec = new IvParameterSpec(iv); frameCipher.init(Cipher.ENCRYPT_MODE, frameKey, ivSpec); byte[] ciphertext = frameCipher.doFinal(plaintext, 0, plaintext.length); // Calculate the ciphertext for the second frame byte[] plaintext1 = new byte[FRAME_HEADER_LENGTH + 1234 + MAC_LENGTH]; - HeaderEncoder.encodeHeader(plaintext1, 1L, 1234, 0); + HeaderEncoder.encodeHeader(plaintext1, 1L, 1234, 0, false); IvEncoder.updateIv(iv, 1L); ivSpec = new IvParameterSpec(iv); frameCipher.init(Cipher.ENCRYPT_MODE, frameKey, ivSpec); @@ -87,14 +87,14 @@ public class IncomingEncryptionLayerImplTest extends BriarTestCase { public void testDecryptionWithoutTag() throws Exception { // Calculate the ciphertext for the first frame byte[] plaintext = new byte[FRAME_HEADER_LENGTH + 123 + MAC_LENGTH]; - HeaderEncoder.encodeHeader(plaintext, 0L, 123, 0); + HeaderEncoder.encodeHeader(plaintext, 0L, 123, 0, false); byte[] iv = IvEncoder.encodeIv(0L, frameCipher.getBlockSize()); IvParameterSpec ivSpec = new IvParameterSpec(iv); frameCipher.init(Cipher.ENCRYPT_MODE, frameKey, ivSpec); byte[] ciphertext = frameCipher.doFinal(plaintext, 0, plaintext.length); // Calculate the ciphertext for the second frame byte[] plaintext1 = new byte[FRAME_HEADER_LENGTH + 1234 + MAC_LENGTH]; - HeaderEncoder.encodeHeader(plaintext1, 1L, 1234, 0); + HeaderEncoder.encodeHeader(plaintext1, 1L, 1234, 0, false); IvEncoder.updateIv(iv, 1L); ivSpec = new IvParameterSpec(iv); frameCipher.init(Cipher.ENCRYPT_MODE, frameKey, ivSpec);