PROTON-1451 : Only register BouncyCastle provider if not already present
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
index 64eb2ca..4efc055 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
@@ -130,10 +130,7 @@
PrivateKeyInfoClassResult = Class.forName("org.bouncycastle.asn1.pkcs.PrivateKeyInfo");
getPrivateKeyMethodResult = jcaPEMKeyConverterClass.getMethod("getPrivateKey", PrivateKeyInfoClassResult);
- // Try loading BC as a provider
- Class<?> klass = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider");
- Provider provider = (Provider) klass.getConstructor().newInstance();
- Security.addProvider(provider);
+ registerBouncyCastleProvider();
}
catch (Exception e)
{
@@ -155,6 +152,23 @@
}
}
+ static void registerBouncyCastleProvider()
+ throws ClassNotFoundException, InstantiationException, IllegalAccessException,
+ InvocationTargetException, NoSuchMethodException
+ {
+ // Try loading BC as a provider
+ Class<?> klass = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider");
+
+ Provider bouncyCastleProvider = (Provider) klass.getConstructor().newInstance();
+ synchronized (Security.class)
+ {
+ if(Security.getProvider(bouncyCastleProvider.getName()) == null)
+ {
+ Security.addProvider(bouncyCastleProvider);
+ }
+ }
+ }
+
SslEngineFacadeFactory()
{
}
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java
index 84ba8cb..e43988e 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.qpid.proton.engine.impl.ssl;
+import static junit.framework.TestCase.fail;
import static org.junit.Assert.assertNotNull;
import java.net.URL;
@@ -29,6 +30,21 @@
private static final String PASSWORD = "unittest";
@Test
+ public void testDuplicateRegistrationOfSecurityProvider() {
+ // ensure the provider is already registered
+ SslEngineFacadeFactory factory = new SslEngineFacadeFactory();
+
+ try
+ {
+ SslEngineFacadeFactory.registerBouncyCastleProvider();
+ }
+ catch (Exception e)
+ {
+ fail("Exception thrown when re-registering BouncyCastle provider " + e.getMessage());
+ }
+ }
+
+ @Test
public void testCertifcateLoad() {
String ipFile = resolveFilename("cert.pem.txt");
SslEngineFacadeFactory factory = new SslEngineFacadeFactory();