Repository: commons-crypto Updated Branches: refs/heads/master bccccdbfd -> 4117c5696
CRYPTO-76: Remove log dependence Project: http://git-wip-us.apache.org/repos/asf/commons-crypto/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-crypto/commit/4117c569 Tree: http://git-wip-us.apache.org/repos/asf/commons-crypto/tree/4117c569 Diff: http://git-wip-us.apache.org/repos/asf/commons-crypto/diff/4117c569 Branch: refs/heads/master Commit: 4117c569644cce4684528c35fdfcc2947233a680 Parents: bccccdb Author: Sun Dapeng <s...@apache.org> Authored: Mon Jun 20 10:03:18 2016 +0800 Committer: Sun Dapeng <s...@apache.org> Committed: Mon Jun 20 10:21:16 2016 +0800 ---------------------------------------------------------------------- pom.xml | 2 + .../crypto/cipher/CryptoCipherFactory.java | 62 ++++++-------------- .../apache/commons/crypto/cipher/Openssl.java | 6 -- .../commons/crypto/conf/ConfigurationKeys.java | 19 +++++- .../crypto/random/CryptoRandomFactory.java | 23 ++++---- .../crypto/random/OpensslCryptoRandom.java | 7 +-- .../commons/crypto/random/OsCryptoRandom.java | 7 +-- .../apache/commons/crypto/utils/IOUtils.java | 8 +-- .../commons/crypto/utils/NativeCodeLoader.java | 24 ++------ .../org/apache/commons/crypto/utils/Utils.java | 23 +++++++- .../crypto/cipher/CryptoCipherFactoryTest.java | 23 +++++++- 11 files changed, 102 insertions(+), 102 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index b12e573..4529a5f 100644 --- a/pom.xml +++ b/pom.xml @@ -498,11 +498,13 @@ The following provides more details on the included cryptographic software: <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>${commons-logging.version}</version> + <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j-api.version}</version> + <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/cipher/CryptoCipherFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/cipher/CryptoCipherFactory.java b/src/main/java/org/apache/commons/crypto/cipher/CryptoCipherFactory.java index 9e59cff..3509162 100644 --- a/src/main/java/org/apache/commons/crypto/cipher/CryptoCipherFactory.java +++ b/src/main/java/org/apache/commons/crypto/cipher/CryptoCipherFactory.java @@ -18,24 +18,17 @@ package org.apache.commons.crypto.cipher; import java.security.GeneralSecurityException; -import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.commons.crypto.utils.ReflectionUtils; import org.apache.commons.crypto.utils.Utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This is the factory class used for creating cipher class */ public class CryptoCipherFactory { - /** LOG instance for {@link CryptoCipherFactory} */ - private final static Logger LOG = LoggerFactory - .getLogger(CryptoCipherFactory.class); - /** * The private Constructor of {@link CryptoCipherFactory}. */ @@ -53,28 +46,36 @@ public class CryptoCipherFactory { */ public static CryptoCipher getInstance(CipherTransformation transformation, Properties props) throws GeneralSecurityException { - List<Class<? extends CryptoCipher>> klasses = getCipherClasses(props); + + List<String> klasses = Utils.splitClassNames( + Utils.getCipherClassString(props), ","); CryptoCipher cipher = null; + + StringBuilder errorMessage = new StringBuilder("CryptoCipher "); if (klasses != null) { - for (Class<? extends CryptoCipher> klass : klasses) { + for (String klass : klasses) { try { - cipher = ReflectionUtils.newInstance(klass, props, - transformation); + Class<?> cls = ReflectionUtils.getClassByName(klass); + cipher = ReflectionUtils.newInstance(cls.asSubclass + (CryptoCipher.class), props, transformation); if (cipher != null) { - LOG.debug("Using cipher {} for transformation {}.", - klass.getName(), transformation.getName()); break; } } catch (Exception e) { - LOG.error( - "CryptoCipher {} is not available or transformation {} is not " - + "supported.", klass.getName(), - transformation.getName()); + errorMessage.append("{" + klass + "}"); } } } - return (cipher == null) ? new JceCipher(props, transformation) : cipher; + if (cipher != null) { + return cipher; + } else if (Utils.isFallbackEnable(props)) { + return new JceCipher(props,transformation); + } else { + errorMessage.append(" is not available or transformation " + + transformation.getName() + " is not supported."); + throw new GeneralSecurityException(errorMessage.toString()); + } } /** @@ -91,29 +92,4 @@ public class CryptoCipherFactory { return getInstance(transformation, new Properties()); } - /** - * Returns OpenSSLCipher if Properties is null or empty by default. - * - * @param props the configuration properties. - * @return the OpenSSLCipher instance. - */ - private static List<Class<? extends CryptoCipher>> getCipherClasses( - Properties props) { - List<Class<? extends CryptoCipher>> result = new ArrayList<Class<? extends CryptoCipher>>(); - String cipherClassString = Utils.getCipherClassString(props); - - for (String c : Utils.splitClassNames(cipherClassString, ",")) { - try { - Class<?> cls = ReflectionUtils.getClassByName(c); - result.add(cls.asSubclass(CryptoCipher.class)); - } catch (ClassCastException e) { - LOG.error("Class {} is not a CryptoCipher.", c); - } catch (ClassNotFoundException e) { - LOG.error("CryptoCipher {} not found.", c); - } - } - - return result; - } - } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/cipher/Openssl.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/cipher/Openssl.java b/src/main/java/org/apache/commons/crypto/cipher/Openssl.java index 34989ed..0953202 100644 --- a/src/main/java/org/apache/commons/crypto/cipher/Openssl.java +++ b/src/main/java/org/apache/commons/crypto/cipher/Openssl.java @@ -20,15 +20,11 @@ package org.apache.commons.crypto.cipher; import java.nio.ByteBuffer; import java.security.NoSuchAlgorithmException; import java.util.StringTokenizer; - import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.ShortBufferException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import org.apache.commons.crypto.utils.NativeCodeLoader; import org.apache.commons.crypto.utils.Utils; @@ -37,7 +33,6 @@ import org.apache.commons.crypto.utils.Utils; * It's flexible to add other crypto algorithms/modes. */ final class Openssl { - private static final Log LOG = LogFactory.getLog(Openssl.class.getName()); // Mode constant defined by Openssl JNI public static final int ENCRYPT_MODE = 1; @@ -101,7 +96,6 @@ final class Openssl { } } catch (Throwable t) { loadingFailure = t.getMessage(); - LOG.debug("Failed to load OpenSSL CryptoCipher.", t); } finally { loadingFailureReason = loadingFailure; } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/conf/ConfigurationKeys.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/conf/ConfigurationKeys.java b/src/main/java/org/apache/commons/crypto/conf/ConfigurationKeys.java index 04d89b2..d808f0d 100644 --- a/src/main/java/org/apache/commons/crypto/conf/ConfigurationKeys.java +++ b/src/main/java/org/apache/commons/crypto/conf/ConfigurationKeys.java @@ -130,9 +130,22 @@ public class ConfigurationKeys { public static final String COMMONS_CRYPTO_LIB_TEMPDIR_KEY = CONF_PREFIX + "lib.tempdir"; - /** - * The private constructor of {@Link ConfigurationKeys}. - */ + /** + * The configuration key of enable fallback on native failed. + */ + public static final String + COMMONS_CRYPTO_ENABLE_FALLBACK_ON_NATIVE_FAILED_KEY = CONF_PREFIX + + "enable.fallback"; + + /** + * The default value of enable fallback on native failed. + */ + public static final boolean + COMMONS_CRYPTO_ENABLE_FALLBACK_ON_NATIVE_FAILED_DEFAULT = true; + + /** + * The private constructor of {@Link ConfigurationKeys}. + */ private ConfigurationKeys() { } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/random/CryptoRandomFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/random/CryptoRandomFactory.java b/src/main/java/org/apache/commons/crypto/random/CryptoRandomFactory.java index f1dc270..a97a853 100644 --- a/src/main/java/org/apache/commons/crypto/random/CryptoRandomFactory.java +++ b/src/main/java/org/apache/commons/crypto/random/CryptoRandomFactory.java @@ -20,20 +20,14 @@ package org.apache.commons.crypto.random; import java.security.GeneralSecurityException; import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.commons.crypto.utils.Utils; import org.apache.commons.crypto.utils.ReflectionUtils; - +import org.apache.commons.crypto.utils.Utils; import static org.apache.commons.crypto.conf.ConfigurationKeys.COMMONS_CRYPTO_SECURE_RANDOM_CLASSES_KEY; /** * This is the factory class used for {@link CryptoRandom}. */ public class CryptoRandomFactory { - public final static Logger LOG = LoggerFactory - .getLogger(CryptoRandomFactory.class); /** * The private constructor of {@Link CryptoRandomFactory}. @@ -64,6 +58,7 @@ public class CryptoRandomFactory { .getProperty(COMMONS_CRYPTO_SECURE_RANDOM_CLASSES_KEY); } + StringBuilder errorMessage = new StringBuilder(); CryptoRandom random = null; if (cryptoRandomClasses != null) { for (String klassName : Utils.splitClassNames(cryptoRandomClasses, @@ -77,13 +72,21 @@ public class CryptoRandomFactory { break; } } catch (ClassCastException e) { - LOG.error("Class {} is not a CryptoCipher.", klassName); + errorMessage.append("Class: [" + klassName + "] is not a " + + "CryptoCipher."); } catch (ClassNotFoundException e) { - LOG.error("CryptoCipher {} not found.", klassName); + errorMessage.append("CryptoCipher: [" + klassName + "] " + + "not " + "found."); } } } - return (random == null) ? new JavaCryptoRandom(props) : random; + if (random != null) { + return random; + } else if (Utils.isFallbackEnable(props)) { + return new JavaCryptoRandom(props); + } else { + throw new GeneralSecurityException(errorMessage.toString()); + } } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/random/OpensslCryptoRandom.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/random/OpensslCryptoRandom.java b/src/main/java/org/apache/commons/crypto/random/OpensslCryptoRandom.java index 1813624..af78ddd 100644 --- a/src/main/java/org/apache/commons/crypto/random/OpensslCryptoRandom.java +++ b/src/main/java/org/apache/commons/crypto/random/OpensslCryptoRandom.java @@ -21,9 +21,6 @@ import java.security.NoSuchAlgorithmException; import java.util.Properties; import java.util.Random; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import org.apache.commons.crypto.utils.NativeCodeLoader; import org.apache.commons.crypto.utils.Utils; @@ -46,8 +43,6 @@ import org.apache.commons.crypto.utils.Utils; */ public class OpensslCryptoRandom extends Random implements CryptoRandom { private static final long serialVersionUID = -7828193502768789584L; - private static final Log LOG = LogFactory.getLog(OpensslCryptoRandom.class - .getName()); /** If native SecureRandom unavailable, use java SecureRandom */ private final JavaCryptoRandom fallback; @@ -60,7 +55,7 @@ public class OpensslCryptoRandom extends Random implements CryptoRandom { OpensslCryptoRandomNative.initSR(); opensslLoaded = true; } catch (Throwable t) { - LOG.error("Failed to load Openssl CryptoRandom", t); + ; // NOPMD } } nativeEnabled = opensslLoaded; http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/random/OsCryptoRandom.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/random/OsCryptoRandom.java b/src/main/java/org/apache/commons/crypto/random/OsCryptoRandom.java index d53f074..1525023 100644 --- a/src/main/java/org/apache/commons/crypto/random/OsCryptoRandom.java +++ b/src/main/java/org/apache/commons/crypto/random/OsCryptoRandom.java @@ -25,19 +25,16 @@ import java.util.Random; import org.apache.commons.crypto.utils.IOUtils; import org.apache.commons.crypto.utils.Utils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * A Random implementation that uses random bytes sourced from the operating * system. */ public class OsCryptoRandom extends Random implements CryptoRandom { - public static final Log LOG = LogFactory.getLog(OsCryptoRandom.class); private static final long serialVersionUID = 6391500337172057900L; - private final int RESERVOIR_LENGTH = 8192; + private static final int RESERVOIR_LENGTH = 8192; private String randomDevPath; @@ -131,7 +128,7 @@ public class OsCryptoRandom extends Random implements CryptoRandom { @Override synchronized public void close() { if (stream != null) { - IOUtils.cleanup(LOG, stream); + IOUtils.cleanup(stream); stream = null; } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/utils/IOUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/utils/IOUtils.java b/src/main/java/org/apache/commons/crypto/utils/IOUtils.java index a766613..521bdf2 100644 --- a/src/main/java/org/apache/commons/crypto/utils/IOUtils.java +++ b/src/main/java/org/apache/commons/crypto/utils/IOUtils.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.io.InputStream; import org.apache.commons.crypto.stream.input.Input; -import org.apache.commons.logging.Log; /** * General utility methods for working with IO. @@ -85,18 +84,15 @@ public final class IOUtils { * Closes the Closeable objects and <b>ignore</b> any {@link IOException} or * null pointers. Must only be used for cleanup in exception handlers. * - * @param log the log to record problems to at debug level. Can be null. * @param closeables the objects to close. */ - public static void cleanup(Log log, java.io.Closeable... closeables) { + public static void cleanup(java.io.Closeable... closeables) { for (java.io.Closeable c : closeables) { if (c != null) { try { c.close(); } catch (Throwable e) { - if (log != null && log.isDebugEnabled()) { - log.debug("Exception in closing " + c, e); - } + ; // NOPMD } } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/utils/NativeCodeLoader.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/utils/NativeCodeLoader.java b/src/main/java/org/apache/commons/crypto/utils/NativeCodeLoader.java index 59a102f..8738157 100644 --- a/src/main/java/org/apache/commons/crypto/utils/NativeCodeLoader.java +++ b/src/main/java/org/apache/commons/crypto/utils/NativeCodeLoader.java @@ -27,9 +27,6 @@ import java.net.URL; import java.util.Properties; import java.util.UUID; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - /** * A helper to load the native code i.e. libcommons-crypto.so. This handles the * fallback to either the bundled libcommons-crypto-Linux-i386-32.so or the @@ -37,8 +34,6 @@ import org.apache.commons.logging.LogFactory; */ public final class NativeCodeLoader { - private static final Log LOG = LogFactory.getLog(NativeCodeLoader.class); - private final static boolean nativeCodeLoaded; /** * The private constructor of {@Link NativeCodeLoader}. @@ -48,11 +43,9 @@ public final class NativeCodeLoader { static { // Try to load native library and set fallback flag appropriately - if (LOG.isDebugEnabled()) { - LOG.debug("Trying to load the custom-built native-commons-crypto library..."); - } - boolean nativeLoaded = false; + + //Trying to load the custom-built native-commons-crypto library..."); try { File nativeLibFile = findNativeLibrary(); if (nativeLibFile != null) { @@ -62,22 +55,13 @@ public final class NativeCodeLoader { // Load preinstalled library (in the path -Djava.library.path) System.loadLibrary("commons-crypto"); } - LOG.debug("Loaded the native library"); + // Loaded the native library nativeLoaded = true; } catch (Throwable t) { - // Ignore failure to load - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to load native library with error: " + t); - LOG.debug("java.library.path=" - + System.getProperty("java.library.path")); - } + ;// NOPMD: Ignore failure to load } nativeCodeLoaded = nativeLoaded; - if (!nativeCodeLoaded) { - LOG.warn("Unable to load native library for the platform... " - + "using builtin-java classes where applicable"); - } } /** http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/main/java/org/apache/commons/crypto/utils/Utils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/utils/Utils.java b/src/main/java/org/apache/commons/crypto/utils/Utils.java index 46212d5..0388a0e 100644 --- a/src/main/java/org/apache/commons/crypto/utils/Utils.java +++ b/src/main/java/org/apache/commons/crypto/utils/Utils.java @@ -275,7 +275,7 @@ public final class Utils { int sum = 0; while (i-- > 0) { // (sum >>> Byte.SIZE) is the carry for addition - sum = (initIV[i] & 0xff) + (sum >>> Byte.SIZE); + sum = (initIV[i] & 0xff) + (sum >>> Byte.SIZE); // NOPMD if (j++ < 8) { // Big-endian, and long is 8 bytes length sum += (byte) counter & 0xff; counter >>>= 8; @@ -385,4 +385,25 @@ public final class Utils { } return res; } + + /** + * Returns true if Fallback is enabled when native failed. + * @param props The <code>Properties</code> class represents a set of + * properties. + * @return true if Fallback is enabled when native failed. + */ + public static boolean isFallbackEnable(Properties props) { + String enableFallback = props.getProperty(ConfigurationKeys. + COMMONS_CRYPTO_ENABLE_FALLBACK_ON_NATIVE_FAILED_KEY); + if (enableFallback == null || enableFallback.isEmpty()) { + enableFallback = System.getProperty(ConfigurationKeys. + COMMONS_CRYPTO_ENABLE_FALLBACK_ON_NATIVE_FAILED_KEY); + } + if (enableFallback == null || enableFallback.isEmpty()) { + return ConfigurationKeys + .COMMONS_CRYPTO_ENABLE_FALLBACK_ON_NATIVE_FAILED_DEFAULT; + } else { + return Boolean.valueOf(enableFallback); + } + } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/4117c569/src/test/java/org/apache/commons/crypto/cipher/CryptoCipherFactoryTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/crypto/cipher/CryptoCipherFactoryTest.java b/src/test/java/org/apache/commons/crypto/cipher/CryptoCipherFactoryTest.java index c54cfab..1f4b162 100644 --- a/src/test/java/org/apache/commons/crypto/cipher/CryptoCipherFactoryTest.java +++ b/src/test/java/org/apache/commons/crypto/cipher/CryptoCipherFactoryTest.java @@ -24,6 +24,7 @@ import org.apache.commons.crypto.conf.ConfigurationKeys; import org.junit.Assert; import org.junit.Test; +import static junit.framework.Assert.fail; public class CryptoCipherFactoryTest { @Test @@ -37,7 +38,8 @@ public class CryptoCipherFactoryTest { @Test public void testEmptyCipher() throws GeneralSecurityException { Properties properties = new Properties(); - properties.put(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, ""); + properties.setProperty( + ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, ""); CryptoCipher defaultCipher = CryptoCipherFactory.getInstance( CipherTransformation.AES_CBC_NOPADDING, properties); Assert.assertEquals(OpensslCipher.class.getName(), defaultCipher @@ -47,11 +49,28 @@ public class CryptoCipherFactoryTest { @Test public void testInvalidCipher() throws GeneralSecurityException { Properties properties = new Properties(); - properties.put(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, + properties.setProperty(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, "InvalidCipherName"); CryptoCipher defaultCipher = CryptoCipherFactory.getInstance( CipherTransformation.AES_CBC_NOPADDING, properties); Assert.assertEquals(JceCipher.class.getName(), defaultCipher.getClass() .getName()); } + + @Test + public void testDisableFallback() throws GeneralSecurityException { + Properties properties = new Properties(); + properties.setProperty( + ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, + "InvalidCipherName"); + properties.setProperty(ConfigurationKeys + .COMMONS_CRYPTO_ENABLE_FALLBACK_ON_NATIVE_FAILED_KEY, "false"); + try { + CryptoCipher defaultCipher = CryptoCipherFactory.getInstance( + CipherTransformation.AES_CBC_NOPADDING, properties); + fail("Should throw an exception when DisableFallback"); + } catch (Exception e) { + ; + } + } }