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} + +