mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 11:49:04 +01:00
Split the functionality of ConnectionWriterImpl into layers.
This commit is contained in:
@@ -44,18 +44,18 @@ class ConnectionReaderFactoryImpl implements ConnectionReaderFactory {
|
||||
// Create the decrypter
|
||||
Cipher tagCipher = crypto.getTagCipher();
|
||||
Cipher segCipher = crypto.getSegmentCipher();
|
||||
IncomingEncryptionLayer decrypter = new IncomingEncryptionLayerImpl(in,
|
||||
IncomingEncryptionLayer encryption = new IncomingEncryptionLayerImpl(in,
|
||||
tagCipher, segCipher, tagKey, segKey, false, bufferedTag);
|
||||
// No error correction
|
||||
IncomingErrorCorrectionLayer correcter =
|
||||
new NullIncomingErrorCorrectionLayer(decrypter);
|
||||
IncomingErrorCorrectionLayer correction =
|
||||
new NullIncomingErrorCorrectionLayer(encryption);
|
||||
// Create the authenticator
|
||||
Mac mac = crypto.getMac();
|
||||
IncomingAuthenticationLayer authenticator =
|
||||
new IncomingAuthenticationLayerImpl(correcter, mac, macKey);
|
||||
IncomingAuthenticationLayer authentication =
|
||||
new IncomingAuthenticationLayerImpl(correction, mac, macKey);
|
||||
// No reordering or retransmission
|
||||
IncomingReliabilityLayer reliability =
|
||||
new NullIncomingReliabilityLayer(authenticator);
|
||||
new NullIncomingReliabilityLayer(authentication);
|
||||
// Create the reader - don't tolerate errors
|
||||
return new ConnectionReaderImpl(reliability, false);
|
||||
}
|
||||
@@ -80,19 +80,19 @@ class ConnectionReaderFactoryImpl implements ConnectionReaderFactory {
|
||||
// Create the decrypter
|
||||
Cipher tagCipher = crypto.getTagCipher();
|
||||
Cipher segCipher = crypto.getSegmentCipher();
|
||||
IncomingEncryptionLayer decrypter =
|
||||
IncomingEncryptionLayer encryption =
|
||||
new IncomingSegmentedEncryptionLayer(in, tagCipher, segCipher,
|
||||
tagKey, segKey, false, bufferedSegment);
|
||||
// No error correction
|
||||
IncomingErrorCorrectionLayer correcter =
|
||||
new NullIncomingErrorCorrectionLayer(decrypter);
|
||||
IncomingErrorCorrectionLayer correction =
|
||||
new NullIncomingErrorCorrectionLayer(encryption);
|
||||
// Create the authenticator
|
||||
Mac mac = crypto.getMac();
|
||||
IncomingAuthenticationLayer authenticator =
|
||||
new IncomingAuthenticationLayerImpl(correcter, mac, macKey);
|
||||
IncomingAuthenticationLayer authentication =
|
||||
new IncomingAuthenticationLayerImpl(correction, mac, macKey);
|
||||
// No reordering or retransmission
|
||||
IncomingReliabilityLayer reliability =
|
||||
new NullIncomingReliabilityLayer(authenticator);
|
||||
new NullIncomingReliabilityLayer(authentication);
|
||||
// Create the reader - don't tolerate errors
|
||||
return new ConnectionReaderImpl(reliability, false);
|
||||
}
|
||||
|
||||
@@ -33,14 +33,20 @@ class ConnectionWriterFactoryImpl implements ConnectionWriterFactory {
|
||||
// Create the encrypter
|
||||
Cipher tagCipher = crypto.getTagCipher();
|
||||
Cipher segCipher = crypto.getSegmentCipher();
|
||||
OutgoingEncryptionLayer encrypter = new OutgoingEncryptionLayerImpl(out,
|
||||
capacity, tagCipher, segCipher, tagKey, segKey, false);
|
||||
OutgoingEncryptionLayer encryption = new OutgoingEncryptionLayerImpl(
|
||||
out, capacity, tagCipher, segCipher, tagKey, segKey, false);
|
||||
// No error correction
|
||||
OutgoingErrorCorrectionLayer correcter =
|
||||
new NullOutgoingErrorCorrectionLayer(encrypter);
|
||||
// Create the writer
|
||||
OutgoingErrorCorrectionLayer correction =
|
||||
new NullOutgoingErrorCorrectionLayer(encryption);
|
||||
// Authentication
|
||||
Mac mac = crypto.getMac();
|
||||
return new ConnectionWriterImpl(correcter, mac, macKey);
|
||||
OutgoingAuthenticationLayer authentication =
|
||||
new OutgoingAuthenticationLayerImpl(correction, mac, macKey);
|
||||
// No retransmission
|
||||
OutgoingReliabilityLayer reliability =
|
||||
new NullOutgoingReliabilityLayer(authentication);
|
||||
// Create the writer
|
||||
return new ConnectionWriterImpl(reliability);
|
||||
}
|
||||
|
||||
public ConnectionWriter createConnectionWriter(SegmentSink out,
|
||||
@@ -53,14 +59,20 @@ class ConnectionWriterFactoryImpl implements ConnectionWriterFactory {
|
||||
// Create the encrypter
|
||||
Cipher tagCipher = crypto.getTagCipher();
|
||||
Cipher segCipher = crypto.getSegmentCipher();
|
||||
OutgoingEncryptionLayer encrypter =
|
||||
OutgoingEncryptionLayer encryption =
|
||||
new OutgoingSegmentedEncryptionLayer(out, capacity, tagCipher,
|
||||
segCipher, tagKey, segKey, false);
|
||||
// No error correction
|
||||
OutgoingErrorCorrectionLayer correcter =
|
||||
new NullOutgoingErrorCorrectionLayer(encrypter);
|
||||
// Create the writer
|
||||
OutgoingErrorCorrectionLayer correction =
|
||||
new NullOutgoingErrorCorrectionLayer(encryption);
|
||||
// Authentication
|
||||
Mac mac = crypto.getMac();
|
||||
return new ConnectionWriterImpl(correcter, mac, macKey);
|
||||
OutgoingAuthenticationLayer authentication =
|
||||
new OutgoingAuthenticationLayerImpl(correction, mac, macKey);
|
||||
// No retransmission
|
||||
OutgoingReliabilityLayer reliability =
|
||||
new NullOutgoingReliabilityLayer(authentication);
|
||||
// Create the writer
|
||||
return new ConnectionWriterImpl(reliability);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,12 +7,7 @@ import static net.sf.briar.util.ByteUtils.MAX_32_BIT_UNSIGNED;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.security.InvalidKeyException;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.ShortBufferException;
|
||||
|
||||
import net.sf.briar.api.crypto.ErasableKey;
|
||||
import net.sf.briar.api.transport.ConnectionWriter;
|
||||
|
||||
/**
|
||||
@@ -23,26 +18,14 @@ import net.sf.briar.api.transport.ConnectionWriter;
|
||||
*/
|
||||
class ConnectionWriterImpl extends OutputStream implements ConnectionWriter {
|
||||
|
||||
private final OutgoingErrorCorrectionLayer out;
|
||||
private final Mac mac;
|
||||
private final OutgoingReliabilityLayer out;
|
||||
private final Frame frame;
|
||||
|
||||
private int offset = FRAME_HEADER_LENGTH;
|
||||
private long frameNumber = 0L;
|
||||
|
||||
ConnectionWriterImpl(OutgoingErrorCorrectionLayer out, Mac mac,
|
||||
ErasableKey macKey) {
|
||||
ConnectionWriterImpl(OutgoingReliabilityLayer out) {
|
||||
this.out = out;
|
||||
this.mac = mac;
|
||||
// Initialise the MAC
|
||||
try {
|
||||
mac.init(macKey);
|
||||
} catch(InvalidKeyException badKey) {
|
||||
throw new IllegalArgumentException(badKey);
|
||||
}
|
||||
macKey.erase();
|
||||
if(mac.getMacLength() != MAC_LENGTH)
|
||||
throw new IllegalArgumentException();
|
||||
frame = new Frame();
|
||||
}
|
||||
|
||||
@@ -96,16 +79,9 @@ class ConnectionWriterImpl extends OutputStream implements ConnectionWriter {
|
||||
|
||||
private void writeFrame() throws IOException {
|
||||
if(frameNumber > MAX_32_BIT_UNSIGNED) throw new IllegalStateException();
|
||||
byte[] buf = frame.getBuffer();
|
||||
int payloadLength = offset - FRAME_HEADER_LENGTH;
|
||||
assert payloadLength > 0;
|
||||
HeaderEncoder.encodeHeader(buf, frameNumber, payloadLength, 0);
|
||||
mac.update(buf, 0, offset);
|
||||
try {
|
||||
mac.doFinal(buf, offset);
|
||||
} catch(ShortBufferException badMac) {
|
||||
throw new RuntimeException(badMac);
|
||||
}
|
||||
int payload = offset - FRAME_HEADER_LENGTH;
|
||||
assert payload > 0;
|
||||
HeaderEncoder.encodeHeader(frame.getBuffer(), frameNumber, payload, 0);
|
||||
frame.setLength(offset + MAC_LENGTH);
|
||||
out.writeFrame(frame);
|
||||
offset = FRAME_HEADER_LENGTH;
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package net.sf.briar.transport;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
class NullOutgoingReliabilityLayer implements OutgoingReliabilityLayer {
|
||||
|
||||
private final OutgoingAuthenticationLayer out;
|
||||
|
||||
NullOutgoingReliabilityLayer(OutgoingAuthenticationLayer out) {
|
||||
this.out = out;
|
||||
}
|
||||
|
||||
public void writeFrame(Frame f) throws IOException {
|
||||
out.writeFrame(f);
|
||||
}
|
||||
|
||||
public void flush() throws IOException {
|
||||
out.flush();
|
||||
}
|
||||
|
||||
public long getRemainingCapacity() {
|
||||
return out.getRemainingCapacity();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package net.sf.briar.transport;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
interface OutgoingAuthenticationLayer {
|
||||
|
||||
/** Writes the given frame. */
|
||||
void writeFrame(Frame f) throws IOException;
|
||||
|
||||
/** Flushes the stack. */
|
||||
void flush() throws IOException;
|
||||
|
||||
/** Returns the maximum number of bytes that can be written. */
|
||||
long getRemainingCapacity();
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package net.sf.briar.transport;
|
||||
|
||||
import static net.sf.briar.api.transport.TransportConstants.MAC_LENGTH;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.InvalidKeyException;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.ShortBufferException;
|
||||
|
||||
import net.sf.briar.api.crypto.ErasableKey;
|
||||
|
||||
class OutgoingAuthenticationLayerImpl implements OutgoingAuthenticationLayer {
|
||||
|
||||
private final OutgoingErrorCorrectionLayer out;
|
||||
private final Mac mac;
|
||||
|
||||
OutgoingAuthenticationLayerImpl(OutgoingErrorCorrectionLayer out, Mac mac,
|
||||
ErasableKey macKey) {
|
||||
this.out = out;
|
||||
this.mac = mac;
|
||||
// Initialise the MAC
|
||||
try {
|
||||
mac.init(macKey);
|
||||
} catch(InvalidKeyException badKey) {
|
||||
throw new IllegalArgumentException(badKey);
|
||||
}
|
||||
macKey.erase();
|
||||
if(mac.getMacLength() != MAC_LENGTH)
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
public void writeFrame(Frame f) throws IOException {
|
||||
byte[] buf = f.getBuffer();
|
||||
int length = f.getLength() - MAC_LENGTH;
|
||||
mac.update(buf, 0, length);
|
||||
try {
|
||||
mac.doFinal(buf, length);
|
||||
} catch(ShortBufferException badMac) {
|
||||
throw new RuntimeException(badMac);
|
||||
}
|
||||
out.writeFrame(f);
|
||||
}
|
||||
|
||||
public void flush() throws IOException {
|
||||
out.flush();
|
||||
}
|
||||
|
||||
public long getRemainingCapacity() {
|
||||
return out.getRemainingCapacity();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package net.sf.briar.transport;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
interface OutgoingReliabilityLayer {
|
||||
|
||||
/** Writes the given frame. */
|
||||
void writeFrame(Frame f) throws IOException;
|
||||
|
||||
/** Flushes the stack. */
|
||||
void flush() throws IOException;
|
||||
|
||||
/** Returns the maximum number of bytes that can be written. */
|
||||
long getRemainingCapacity();
|
||||
}
|
||||
Reference in New Issue
Block a user