Moved writers into their own package, replaced public static fields in

CryptoModule with provider methods.
This commit is contained in:
akwizgran
2011-07-23 18:50:40 +01:00
parent 13f18d9e40
commit 65be63dc0c
19 changed files with 205 additions and 78 deletions

View File

@@ -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

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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);
}

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
} }
} }

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}
}

View 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);
}
}

View File

@@ -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;

View File

@@ -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);
} }

View File

@@ -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));
} }

View File

@@ -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();

View File

@@ -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);