1
16 package io.jsonwebtoken.lang;
17
18 import java.security.Provider;
19 import java.security.Security;
20 import java.util.concurrent.atomic.AtomicBoolean;
21
22 public final class RuntimeEnvironment {
23
24 private static final RuntimeEnvironment INSTANCE = new RuntimeEnvironment();
25
26 private RuntimeEnvironment(){}
27
28 private static final String BC_PROVIDER_CLASS_NAME = "org.bouncycastle.jce.provider.BouncyCastleProvider";
29
30 private static final AtomicBoolean bcLoaded = new AtomicBoolean(false);
31
32 public static final boolean BOUNCY_CASTLE_AVAILABLE = Classes.isAvailable(BC_PROVIDER_CLASS_NAME);
33
34 public static void enableBouncyCastleIfPossible() {
35
36 if (bcLoaded.get()) {
37 return;
38 }
39
40 try {
41 Class clazz = Classes.forName(BC_PROVIDER_CLASS_NAME);
42
43
44
45 Provider[] providers = Security.getProviders();
46
47 for(Provider provider : providers) {
48 if (clazz.isInstance(provider)) {
49 bcLoaded.set(true);
50 return;
51 }
52 }
53
54
55 Security.addProvider((Provider)Classes.newInstance(clazz));
56 bcLoaded.set(true);
57
58 } catch (UnknownClassException e) {
59
60 }
61 }
62
63 static {
64 enableBouncyCastleIfPossible();
65 }
66
67 }
68