diff --git a/api/net/sf/briar/api/protocol/MessageEncoder.java b/api/net/sf/briar/api/protocol/MessageEncoder.java deleted file mode 100644 index f587c0c1b20c63f73ebede14ce47eb4193b54746..0000000000000000000000000000000000000000 --- a/api/net/sf/briar/api/protocol/MessageEncoder.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.sf.briar.api.protocol; - -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.security.PrivateKey; - - -public interface MessageEncoder { - - /** Encodes a private message. */ - Message encodeMessage(MessageId parent, String subject, byte[] body) - throws IOException, GeneralSecurityException; - - /** Encodes an anonymous message to an unrestricted group. */ - Message encodeMessage(MessageId parent, Group group, String subject, - byte[] body) throws IOException, GeneralSecurityException; - - /** Encodes an anonymous message to a restricted group. */ - Message encodeMessage(MessageId parent, Group group, PrivateKey groupKey, - String subject, byte[] body) throws IOException, - GeneralSecurityException; - - /** Encodes a pseudonymous message to an unrestricted group. */ - Message encodeMessage(MessageId parent, Group group, Author author, - PrivateKey authorKey, String subject, byte[] body) - throws IOException, GeneralSecurityException; - - /** Encode a pseudonymous message to a restricted group. */ - Message encodeMessage(MessageId parent, Group group, PrivateKey groupKey, - Author author, PrivateKey authorKey, String subject, byte[] body) - throws IOException, GeneralSecurityException; -} diff --git a/api/net/sf/briar/api/protocol/MessageFactory.java b/api/net/sf/briar/api/protocol/MessageFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..2c9dbe50e230b3ca09ddf9be78b79de66b691eb7 --- /dev/null +++ b/api/net/sf/briar/api/protocol/MessageFactory.java @@ -0,0 +1,31 @@ +package net.sf.briar.api.protocol; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.security.PrivateKey; + +public interface MessageFactory { + + /** Creates a private message. */ + Message createMessage(MessageId parent, String subject, byte[] body) + throws IOException, GeneralSecurityException; + + /** Creates an anonymous message to an unrestricted group. */ + Message createMessage(MessageId parent, Group group, String subject, + byte[] body) throws IOException, GeneralSecurityException; + + /** Creates an anonymous message to a restricted group. */ + Message createMessage(MessageId parent, Group group, PrivateKey groupKey, + String subject, byte[] body) throws IOException, + GeneralSecurityException; + + /** Creates a pseudonymous message to an unrestricted group. */ + Message createMessage(MessageId parent, Group group, Author author, + PrivateKey authorKey, String subject, byte[] body) + throws IOException, GeneralSecurityException; + + /** Creates a pseudonymous message to a restricted group. */ + Message createMessage(MessageId parent, Group group, PrivateKey groupKey, + Author author, PrivateKey authorKey, String subject, byte[] body) + throws IOException, GeneralSecurityException; +} diff --git a/components/net/sf/briar/protocol/AckReader.java b/components/net/sf/briar/protocol/AckReader.java index 870abefdfd12624925d392514fa3e590217a1e7c..5e50db75e1e501848e16ff3e22190ab1ce87f71b 100644 --- a/components/net/sf/briar/protocol/AckReader.java +++ b/components/net/sf/briar/protocol/AckReader.java @@ -3,10 +3,12 @@ package net.sf.briar.protocol; import java.io.IOException; import java.util.Collection; +import net.sf.briar.api.FormatException; import net.sf.briar.api.protocol.Ack; import net.sf.briar.api.protocol.BatchId; import net.sf.briar.api.protocol.ProtocolConstants; import net.sf.briar.api.protocol.Types; +import net.sf.briar.api.protocol.UniqueId; import net.sf.briar.api.serial.Consumer; import net.sf.briar.api.serial.CountingConsumer; import net.sf.briar.api.serial.ObjectReader; @@ -14,12 +16,12 @@ import net.sf.briar.api.serial.Reader; class AckReader implements ObjectReader<Ack> { - private final ObjectReader<BatchId> batchIdReader; private final AckFactory ackFactory; + private final ObjectReader<BatchId> batchIdReader; - AckReader(ObjectReader<BatchId> batchIdReader, AckFactory ackFactory) { - this.batchIdReader = batchIdReader; + AckReader(AckFactory ackFactory) { this.ackFactory = ackFactory; + batchIdReader = new BatchIdReader(); } public Ack readObject(Reader r) throws IOException { @@ -36,4 +38,14 @@ class AckReader implements ObjectReader<Ack> { // Build and return the ack return ackFactory.createAck(batches); } + + private static class BatchIdReader implements ObjectReader<BatchId> { + + public BatchId readObject(Reader r) throws IOException { + r.readUserDefinedId(Types.BATCH_ID); + byte[] b = r.readBytes(UniqueId.LENGTH); + if(b.length != UniqueId.LENGTH) throw new FormatException(); + return new BatchId(b); + } + } } diff --git a/components/net/sf/briar/protocol/BatchIdReader.java b/components/net/sf/briar/protocol/BatchIdReader.java deleted file mode 100644 index f288f04ab2e00999eecde23616a6c6eb1d848336..0000000000000000000000000000000000000000 --- a/components/net/sf/briar/protocol/BatchIdReader.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.sf.briar.protocol; - -import java.io.IOException; - -import net.sf.briar.api.FormatException; -import net.sf.briar.api.protocol.BatchId; -import net.sf.briar.api.protocol.Types; -import net.sf.briar.api.protocol.UniqueId; -import net.sf.briar.api.serial.ObjectReader; -import net.sf.briar.api.serial.Reader; - -class BatchIdReader implements ObjectReader<BatchId> { - - public BatchId readObject(Reader r) throws IOException { - r.readUserDefinedId(Types.BATCH_ID); - byte[] b = r.readBytes(UniqueId.LENGTH); - if(b.length != UniqueId.LENGTH) throw new FormatException(); - return new BatchId(b); - } -} diff --git a/components/net/sf/briar/protocol/MessageEncoderImpl.java b/components/net/sf/briar/protocol/MessageFactoryImpl.java similarity index 75% rename from components/net/sf/briar/protocol/MessageEncoderImpl.java rename to components/net/sf/briar/protocol/MessageFactoryImpl.java index 143c337831c8c2ec4b0ddcbef88a36534f4e4c1d..f769af3cd105e0927733de2387dd132f46102792 100644 --- a/components/net/sf/briar/protocol/MessageEncoderImpl.java +++ b/components/net/sf/briar/protocol/MessageFactoryImpl.java @@ -1,5 +1,11 @@ package net.sf.briar.protocol; +import static net.sf.briar.api.protocol.ProtocolConstants.MAX_BODY_LENGTH; +import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH; +import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SIGNATURE_LENGTH; +import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SUBJECT_LENGTH; +import static net.sf.briar.api.protocol.ProtocolConstants.SALT_LENGTH; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; @@ -14,9 +20,8 @@ import net.sf.briar.api.protocol.AuthorId; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupId; import net.sf.briar.api.protocol.Message; -import net.sf.briar.api.protocol.MessageEncoder; +import net.sf.briar.api.protocol.MessageFactory; import net.sf.briar.api.protocol.MessageId; -import net.sf.briar.api.protocol.ProtocolConstants; import net.sf.briar.api.protocol.Types; import net.sf.briar.api.serial.Consumer; import net.sf.briar.api.serial.CountingConsumer; @@ -27,7 +32,7 @@ import net.sf.briar.api.serial.WriterFactory; import com.google.inject.Inject; -class MessageEncoderImpl implements MessageEncoder { +class MessageFactoryImpl implements MessageFactory { private final Signature authorSignature, groupSignature; private final SecureRandom random; @@ -35,7 +40,7 @@ class MessageEncoderImpl implements MessageEncoder { private final WriterFactory writerFactory; @Inject - MessageEncoderImpl(CryptoComponent crypto, WriterFactory writerFactory) { + MessageFactoryImpl(CryptoComponent crypto, WriterFactory writerFactory) { authorSignature = crypto.getSignature(); groupSignature = crypto.getSignature(); random = crypto.getSecureRandom(); @@ -43,50 +48,49 @@ class MessageEncoderImpl implements MessageEncoder { this.writerFactory = writerFactory; } - public Message encodeMessage(MessageId parent, String subject, byte[] body) + public Message createMessage(MessageId parent, String subject, byte[] body) throws IOException, GeneralSecurityException { - return encodeMessage(parent, null, null, null, null, subject, body); + return createMessage(parent, null, null, null, null, subject, body); } - public Message encodeMessage(MessageId parent, Group group, String subject, + public Message createMessage(MessageId parent, Group group, String subject, byte[] body) throws IOException, GeneralSecurityException { - return encodeMessage(parent, group, null, null, null, subject, body); + return createMessage(parent, group, null, null, null, subject, body); } - public Message encodeMessage(MessageId parent, Group group, + public Message createMessage(MessageId parent, Group group, PrivateKey groupKey, String subject, byte[] body) throws IOException, GeneralSecurityException { - return encodeMessage(parent, group, groupKey, null, null, subject, + return createMessage(parent, group, groupKey, null, null, subject, body); } - public Message encodeMessage(MessageId parent, Group group, Author author, + public Message createMessage(MessageId parent, Group group, Author author, PrivateKey authorKey, String subject, byte[] body) throws IOException, GeneralSecurityException { - return encodeMessage(parent, group, null, author, authorKey, subject, + return createMessage(parent, group, null, author, authorKey, subject, body); } - public Message encodeMessage(MessageId parent, Group group, + public Message createMessage(MessageId parent, Group group, PrivateKey groupKey, Author author, PrivateKey authorKey, String subject, byte[] body) throws IOException, GeneralSecurityException { if((author == null) != (authorKey == null)) throw new IllegalArgumentException(); - if((group == null || group.getPublicKey() == null) != - (groupKey == null)) + if((group == null || group.getPublicKey() == null) + != (groupKey == null)) throw new IllegalArgumentException(); - if(subject.getBytes("UTF-8").length > ProtocolConstants.MAX_SUBJECT_LENGTH) + if(subject.getBytes("UTF-8").length > MAX_SUBJECT_LENGTH) throw new IllegalArgumentException(); - if(body.length > ProtocolConstants.MAX_BODY_LENGTH) + if(body.length > MAX_BODY_LENGTH) throw new IllegalArgumentException(); ByteArrayOutputStream out = new ByteArrayOutputStream(); Writer w = writerFactory.createWriter(out); // Initialise the consumers - CountingConsumer counting = new CountingConsumer( - ProtocolConstants.MAX_PACKET_LENGTH); + CountingConsumer counting = new CountingConsumer(MAX_PACKET_LENGTH); w.addConsumer(counting); Consumer digestingConsumer = new DigestingConsumer(messageDigest); w.addConsumer(digestingConsumer); @@ -113,7 +117,7 @@ class MessageEncoderImpl implements MessageEncoder { w.writeString(subject); long timestamp = System.currentTimeMillis(); w.writeInt64(timestamp); - byte[] salt = new byte[ProtocolConstants.SALT_LENGTH]; + byte[] salt = new byte[SALT_LENGTH]; random.nextBytes(salt); w.writeBytes(salt); w.writeBytes(body); @@ -124,7 +128,7 @@ class MessageEncoderImpl implements MessageEncoder { } else { w.removeConsumer(authorConsumer); byte[] sig = authorSignature.sign(); - if(sig.length > ProtocolConstants.MAX_SIGNATURE_LENGTH) + if(sig.length > MAX_SIGNATURE_LENGTH) throw new IllegalArgumentException(); w.writeBytes(sig); } @@ -134,7 +138,7 @@ class MessageEncoderImpl implements MessageEncoder { } else { w.removeConsumer(groupConsumer); byte[] sig = groupSignature.sign(); - if(sig.length > ProtocolConstants.MAX_SIGNATURE_LENGTH) + if(sig.length > MAX_SIGNATURE_LENGTH) throw new IllegalArgumentException(); w.writeBytes(sig); } diff --git a/components/net/sf/briar/protocol/ProtocolModule.java b/components/net/sf/briar/protocol/ProtocolModule.java index b19a08f865c598e6890d2c9ecc2d209a69809720..99d3f0b6427026e6225a74e7d2ff1c309c78904d 100644 --- a/components/net/sf/briar/protocol/ProtocolModule.java +++ b/components/net/sf/briar/protocol/ProtocolModule.java @@ -5,11 +5,10 @@ import net.sf.briar.api.protocol.Ack; import net.sf.briar.api.protocol.Author; import net.sf.briar.api.protocol.AuthorFactory; import net.sf.briar.api.protocol.Batch; -import net.sf.briar.api.protocol.BatchId; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.Message; -import net.sf.briar.api.protocol.MessageEncoder; +import net.sf.briar.api.protocol.MessageFactory; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.ProtocolReaderFactory; @@ -29,7 +28,7 @@ public class ProtocolModule extends AbstractModule { bind(AuthorFactory.class).to(AuthorFactoryImpl.class); bind(BatchFactory.class).to(BatchFactoryImpl.class); bind(GroupFactory.class).to(GroupFactoryImpl.class); - bind(MessageEncoder.class).to(MessageEncoderImpl.class); + bind(MessageFactory.class).to(MessageFactoryImpl.class); bind(OfferFactory.class).to(OfferFactoryImpl.class); bind(ProtocolReaderFactory.class).to(ProtocolReaderFactoryImpl.class); bind(RequestFactory.class).to(RequestFactoryImpl.class); @@ -38,9 +37,8 @@ public class ProtocolModule extends AbstractModule { } @Provides - ObjectReader<Ack> getAckReader(ObjectReader<BatchId> batchIdReader, - AckFactory ackFactory) { - return new AckReader(batchIdReader, ackFactory); + ObjectReader<Ack> getAckReader(AckFactory ackFactory) { + return new AckReader(ackFactory); } @Provides @@ -55,11 +53,6 @@ public class ProtocolModule extends AbstractModule { return new BatchReader(crypto, messageReader, batchFactory); } - @Provides - ObjectReader<BatchId> getBatchIdReader() { - return new BatchIdReader(); - } - @Provides ObjectReader<Group> getGroupReader(CryptoComponent crypto, GroupFactory groupFactory) { diff --git a/test/net/sf/briar/ProtocolIntegrationTest.java b/test/net/sf/briar/ProtocolIntegrationTest.java index c2d875726c6fc402f9fad08d019de8006ae1bc0a..cd0ad582f35525d2897c2c14fdade3283001f7ac 100644 --- a/test/net/sf/briar/ProtocolIntegrationTest.java +++ b/test/net/sf/briar/ProtocolIntegrationTest.java @@ -28,7 +28,7 @@ import net.sf.briar.api.protocol.BatchId; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.Message; -import net.sf.briar.api.protocol.MessageEncoder; +import net.sf.briar.api.protocol.MessageFactory; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.ProtocolReader; @@ -129,16 +129,16 @@ public class ProtocolIntegrationTest extends TestCase { author = authorFactory.createAuthor(authorName, authorKeyPair.getPublic().getEncoded()); // Create two messages to each group: one anonymous, one pseudonymous - MessageEncoder messageEncoder = i.getInstance(MessageEncoder.class); - message = messageEncoder.encodeMessage(null, group, subject, + MessageFactory messageFactory = i.getInstance(MessageFactory.class); + message = messageFactory.createMessage(null, group, subject, messageBody.getBytes("UTF-8")); - message1 = messageEncoder.encodeMessage(null, group1, + message1 = messageFactory.createMessage(null, group1, groupKeyPair.getPrivate(), subject, messageBody.getBytes("UTF-8")); - message2 = messageEncoder.encodeMessage(null, group, author, + message2 = messageFactory.createMessage(null, group, author, authorKeyPair.getPrivate(), subject, messageBody.getBytes("UTF-8")); - message3 = messageEncoder.encodeMessage(null, group1, + message3 = messageFactory.createMessage(null, group1, groupKeyPair.getPrivate(), author, authorKeyPair.getPrivate(), subject, messageBody.getBytes("UTF-8")); // Create some transports diff --git a/test/net/sf/briar/protocol/AckReaderTest.java b/test/net/sf/briar/protocol/AckReaderTest.java index ba604af07a5948c32abe452000bf2ee63d2e2986..ebb71bd1747b183004e2931134e2071c6997e922 100644 --- a/test/net/sf/briar/protocol/AckReaderTest.java +++ b/test/net/sf/briar/protocol/AckReaderTest.java @@ -43,7 +43,7 @@ public class AckReaderTest extends TestCase { @Test public void testFormatExceptionIfAckIsTooLarge() throws Exception { AckFactory ackFactory = context.mock(AckFactory.class); - AckReader ackReader = new AckReader(new BatchIdReader(), ackFactory); + AckReader ackReader = new AckReader(ackFactory); byte[] b = createAck(true); ByteArrayInputStream in = new ByteArrayInputStream(b); @@ -61,7 +61,7 @@ public class AckReaderTest extends TestCase { @SuppressWarnings("unchecked") public void testNoFormatExceptionIfAckIsMaximumSize() throws Exception { final AckFactory ackFactory = context.mock(AckFactory.class); - AckReader ackReader = new AckReader(new BatchIdReader(), ackFactory); + AckReader ackReader = new AckReader(ackFactory); final Ack ack = context.mock(Ack.class); context.checking(new Expectations() {{ oneOf(ackFactory).createAck(with(any(Collection.class))); @@ -80,7 +80,7 @@ public class AckReaderTest extends TestCase { @Test public void testEmptyAck() throws Exception { final AckFactory ackFactory = context.mock(AckFactory.class); - AckReader ackReader = new AckReader(new BatchIdReader(), ackFactory); + AckReader ackReader = new AckReader(ackFactory); final Ack ack = context.mock(Ack.class); context.checking(new Expectations() {{ oneOf(ackFactory).createAck( diff --git a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java index d196ab368f56b58c71f49b10f3d8545765dd1a15..96efbbba58537749159d998cbbc948e7f23ed7f0 100644 --- a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java +++ b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java @@ -15,7 +15,7 @@ import net.sf.briar.api.protocol.BatchId; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.Message; -import net.sf.briar.api.protocol.MessageEncoder; +import net.sf.briar.api.protocol.MessageFactory; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.ProtocolReader; import net.sf.briar.api.protocol.ProtocolReaderFactory; @@ -65,8 +65,8 @@ public class ProtocolReadWriteTest extends TestCase { batchId = new BatchId(TestUtils.getRandomId()); GroupFactory groupFactory = i.getInstance(GroupFactory.class); group = groupFactory.createGroup("Unrestricted group", null); - MessageEncoder messageEncoder = i.getInstance(MessageEncoder.class); - message = messageEncoder.encodeMessage(null, group, subject, + MessageFactory messageFactory = i.getInstance(MessageFactory.class); + message = messageFactory.createMessage(null, group, subject, messageBody.getBytes("UTF-8")); bitSet = new BitSet(); bitSet.set(3); diff --git a/test/net/sf/briar/protocol/writers/ConstantsTest.java b/test/net/sf/briar/protocol/writers/ConstantsTest.java index dcc47a735224d02f6b6f93c54b64a9c8d617104c..c2b82c5edaa6b1dc54d0544df3b70b6774bf8ccb 100644 --- a/test/net/sf/briar/protocol/writers/ConstantsTest.java +++ b/test/net/sf/briar/protocol/writers/ConstantsTest.java @@ -27,7 +27,7 @@ import net.sf.briar.api.protocol.BatchId; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.Message; -import net.sf.briar.api.protocol.MessageEncoder; +import net.sf.briar.api.protocol.MessageFactory; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.TransportId; @@ -56,7 +56,7 @@ public class ConstantsTest extends TestCase { private final SerialComponent serial; private final GroupFactory groupFactory; private final AuthorFactory authorFactory; - private final MessageEncoder messageEncoder; + private final MessageFactory messageFactory; public ConstantsTest() throws Exception { super(); @@ -67,7 +67,7 @@ public class ConstantsTest extends TestCase { serial = i.getInstance(SerialComponent.class); groupFactory = i.getInstance(GroupFactory.class); authorFactory = i.getInstance(AuthorFactory.class); - messageEncoder = i.getInstance(MessageEncoder.class); + messageFactory = i.getInstance(MessageFactory.class); } @Test @@ -117,7 +117,7 @@ public class ConstantsTest extends TestCase { PrivateKey authorPrivate = crypto.generateKeyPair().getPrivate(); String subject = createRandomString(MAX_SUBJECT_LENGTH); byte[] body = new byte[MAX_BODY_LENGTH]; - Message message = messageEncoder.encodeMessage(null, group, + Message message = messageFactory.createMessage(null, group, groupPrivate, author, authorPrivate, subject, body); // Add the message to a batch ByteArrayOutputStream out = diff --git a/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java b/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java index 14bf846af9e4b7a3f2dce4c24580f3b7d2356c7b..6fc6ccf193bb710592c747755411cc26d3349f31 100644 --- a/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java +++ b/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java @@ -24,7 +24,7 @@ import net.sf.briar.api.db.event.DatabaseEvent; import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.MessagesAddedEvent; import net.sf.briar.api.protocol.Message; -import net.sf.briar.api.protocol.MessageEncoder; +import net.sf.briar.api.protocol.MessageFactory; import net.sf.briar.api.protocol.ProtocolReaderFactory; import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.TransportId; @@ -128,9 +128,9 @@ public class BatchConnectionReadWriteTest extends TestCase { // Add Bob as a contact and send him a message ContactId contactId = db.addContact(bobToAliceSecret, aliceToBobSecret); String subject = "Hello"; - byte[] messageBody = "Hi Bob!".getBytes("UTF-8"); - MessageEncoder encoder = alice.getInstance(MessageEncoder.class); - Message message = encoder.encodeMessage(null, subject, messageBody); + byte[] body = "Hi Bob!".getBytes("UTF-8"); + MessageFactory messageFactory = alice.getInstance(MessageFactory.class); + Message message = messageFactory.createMessage(null, subject, body); db.addLocalPrivateMessage(message, contactId); // Create an outgoing batch connection ByteArrayOutputStream out = new ByteArrayOutputStream();