Use the BouncyCastle provider so we can be sure we won't get

NoSuchAlgorithmExceptions. Key generation is *slow* - I guess that's a
good sign. ;-)
This commit is contained in:
akwizgran
2011-07-25 10:38:46 +01:00
parent c98c968b87
commit fb95565880
13 changed files with 126 additions and 78 deletions

View File

@@ -0,0 +1,66 @@
package net.sf.briar.crypto;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.Signature;
import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.crypto.KeyParser;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class CryptoComponentImpl implements CryptoComponent {
private static final String PROVIDER = "BC";
private static final String DIGEST_ALGO = "SHA-256";
private static final String KEY_PAIR_ALGO = "RSA";
private static final String SIGNATURE_ALGO = "SHA256withRSA";
private final KeyParser keyParser;
private final KeyPairGenerator keyPairGenerator;
CryptoComponentImpl() {
Security.addProvider(new BouncyCastleProvider());
try {
keyParser = new KeyParserImpl(KEY_PAIR_ALGO, PROVIDER);
keyPairGenerator = KeyPairGenerator.getInstance(KEY_PAIR_ALGO,
PROVIDER);
} catch(NoSuchAlgorithmException impossible) {
throw new RuntimeException(impossible);
} catch(NoSuchProviderException impossible) {
throw new RuntimeException(impossible);
}
}
public KeyPair generateKeyPair() {
return keyPairGenerator.generateKeyPair();
}
public KeyParser getKeyParser() {
return keyParser;
}
public MessageDigest getMessageDigest() {
try {
return MessageDigest.getInstance(DIGEST_ALGO, PROVIDER);
} catch(NoSuchAlgorithmException impossible) {
throw new RuntimeException(impossible);
} catch(NoSuchProviderException impossible) {
throw new RuntimeException(impossible);
}
}
public Signature getSignature() {
try {
return Signature.getInstance(SIGNATURE_ALGO, PROVIDER);
} catch(NoSuchAlgorithmException impossible) {
throw new RuntimeException(impossible);
} catch(NoSuchProviderException impossible) {
throw new RuntimeException(impossible);
}
}
}

View File

@@ -1,60 +1,14 @@
package net.sf.briar.crypto;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import net.sf.briar.api.crypto.KeyParser;
import net.sf.briar.api.crypto.CryptoComponent;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
public class CryptoModule extends AbstractModule {
private static final String DIGEST_ALGO = "SHA-256";
private static final String KEY_PAIR_ALGO = "RSA";
private static final String SIGNATURE_ALGO = "SHA256withRSA";
@Override
protected void configure() {
try {
bind(KeyParser.class).toInstance(new KeyParserImpl(KEY_PAIR_ALGO));
} 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);
}
bind(CryptoComponent.class).to(CryptoComponentImpl.class).in(Singleton.class);
}
}

View File

@@ -2,6 +2,7 @@ package net.sf.briar.crypto;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PublicKey;
import java.security.spec.EncodedKeySpec;
import java.security.spec.InvalidKeySpecException;
@@ -13,8 +14,9 @@ class KeyParserImpl implements KeyParser {
private final KeyFactory keyFactory;
KeyParserImpl(String algorithm) throws NoSuchAlgorithmException {
keyFactory = KeyFactory.getInstance(algorithm);
KeyParserImpl(String algorithm, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException {
keyFactory = KeyFactory.getInstance(algorithm, provider);
}
public PublicKey parsePublicKey(byte[] encodedKey)

View File

@@ -3,6 +3,7 @@ package net.sf.briar.protocol;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.crypto.KeyParser;
import net.sf.briar.api.protocol.Group;
import net.sf.briar.api.protocol.GroupFactory;
@@ -15,8 +16,8 @@ class GroupFactoryImpl implements GroupFactory {
private final KeyParser keyParser;
@Inject
GroupFactoryImpl(KeyParser keyParser) {
this.keyParser = keyParser;
GroupFactoryImpl(CryptoComponent crypto) {
keyParser = crypto.getKeyParser();
}
public Group createGroup(GroupId id, String name, boolean restricted,

View File

@@ -7,6 +7,7 @@ import java.security.KeyPair;
import java.security.MessageDigest;
import java.security.Signature;
import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.protocol.AuthorId;
import net.sf.briar.api.protocol.GroupId;
import net.sf.briar.api.protocol.Message;
@@ -25,10 +26,9 @@ class MessageEncoderImpl implements MessageEncoder {
private final WriterFactory writerFactory;
@Inject
MessageEncoderImpl(Signature signature, MessageDigest messageDigest,
WriterFactory writerFactory) {
this.signature = signature;
this.messageDigest = messageDigest;
MessageEncoderImpl(CryptoComponent crypto, WriterFactory writerFactory) {
signature = crypto.getSignature();
messageDigest = crypto.getMessageDigest();
this.writerFactory = writerFactory;
}

View File

@@ -3,6 +3,7 @@ package net.sf.briar.protocol.writers;
import java.io.OutputStream;
import java.security.MessageDigest;
import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.protocol.writers.AckWriter;
import net.sf.briar.api.protocol.writers.BatchWriter;
import net.sf.briar.api.protocol.writers.PacketWriterFactory;
@@ -18,9 +19,9 @@ class PacketWriterFactoryImpl implements PacketWriterFactory {
private final WriterFactory writerFactory;
@Inject
PacketWriterFactoryImpl(MessageDigest messageDigest,
PacketWriterFactoryImpl(CryptoComponent crypto,
WriterFactory writerFactory) {
this.messageDigest = messageDigest;
messageDigest = crypto.getMessageDigest();
this.writerFactory = writerFactory;
}