Newer
Older
package org.briarproject.transport;
import org.briarproject.api.crypto.StreamEncrypter;
import org.briarproject.util.ByteUtils;
import java.io.IOException;
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.STREAM_HEADER_LENGTH;
class TestStreamEncrypter implements StreamEncrypter {
private final OutputStream out;
private boolean writeTagAndHeader = true;
TestStreamEncrypter(OutputStream out, byte[] tag) {
this.out = out;
this.tag = tag;
}
public void writeFrame(byte[] payload, int payloadLength,
int paddingLength, boolean finalFrame) throws IOException {
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();
private void writeTagAndHeader() throws IOException {
out.write(tag);
out.write(new byte[STREAM_HEADER_LENGTH]);
writeTagAndHeader = false;
}