|
99 | 99 | public abstract class SecurityHelper {
|
100 | 100 |
|
101 | 101 | private static String BC_PROVIDER_CLASS = "org.bouncycastle.jce.provider.BouncyCastleProvider";
|
| 102 | + private static String BC_PROVIDER_NAME = "BC"; |
102 | 103 | static boolean setBouncyCastleProvider = true; // (package access for tests)
|
103 | 104 | static Provider securityProvider; // 'BC' provider (package access for tests)
|
104 | 105 | private static volatile Boolean registerProvider = null;
|
@@ -192,13 +193,27 @@ public static CertificateFactory getCertificateFactory(final String type)
|
192 | 193 | final Provider provider = getSecurityProvider();
|
193 | 194 | if ( provider != null ) return getCertificateFactory(type, provider);
|
194 | 195 | }
|
195 |
| - catch (CertificateException e) { } |
| 196 | + catch (CertificateException e) {e.printStackTrace(); } |
196 | 197 | return CertificateFactory.getInstance(type);
|
197 | 198 | }
|
198 | 199 |
|
199 | 200 | static CertificateFactory getCertificateFactory(final String type, final Provider provider)
|
200 | 201 | throws CertificateException {
|
201 |
| - final CertificateFactorySpi spi = (CertificateFactorySpi) getImplEngine("CertificateFactory", type); |
| 202 | + final CertificateFactorySpi spi; |
| 203 | + boolean addedBC = false; |
| 204 | + synchronized(SecurityHelper.class) { |
| 205 | + try { |
| 206 | + if (provider.getName().equals(BC_PROVIDER_NAME) && Security.getProvider(BC_PROVIDER_NAME) == null) { |
| 207 | + Security.addProvider(provider); |
| 208 | + addedBC = true; |
| 209 | + } |
| 210 | + spi = (CertificateFactorySpi) getImplEngine("CertificateFactory", type); |
| 211 | + } finally { |
| 212 | + if (addedBC) { |
| 213 | + Security.removeProvider(BC_PROVIDER_NAME); |
| 214 | + } |
| 215 | + } |
| 216 | + } |
202 | 217 | if ( spi == null ) throw new CertificateException(type + " not found");
|
203 | 218 | return newInstance(CertificateFactory.class,
|
204 | 219 | new Class[]{ CertificateFactorySpi.class, Provider.class, String.class },
|
|
0 commit comments