mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 21:59:54 +01:00
Moved writers into their own package, replaced public static fields in
CryptoModule with provider methods.
This commit is contained in:
@@ -7,17 +7,17 @@ import java.util.Map;
|
|||||||
import net.sf.briar.api.ContactId;
|
import net.sf.briar.api.ContactId;
|
||||||
import net.sf.briar.api.Rating;
|
import net.sf.briar.api.Rating;
|
||||||
import net.sf.briar.api.protocol.Ack;
|
import net.sf.briar.api.protocol.Ack;
|
||||||
import net.sf.briar.api.protocol.AckWriter;
|
|
||||||
import net.sf.briar.api.protocol.AuthorId;
|
import net.sf.briar.api.protocol.AuthorId;
|
||||||
import net.sf.briar.api.protocol.Batch;
|
import net.sf.briar.api.protocol.Batch;
|
||||||
import net.sf.briar.api.protocol.BatchWriter;
|
|
||||||
import net.sf.briar.api.protocol.Group;
|
import net.sf.briar.api.protocol.Group;
|
||||||
import net.sf.briar.api.protocol.GroupId;
|
import net.sf.briar.api.protocol.GroupId;
|
||||||
import net.sf.briar.api.protocol.Message;
|
import net.sf.briar.api.protocol.Message;
|
||||||
import net.sf.briar.api.protocol.SubscriptionWriter;
|
|
||||||
import net.sf.briar.api.protocol.Subscriptions;
|
import net.sf.briar.api.protocol.Subscriptions;
|
||||||
import net.sf.briar.api.protocol.TransportWriter;
|
|
||||||
import net.sf.briar.api.protocol.Transports;
|
import net.sf.briar.api.protocol.Transports;
|
||||||
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.SubscriptionWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.TransportWriter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encapsulates the database implementation and exposes high-level operations
|
* Encapsulates the database implementation and exposes high-level operations
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package net.sf.briar.api.protocol;
|
package net.sf.briar.api.protocol.writers;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
|
|
||||||
/** An interface for creating an ack. */
|
/** An interface for creating an ack. */
|
||||||
public interface AckWriter {
|
public interface AckWriter {
|
||||||
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
package net.sf.briar.api.protocol;
|
package net.sf.briar.api.protocol.writers;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
|
|
||||||
/** An interface for creating a batch of messages. */
|
/** An interface for creating a batch of messages. */
|
||||||
public interface BatchWriter {
|
public interface BatchWriter {
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package net.sf.briar.api.protocol.writers;
|
||||||
|
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public interface PacketWriterFactory {
|
||||||
|
|
||||||
|
AckWriter createAckWriter(OutputStream out);
|
||||||
|
|
||||||
|
BatchWriter createBatchWriter(OutputStream out);
|
||||||
|
|
||||||
|
SubscriptionWriter createSubscriptionWriter(OutputStream out);
|
||||||
|
|
||||||
|
TransportWriter createTransportWriter(OutputStream out);
|
||||||
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
package net.sf.briar.api.protocol;
|
package net.sf.briar.api.protocol.writers;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.Group;
|
||||||
|
|
||||||
/** An interface for creating a subscription update. */
|
/** An interface for creating a subscription update. */
|
||||||
public interface SubscriptionWriter {
|
public interface SubscriptionWriter {
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.sf.briar.api.protocol;
|
package net.sf.briar.api.protocol.writers;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -6,7 +6,6 @@ import java.util.Map;
|
|||||||
|
|
||||||
public interface Writer {
|
public interface Writer {
|
||||||
|
|
||||||
// FIXME: Remove this method
|
|
||||||
long getBytesWritten();
|
long getBytesWritten();
|
||||||
|
|
||||||
void writeBoolean(boolean b) throws IOException;
|
void writeBoolean(boolean b) throws IOException;
|
||||||
|
|||||||
@@ -1,22 +1,59 @@
|
|||||||
package net.sf.briar.crypto;
|
package net.sf.briar.crypto;
|
||||||
|
|
||||||
|
import java.security.KeyPair;
|
||||||
|
import java.security.KeyPairGenerator;
|
||||||
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.Signature;
|
||||||
|
|
||||||
import net.sf.briar.api.crypto.KeyParser;
|
import net.sf.briar.api.crypto.KeyParser;
|
||||||
|
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
|
||||||
public class CryptoModule extends AbstractModule {
|
public class CryptoModule extends AbstractModule {
|
||||||
|
|
||||||
public static final String DIGEST_ALGO = "SHA-256";
|
private static final String DIGEST_ALGO = "SHA-256";
|
||||||
public static final String KEY_PAIR_ALGO = "RSA";
|
private static final String KEY_PAIR_ALGO = "RSA";
|
||||||
public static final String SIGNATURE_ALGO = "SHA256withRSA";
|
private static final String SIGNATURE_ALGO = "SHA256withRSA";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
try {
|
try {
|
||||||
bind(KeyParser.class).toInstance(new KeyParserImpl(KEY_PAIR_ALGO));
|
bind(KeyParser.class).toInstance(new KeyParserImpl(KEY_PAIR_ALGO));
|
||||||
} catch(NoSuchAlgorithmException e) {
|
} catch(NoSuchAlgorithmException e) {
|
||||||
|
// FIXME: Can modules throw?
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
MessageDigest getMessageDigest() {
|
||||||
|
try {
|
||||||
|
return MessageDigest.getInstance(DIGEST_ALGO);
|
||||||
|
} catch(NoSuchAlgorithmException e) {
|
||||||
|
// FIXME: Providers should not throw
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
Signature getSignature() {
|
||||||
|
try {
|
||||||
|
return Signature.getInstance(SIGNATURE_ALGO);
|
||||||
|
} catch(NoSuchAlgorithmException e) {
|
||||||
|
// FIXME: Providers should not throw
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
KeyPair generateKeyPair() {
|
||||||
|
try {
|
||||||
|
KeyPairGenerator gen = KeyPairGenerator.getInstance(KEY_PAIR_ALGO);
|
||||||
|
return gen.generateKeyPair();
|
||||||
|
} catch(NoSuchAlgorithmException e) {
|
||||||
|
// FIXME: Providers should not throw
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,19 +16,19 @@ import net.sf.briar.api.Rating;
|
|||||||
import net.sf.briar.api.db.DbException;
|
import net.sf.briar.api.db.DbException;
|
||||||
import net.sf.briar.api.db.NoSuchContactException;
|
import net.sf.briar.api.db.NoSuchContactException;
|
||||||
import net.sf.briar.api.protocol.Ack;
|
import net.sf.briar.api.protocol.Ack;
|
||||||
import net.sf.briar.api.protocol.AckWriter;
|
|
||||||
import net.sf.briar.api.protocol.AuthorId;
|
import net.sf.briar.api.protocol.AuthorId;
|
||||||
import net.sf.briar.api.protocol.Batch;
|
import net.sf.briar.api.protocol.Batch;
|
||||||
import net.sf.briar.api.protocol.BatchId;
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
import net.sf.briar.api.protocol.BatchWriter;
|
|
||||||
import net.sf.briar.api.protocol.Group;
|
import net.sf.briar.api.protocol.Group;
|
||||||
import net.sf.briar.api.protocol.GroupId;
|
import net.sf.briar.api.protocol.GroupId;
|
||||||
import net.sf.briar.api.protocol.Message;
|
import net.sf.briar.api.protocol.Message;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.SubscriptionWriter;
|
|
||||||
import net.sf.briar.api.protocol.Subscriptions;
|
import net.sf.briar.api.protocol.Subscriptions;
|
||||||
import net.sf.briar.api.protocol.TransportWriter;
|
|
||||||
import net.sf.briar.api.protocol.Transports;
|
import net.sf.briar.api.protocol.Transports;
|
||||||
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.SubscriptionWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.TransportWriter;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
|||||||
@@ -15,19 +15,19 @@ import net.sf.briar.api.Rating;
|
|||||||
import net.sf.briar.api.db.DbException;
|
import net.sf.briar.api.db.DbException;
|
||||||
import net.sf.briar.api.db.NoSuchContactException;
|
import net.sf.briar.api.db.NoSuchContactException;
|
||||||
import net.sf.briar.api.protocol.Ack;
|
import net.sf.briar.api.protocol.Ack;
|
||||||
import net.sf.briar.api.protocol.AckWriter;
|
|
||||||
import net.sf.briar.api.protocol.AuthorId;
|
import net.sf.briar.api.protocol.AuthorId;
|
||||||
import net.sf.briar.api.protocol.Batch;
|
import net.sf.briar.api.protocol.Batch;
|
||||||
import net.sf.briar.api.protocol.BatchId;
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
import net.sf.briar.api.protocol.BatchWriter;
|
|
||||||
import net.sf.briar.api.protocol.Group;
|
import net.sf.briar.api.protocol.Group;
|
||||||
import net.sf.briar.api.protocol.GroupId;
|
import net.sf.briar.api.protocol.GroupId;
|
||||||
import net.sf.briar.api.protocol.Message;
|
import net.sf.briar.api.protocol.Message;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.SubscriptionWriter;
|
|
||||||
import net.sf.briar.api.protocol.Subscriptions;
|
import net.sf.briar.api.protocol.Subscriptions;
|
||||||
import net.sf.briar.api.protocol.TransportWriter;
|
|
||||||
import net.sf.briar.api.protocol.Transports;
|
import net.sf.briar.api.protocol.Transports;
|
||||||
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.SubscriptionWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.TransportWriter;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package net.sf.briar.protocol;
|
package net.sf.briar.protocol.writers;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import net.sf.briar.api.protocol.Ack;
|
import net.sf.briar.api.protocol.Ack;
|
||||||
import net.sf.briar.api.protocol.AckWriter;
|
|
||||||
import net.sf.briar.api.protocol.BatchId;
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
import net.sf.briar.api.serial.Writer;
|
import net.sf.briar.api.serial.Writer;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
import net.sf.briar.api.serial.WriterFactory;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.sf.briar.protocol;
|
package net.sf.briar.protocol.writers;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
@@ -7,8 +7,8 @@ import java.security.MessageDigest;
|
|||||||
|
|
||||||
import net.sf.briar.api.protocol.Batch;
|
import net.sf.briar.api.protocol.Batch;
|
||||||
import net.sf.briar.api.protocol.BatchId;
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
import net.sf.briar.api.protocol.BatchWriter;
|
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
|
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||||
import net.sf.briar.api.serial.Writer;
|
import net.sf.briar.api.serial.Writer;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
import net.sf.briar.api.serial.WriterFactory;
|
||||||
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package net.sf.briar.protocol.writers;
|
||||||
|
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.PacketWriterFactory;
|
||||||
|
import net.sf.briar.api.protocol.writers.SubscriptionWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.TransportWriter;
|
||||||
|
import net.sf.briar.api.serial.WriterFactory;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
class PacketWriterFactoryImpl implements PacketWriterFactory {
|
||||||
|
|
||||||
|
private final MessageDigest messageDigest;
|
||||||
|
private final WriterFactory writerFactory;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
PacketWriterFactoryImpl(MessageDigest messageDigest,
|
||||||
|
WriterFactory writerFactory) {
|
||||||
|
this.messageDigest = messageDigest;
|
||||||
|
this.writerFactory = writerFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AckWriter createAckWriter(OutputStream out) {
|
||||||
|
return new AckWriterImpl(out, writerFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BatchWriter createBatchWriter(OutputStream out) {
|
||||||
|
return new BatchWriterImpl(out, writerFactory, messageDigest);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SubscriptionWriter createSubscriptionWriter(OutputStream out) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransportWriter createTransportWriter(OutputStream out) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
14
components/net/sf/briar/protocol/writers/WritersModule.java
Normal file
14
components/net/sf/briar/protocol/writers/WritersModule.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package net.sf.briar.protocol.writers;
|
||||||
|
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.writers.PacketWriterFactory;
|
||||||
|
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
|
||||||
|
public class WritersModule extends AbstractModule {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(PacketWriterFactory.class).to(PacketWriterFactoryImpl.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,13 +14,13 @@ import net.sf.briar.api.db.DbException;
|
|||||||
import net.sf.briar.api.db.NoSuchContactException;
|
import net.sf.briar.api.db.NoSuchContactException;
|
||||||
import net.sf.briar.api.db.Status;
|
import net.sf.briar.api.db.Status;
|
||||||
import net.sf.briar.api.protocol.Ack;
|
import net.sf.briar.api.protocol.Ack;
|
||||||
import net.sf.briar.api.protocol.AckWriter;
|
|
||||||
import net.sf.briar.api.protocol.AuthorId;
|
import net.sf.briar.api.protocol.AuthorId;
|
||||||
import net.sf.briar.api.protocol.BatchId;
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
import net.sf.briar.api.protocol.Group;
|
import net.sf.briar.api.protocol.Group;
|
||||||
import net.sf.briar.api.protocol.GroupId;
|
import net.sf.briar.api.protocol.GroupId;
|
||||||
import net.sf.briar.api.protocol.Message;
|
import net.sf.briar.api.protocol.Message;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
|
|
||||||
import org.jmock.Expectations;
|
import org.jmock.Expectations;
|
||||||
import org.jmock.Mockery;
|
import org.jmock.Mockery;
|
||||||
|
|||||||
@@ -38,10 +38,11 @@ public class BatchReaderTest extends TestCase {
|
|||||||
|
|
||||||
public BatchReaderTest() throws Exception {
|
public BatchReaderTest() throws Exception {
|
||||||
super();
|
super();
|
||||||
Injector i = Guice.createInjector(new SerialModule());
|
Injector i = Guice.createInjector(new SerialModule(),
|
||||||
|
new CryptoModule());
|
||||||
readerFactory = i.getInstance(ReaderFactory.class);
|
readerFactory = i.getInstance(ReaderFactory.class);
|
||||||
writerFactory = i.getInstance(WriterFactory.class);
|
writerFactory = i.getInstance(WriterFactory.class);
|
||||||
messageDigest = MessageDigest.getInstance(CryptoModule.DIGEST_ALGO);
|
messageDigest = i.getInstance(MessageDigest.class);
|
||||||
context = new Mockery();
|
context = new Mockery();
|
||||||
message = context.mock(Message.class);
|
message = context.mock(Message.class);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package net.sf.briar.protocol;
|
package net.sf.briar.protocol;
|
||||||
|
|
||||||
import java.security.KeyPair;
|
import java.security.KeyPair;
|
||||||
import java.security.KeyPairGenerator;
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.Signature;
|
import java.security.Signature;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -11,48 +10,59 @@ import junit.framework.TestCase;
|
|||||||
import net.sf.briar.api.serial.FormatException;
|
import net.sf.briar.api.serial.FormatException;
|
||||||
import net.sf.briar.crypto.CryptoModule;
|
import net.sf.briar.crypto.CryptoModule;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
public class ConsumersTest extends TestCase {
|
public class ConsumersTest extends TestCase {
|
||||||
|
|
||||||
|
private Signature signature = null;
|
||||||
|
private KeyPair keyPair = null;
|
||||||
|
private MessageDigest messageDigest = null;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
Injector i = Guice.createInjector(new CryptoModule());
|
||||||
|
signature = i.getInstance(Signature.class);
|
||||||
|
keyPair = i.getInstance(KeyPair.class);
|
||||||
|
messageDigest = i.getInstance(MessageDigest.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSigningConsumer() throws Exception {
|
public void testSigningConsumer() throws Exception {
|
||||||
Signature s = Signature.getInstance(CryptoModule.SIGNATURE_ALGO);
|
|
||||||
KeyPairGenerator gen =
|
|
||||||
KeyPairGenerator.getInstance(CryptoModule.KEY_PAIR_ALGO);
|
|
||||||
KeyPair k = gen.genKeyPair();
|
|
||||||
byte[] data = new byte[1234];
|
byte[] data = new byte[1234];
|
||||||
// Generate some random data and sign it
|
// Generate some random data and sign it
|
||||||
new Random().nextBytes(data);
|
new Random().nextBytes(data);
|
||||||
s.initSign(k.getPrivate());
|
signature.initSign(keyPair.getPrivate());
|
||||||
s.update(data);
|
signature.update(data);
|
||||||
byte[] sig = s.sign();
|
byte[] sig = signature.sign();
|
||||||
// Check that feeding a SigningConsumer generates the same signature
|
// Check that feeding a SigningConsumer generates the same signature
|
||||||
s.initSign(k.getPrivate());
|
signature.initSign(keyPair.getPrivate());
|
||||||
SigningConsumer sc = new SigningConsumer(s);
|
SigningConsumer sc = new SigningConsumer(signature);
|
||||||
sc.write(data[0]);
|
sc.write(data[0]);
|
||||||
sc.write(data, 1, data.length - 2);
|
sc.write(data, 1, data.length - 2);
|
||||||
sc.write(data[data.length - 1]);
|
sc.write(data[data.length - 1]);
|
||||||
byte[] sig1 = s.sign();
|
byte[] sig1 = signature.sign();
|
||||||
assertTrue(Arrays.equals(sig, sig1));
|
assertTrue(Arrays.equals(sig, sig1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDigestingConsumer() throws Exception {
|
public void testDigestingConsumer() throws Exception {
|
||||||
MessageDigest m = MessageDigest.getInstance(CryptoModule.DIGEST_ALGO);
|
|
||||||
byte[] data = new byte[1234];
|
byte[] data = new byte[1234];
|
||||||
// Generate some random data and digest it
|
// Generate some random data and digest it
|
||||||
new Random().nextBytes(data);
|
new Random().nextBytes(data);
|
||||||
m.reset();
|
messageDigest.reset();
|
||||||
m.update(data);
|
messageDigest.update(data);
|
||||||
byte[] dig = m.digest();
|
byte[] dig = messageDigest.digest();
|
||||||
// Check that feeding a DigestingConsumer generates the same digest
|
// Check that feeding a DigestingConsumer generates the same digest
|
||||||
m.reset();
|
messageDigest.reset();
|
||||||
DigestingConsumer dc = new DigestingConsumer(m);
|
DigestingConsumer dc = new DigestingConsumer(messageDigest);
|
||||||
dc.write(data[0]);
|
dc.write(data[0]);
|
||||||
dc.write(data, 1, data.length - 2);
|
dc.write(data, 1, data.length - 2);
|
||||||
dc.write(data[data.length - 1]);
|
dc.write(data[data.length - 1]);
|
||||||
byte[] dig1 = m.digest();
|
byte[] dig1 = messageDigest.digest();
|
||||||
assertTrue(Arrays.equals(dig, dig1));
|
assertTrue(Arrays.equals(dig, dig1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import java.io.File;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.security.KeyPair;
|
import java.security.KeyPair;
|
||||||
import java.security.KeyPairGenerator;
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.Signature;
|
import java.security.Signature;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -15,20 +14,22 @@ import junit.framework.TestCase;
|
|||||||
import net.sf.briar.TestUtils;
|
import net.sf.briar.TestUtils;
|
||||||
import net.sf.briar.api.crypto.KeyParser;
|
import net.sf.briar.api.crypto.KeyParser;
|
||||||
import net.sf.briar.api.protocol.Ack;
|
import net.sf.briar.api.protocol.Ack;
|
||||||
import net.sf.briar.api.protocol.AckWriter;
|
|
||||||
import net.sf.briar.api.protocol.Batch;
|
import net.sf.briar.api.protocol.Batch;
|
||||||
import net.sf.briar.api.protocol.BatchId;
|
import net.sf.briar.api.protocol.BatchId;
|
||||||
import net.sf.briar.api.protocol.BatchWriter;
|
|
||||||
import net.sf.briar.api.protocol.GroupId;
|
import net.sf.briar.api.protocol.GroupId;
|
||||||
import net.sf.briar.api.protocol.Message;
|
import net.sf.briar.api.protocol.Message;
|
||||||
import net.sf.briar.api.protocol.MessageEncoder;
|
import net.sf.briar.api.protocol.MessageEncoder;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
import net.sf.briar.api.protocol.UniqueId;
|
import net.sf.briar.api.protocol.UniqueId;
|
||||||
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.BatchWriter;
|
||||||
|
import net.sf.briar.api.protocol.writers.PacketWriterFactory;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
import net.sf.briar.api.serial.ReaderFactory;
|
import net.sf.briar.api.serial.ReaderFactory;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
import net.sf.briar.api.serial.WriterFactory;
|
||||||
import net.sf.briar.crypto.CryptoModule;
|
import net.sf.briar.crypto.CryptoModule;
|
||||||
|
import net.sf.briar.protocol.writers.WritersModule;
|
||||||
import net.sf.briar.serial.SerialModule;
|
import net.sf.briar.serial.SerialModule;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
@@ -50,6 +51,7 @@ public class FileReadWriteTest extends TestCase {
|
|||||||
|
|
||||||
private final ReaderFactory readerFactory;
|
private final ReaderFactory readerFactory;
|
||||||
private final WriterFactory writerFactory;
|
private final WriterFactory writerFactory;
|
||||||
|
private final PacketWriterFactory packetWriterFactory;
|
||||||
private final Signature signature;
|
private final Signature signature;
|
||||||
private final MessageDigest messageDigest, batchDigest;
|
private final MessageDigest messageDigest, batchDigest;
|
||||||
private final KeyParser keyParser;
|
private final KeyParser keyParser;
|
||||||
@@ -58,21 +60,20 @@ public class FileReadWriteTest extends TestCase {
|
|||||||
public FileReadWriteTest() throws Exception {
|
public FileReadWriteTest() throws Exception {
|
||||||
super();
|
super();
|
||||||
Injector i = Guice.createInjector(new SerialModule(),
|
Injector i = Guice.createInjector(new SerialModule(),
|
||||||
new CryptoModule());
|
new CryptoModule(), new WritersModule());
|
||||||
readerFactory = i.getInstance(ReaderFactory.class);
|
readerFactory = i.getInstance(ReaderFactory.class);
|
||||||
writerFactory = i.getInstance(WriterFactory.class);
|
writerFactory = i.getInstance(WriterFactory.class);
|
||||||
|
packetWriterFactory = i.getInstance(PacketWriterFactory.class);
|
||||||
keyParser = i.getInstance(KeyParser.class);
|
keyParser = i.getInstance(KeyParser.class);
|
||||||
signature = Signature.getInstance(CryptoModule.SIGNATURE_ALGO);
|
signature = i.getInstance(Signature.class);
|
||||||
messageDigest = MessageDigest.getInstance(CryptoModule.DIGEST_ALGO);
|
messageDigest = i.getInstance(MessageDigest.class);
|
||||||
batchDigest = MessageDigest.getInstance(CryptoModule.DIGEST_ALGO);
|
batchDigest = i.getInstance(MessageDigest.class);
|
||||||
assertEquals(messageDigest.getDigestLength(), UniqueId.LENGTH);
|
assertEquals(messageDigest.getDigestLength(), UniqueId.LENGTH);
|
||||||
assertEquals(batchDigest.getDigestLength(), UniqueId.LENGTH);
|
assertEquals(batchDigest.getDigestLength(), UniqueId.LENGTH);
|
||||||
// Create and encode a test message
|
// Create and encode a test message
|
||||||
MessageEncoder messageEncoder = new MessageEncoderImpl(signature,
|
MessageEncoder messageEncoder = new MessageEncoderImpl(signature,
|
||||||
messageDigest, writerFactory);
|
messageDigest, writerFactory);
|
||||||
KeyPairGenerator gen =
|
KeyPair keyPair = i.getInstance(KeyPair.class);
|
||||||
KeyPairGenerator.getInstance(CryptoModule.KEY_PAIR_ALGO);
|
|
||||||
KeyPair keyPair = gen.generateKeyPair();
|
|
||||||
message = messageEncoder.encodeMessage(MessageId.NONE, sub, nick,
|
message = messageEncoder.encodeMessage(MessageId.NONE, sub, nick,
|
||||||
keyPair, messageBody.getBytes("UTF-8"));
|
keyPair, messageBody.getBytes("UTF-8"));
|
||||||
}
|
}
|
||||||
@@ -86,11 +87,11 @@ public class FileReadWriteTest extends TestCase {
|
|||||||
public void testWriteFile() throws Exception {
|
public void testWriteFile() throws Exception {
|
||||||
FileOutputStream out = new FileOutputStream(file);
|
FileOutputStream out = new FileOutputStream(file);
|
||||||
|
|
||||||
AckWriter a = new AckWriterImpl(out, writerFactory);
|
AckWriter a = packetWriterFactory.createAckWriter(out);
|
||||||
a.addBatchId(ack);
|
a.addBatchId(ack);
|
||||||
a.finish();
|
a.finish();
|
||||||
|
|
||||||
BatchWriter b = new BatchWriterImpl(out, writerFactory, batchDigest);
|
BatchWriter b = packetWriterFactory.createBatchWriter(out);
|
||||||
b.addMessage(message.getBytes());
|
b.addMessage(message.getBytes());
|
||||||
b.finish();
|
b.finish();
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package net.sf.briar.protocol;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.KeyPair;
|
import java.security.KeyPair;
|
||||||
import java.security.KeyPairGenerator;
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.Signature;
|
import java.security.Signature;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -15,19 +14,21 @@ import net.sf.briar.crypto.CryptoModule;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
public class SigningDigestingOutputStreamTest extends TestCase {
|
public class SigningDigestingOutputStreamTest extends TestCase {
|
||||||
|
|
||||||
|
private Signature signature = null;
|
||||||
private KeyPair keyPair = null;
|
private KeyPair keyPair = null;
|
||||||
private Signature sig = null;
|
private MessageDigest messageDigest = null;
|
||||||
private MessageDigest dig = null;
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
KeyPairGenerator gen =
|
Injector i = Guice.createInjector(new CryptoModule());
|
||||||
KeyPairGenerator.getInstance(CryptoModule.KEY_PAIR_ALGO);
|
signature = i.getInstance(Signature.class);
|
||||||
keyPair = gen.generateKeyPair();
|
keyPair = i.getInstance(KeyPair.class);
|
||||||
sig = Signature.getInstance(CryptoModule.SIGNATURE_ALGO);
|
messageDigest = i.getInstance(MessageDigest.class);
|
||||||
dig = MessageDigest.getInstance(CryptoModule.DIGEST_ALGO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -36,9 +37,9 @@ public class SigningDigestingOutputStreamTest extends TestCase {
|
|||||||
new Random().nextBytes(input);
|
new Random().nextBytes(input);
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream(input.length);
|
ByteArrayOutputStream out = new ByteArrayOutputStream(input.length);
|
||||||
SigningDigestingOutputStream s =
|
SigningDigestingOutputStream s =
|
||||||
new SigningDigestingOutputStream(out, sig, dig);
|
new SigningDigestingOutputStream(out, signature, messageDigest);
|
||||||
sig.initSign(keyPair.getPrivate());
|
signature.initSign(keyPair.getPrivate());
|
||||||
dig.reset();
|
messageDigest.reset();
|
||||||
// Sign the first 256 bytes, digest all but the last 256 bytes
|
// Sign the first 256 bytes, digest all but the last 256 bytes
|
||||||
s.setDigesting(true);
|
s.setDigesting(true);
|
||||||
s.setSigning(true);
|
s.setSigning(true);
|
||||||
@@ -49,20 +50,20 @@ public class SigningDigestingOutputStreamTest extends TestCase {
|
|||||||
s.write(input, 768, 256);
|
s.write(input, 768, 256);
|
||||||
s.close();
|
s.close();
|
||||||
// Get the signature and the digest
|
// Get the signature and the digest
|
||||||
byte[] signature = sig.sign();
|
byte[] sig = signature.sign();
|
||||||
byte[] digest = dig.digest();
|
byte[] digest = messageDigest.digest();
|
||||||
// Check that the output matches the input
|
// Check that the output matches the input
|
||||||
assertTrue(Arrays.equals(input, out.toByteArray()));
|
assertTrue(Arrays.equals(input, out.toByteArray()));
|
||||||
// Check that the signature matches a signature over the first 256 bytes
|
// Check that the signature matches a signature over the first 256 bytes
|
||||||
sig.initSign(keyPair.getPrivate());
|
signature.initSign(keyPair.getPrivate());
|
||||||
sig.update(input, 0, 256);
|
signature.update(input, 0, 256);
|
||||||
byte[] directSignature = sig.sign();
|
byte[] directSig = signature.sign();
|
||||||
assertTrue(Arrays.equals(directSignature, signature));
|
assertTrue(Arrays.equals(directSig, sig));
|
||||||
// Check that the digest matches a digest over all but the last 256
|
// Check that the digest matches a digest over all but the last 256
|
||||||
// bytes
|
// bytes
|
||||||
dig.reset();
|
messageDigest.reset();
|
||||||
dig.update(input, 0, 768);
|
messageDigest.update(input, 0, 768);
|
||||||
byte[] directDigest = dig.digest();
|
byte[] directDigest = messageDigest.digest();
|
||||||
assertTrue(Arrays.equals(directDigest, digest));
|
assertTrue(Arrays.equals(directDigest, digest));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ public class SigningDigestingOutputStreamTest extends TestCase {
|
|||||||
public void testSignatureExceptionThrowsIOException() throws Exception {
|
public void testSignatureExceptionThrowsIOException() throws Exception {
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
SigningDigestingOutputStream s =
|
SigningDigestingOutputStream s =
|
||||||
new SigningDigestingOutputStream(out, sig, dig);
|
new SigningDigestingOutputStream(out, signature, messageDigest);
|
||||||
s.setSigning(true); // Signature hasn't been initialised yet
|
s.setSigning(true); // Signature hasn't been initialised yet
|
||||||
try {
|
try {
|
||||||
s.write((byte) 0);
|
s.write((byte) 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user