diff --git a/pom.xml b/pom.xml
index 9bdeba5a5f802..550241e1dd61d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -938,18 +938,6 @@ flexible messaging model and an intuitive client API.
${aspectj.version}
-
- org.bouncycastle
- bcpkix-jdk15on
- ${bouncycastle.version}
-
-
-
- org.bouncycastle
- bcprov-ext-jdk15on
- ${bouncycastle.version}
-
-
net.jodah
typetools
diff --git a/pulsar-client/pom.xml b/pulsar-client/pom.xml
index dca5f4f81987d..4c88a35e90698 100644
--- a/pulsar-client/pom.xml
+++ b/pulsar-client/pom.xml
@@ -114,7 +114,16 @@
-
+
+ org.bouncycastle
+ bc-fips
+ 1.0.1
+
+
+ org.bouncycastle
+ bcpkix-fips
+ 1.0.1
+
com.google.protobuf
protobuf-java
diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageCrypto.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageCrypto.java
index 480750830d64e..3077d2a957714 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageCrypto.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageCrypto.java
@@ -18,12 +18,6 @@
*/
package org.apache.pulsar.client.impl;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-
-import io.netty.buffer.ByteBuf;
-
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
@@ -57,6 +51,10 @@
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import io.netty.buffer.ByteBuf;
import org.apache.pulsar.client.api.CryptoKeyReader;
import org.apache.pulsar.client.api.EncryptionKeyInfo;
import org.apache.pulsar.client.api.PulsarClientException;
@@ -71,9 +69,9 @@
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
import org.bouncycastle.asn1.x9.X9ECParameters;
+import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.ECPrivateKeySpec;
import org.bouncycastle.jce.spec.ECPublicKeySpec;
@@ -98,6 +96,7 @@ public class MessageCrypto {
private static KeyGenerator keyGenerator;
private static final int tagLen = 16 * 8;
public static final int ivLen = 12;
+ private final String providerName = BouncyCastleFipsProvider.PROVIDER_NAME;
private byte[] iv = new byte[ivLen];
private Cipher cipher;
MessageDigest digest;
@@ -113,7 +112,7 @@ public class MessageCrypto {
static final SecureRandom secureRandom;
static {
- Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
+ Security.addProvider(new BouncyCastleFipsProvider());
SecureRandom rand = null;
try {
rand = SecureRandom.getInstance("NativePRNGNonBlocking");
@@ -143,7 +142,7 @@ public SecretKey load(ByteBuffer key) {
try {
- cipher = Cipher.getInstance(AESGCM, BouncyCastleProvider.PROVIDER_NAME);
+ cipher = Cipher.getInstance(AESGCM, providerName);
// If keygen is not needed(e.g: consumer), data key will be decrypted from the message
if (!keyGenNeeded) {
@@ -215,7 +214,7 @@ private PublicKey loadPublicKey(byte[] keyBytes) throws Exception {
if (ecParam != null && ECDSA.equals(publicKey.getAlgorithm())) {
ECParameterSpec ecSpec = new ECParameterSpec(ecParam.getCurve(), ecParam.getG(), ecParam.getN(),
ecParam.getH(), ecParam.getSeed());
- KeyFactory keyFactory = KeyFactory.getInstance(ECDSA, BouncyCastleProvider.PROVIDER_NAME);
+ KeyFactory keyFactory = KeyFactory.getInstance(ECDSA, providerName);
ECPublicKeySpec keySpec = new ECPublicKeySpec(((BCECPublicKey) publicKey).getQ(), ecSpec);
publicKey = (PublicKey) keyFactory.generatePublic(keySpec);
}
@@ -268,7 +267,7 @@ private PrivateKey loadPrivateKey(byte[] keyBytes) throws Exception {
if (ecParam != null && ECDSA.equals(privateKey.getAlgorithm())) {
ECParameterSpec ecSpec = new ECParameterSpec(ecParam.getCurve(), ecParam.getG(), ecParam.getN(),
ecParam.getH(), ecParam.getSeed());
- KeyFactory keyFactory = KeyFactory.getInstance(ECDSA, BouncyCastleProvider.PROVIDER_NAME);
+ KeyFactory keyFactory = KeyFactory.getInstance(ECDSA, providerName);
ECPrivateKeySpec keySpec = new ECPrivateKeySpec(((BCECPrivateKey) privateKey).getS(), ecSpec);
privateKey = (PrivateKey) keyFactory.generatePrivate(keySpec);
}
@@ -326,9 +325,9 @@ private void addPublicKeyCipher(String keyName, CryptoKeyReader keyReader) throw
// Encrypt data key using public key
if (RSA.equals(pubKey.getAlgorithm())) {
- dataKeyCipher = Cipher.getInstance(RSA_TRANS, BouncyCastleProvider.PROVIDER_NAME);
+ dataKeyCipher = Cipher.getInstance(RSA_TRANS, providerName);
} else if (ECDSA.equals(pubKey.getAlgorithm())) {
- dataKeyCipher = Cipher.getInstance(ECIES, BouncyCastleProvider.PROVIDER_NAME);
+ dataKeyCipher = Cipher.getInstance(ECIES, providerName);
} else {
String msg = logCtx + "Unsupported key type " + pubKey.getAlgorithm() + " for key " + keyName;
log.error(msg);
@@ -477,9 +476,9 @@ private boolean decryptDataKey(String keyName, byte[] encryptedDataKey, List
org.bouncycastle
bcpkix-jdk15on
+ ${bouncycastle.version}
+
+
+ org.bouncycastle
+ bcpkix-fips
+ 1.0.1
-
org.apache.bookkeeper
circe-checksum
diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/util/SecurityUtility.java b/pulsar-common/src/main/java/org/apache/pulsar/common/util/SecurityUtility.java
index f77743faf0475..03783b3fc7ba6 100644
--- a/pulsar-common/src/main/java/org/apache/pulsar/common/util/SecurityUtility.java
+++ b/pulsar-common/src/main/java/org/apache/pulsar/common/util/SecurityUtility.java
@@ -51,18 +51,18 @@
import javax.net.ssl.SSLException;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
+
+import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import org.eclipse.jetty.util.ssl.SslContextFactory;
/**
* Helper class for the security domain.
*/
public class SecurityUtility {
-
static {
// Fixes loading PKCS8Key file: https://stackoverflow.com/a/18912362
- java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
+ java.security.Security.addProvider(new BouncyCastleFipsProvider());
}
-
public static SSLContext createSslContext(boolean allowInsecureConnection, Certificate[] trustCertificates)
throws GeneralSecurityException {
return createSslContext(allowInsecureConnection, trustCertificates, (Certificate[]) null, (PrivateKey) null);
diff --git a/pulsar-proxy/pom.xml b/pulsar-proxy/pom.xml
index b5e60ecbb7eca..c76b7e9b41021 100644
--- a/pulsar-proxy/pom.xml
+++ b/pulsar-proxy/pom.xml
@@ -165,5 +165,17 @@
com.beust
jcommander
+
+ org.bouncycastle
+ bcpkix-jdk15on
+ ${bouncycastle.version}
+
+
+
+ org.bouncycastle
+ bcprov-ext-jdk15on
+ ${bouncycastle.version}
+
+