You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by sd...@apache.org on 2016/06/29 05:08:28 UTC

commons-crypto git commit: CRYPTO-74: Full class names make code more difficult to update

Repository: commons-crypto
Updated Branches:
  refs/heads/master 42f541f39 -> c8829a514


CRYPTO-74: Full class names make code more difficult to update


Project: http://git-wip-us.apache.org/repos/asf/commons-crypto/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-crypto/commit/c8829a51
Tree: http://git-wip-us.apache.org/repos/asf/commons-crypto/tree/c8829a51
Diff: http://git-wip-us.apache.org/repos/asf/commons-crypto/diff/c8829a51

Branch: refs/heads/master
Commit: c8829a5142708eac5bdf2237b18d7c4badb130d0
Parents: 42f541f
Author: Sun Dapeng <sd...@apache.org>
Authored: Wed Jun 29 11:31:26 2016 +0800
Committer: Sun Dapeng <sd...@apache.org>
Committed: Wed Jun 29 13:03:23 2016 +0800

----------------------------------------------------------------------
 .../crypto/cipher/CryptoCipherFactory.java      | 54 ++++++++++++++++++--
 .../crypto/examples/CipherByteArrayExample.java | 10 +++-
 .../commons/crypto/examples/RandomExample.java  |  2 +-
 .../crypto/random/CryptoRandomFactory.java      | 49 ++++++++++++++++++
 4 files changed, 108 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/c8829a51/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 55a3203..8ba54c6 100644
--- a/src/main/java/org/apache/commons/crypto/cipher/CryptoCipherFactory.java
+++ b/src/main/java/org/apache/commons/crypto/cipher/CryptoCipherFactory.java
@@ -30,10 +30,56 @@ import org.apache.commons.crypto.utils.Utils;
 public class CryptoCipherFactory {
 
     /**
+     * Defines the internal CryptoCipher implementations.
+     * <p>
+     * Usage:
+     * <p>
+     * <code>
+     * props.setProperty(CIPHER_CLASSES_KEY, CipherProvider.OPENSSL.getClassName());
+     * </code>
+     */
+    public enum CipherProvider {
+
+        OPENSSL(OpensslCipher.class),
+        JCE(JceCipher.class);
+
+        private final Class<? extends CryptoCipher> klass;
+
+        private final String className;
+
+        /**
+         * Constructs a CihpherProvider.
+         *
+         * @param klass the implementation of provider
+         */
+        private CipherProvider(Class<? extends CryptoCipher> klass) {
+            this.klass = klass;
+            this.className = klass.getName();
+        }
+
+        /**
+         * Gets the class name of the provider.
+         *
+         * @return the name of the provider class
+         */
+        public String getClassName() {
+            return className;
+        }
+
+        /**
+         * Gets the implementation class of the provider.
+         *
+         * @return the implementation class of the provider
+         */
+        public Class<? extends CryptoCipher> getImplClass() {
+            return klass;
+        }
+    }
+
+    /**
      * The default value (OpensslCipher) for crypto cipher.
      */
-    private static final String CIPHER_CLASSES_DEFAULT = 
-            OpensslCipher.class.getName();
+    private static final String CIPHER_CLASSES_DEFAULT = CipherProvider.OPENSSL.getClassName();
 
     /**
      * The private Constructor of {@link CryptoCipherFactory}.
@@ -44,7 +90,7 @@ public class CryptoCipherFactory {
     /**
      * Gets a cipher instance for specified algorithm/mode/padding.
      *
-     * @param props  the configuration properties 
+     * @param props  the configuration properties
      *      (uses ConfigurationKeys.ENABLE_FALLBACK_ON_NATIVE_FAILED_KEY and ConfigurationKeys.CIPHER_CLASSES_KEY)
      * @param transformation  algorithm/mode/padding
      * @return CryptoCipher  the cipher  (defaults to OpensslCipher if available, else JceCipher)
@@ -52,7 +98,7 @@ public class CryptoCipherFactory {
      * @throws IllegalArgumentException if no classname(s) are provided and fallback is disabled
      */
     public static CryptoCipher getInstance(String transformation,
-            Properties props) throws GeneralSecurityException {
+                                           Properties props) throws GeneralSecurityException {
 
         CryptoCipher cipher = null;
 

http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/c8829a51/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java b/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java
index f36ab58..784b722 100644
--- a/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java
+++ b/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java
@@ -26,7 +26,9 @@ import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
 
 import org.apache.commons.crypto.cipher.CryptoCipher;
+import org.apache.commons.crypto.cipher.CryptoCipherFactory.CipherProvider;
 import org.apache.commons.crypto.utils.Utils;
+import static org.apache.commons.crypto.conf.ConfigurationKeys.CIPHER_CLASSES_KEY;
 
 /**
  * Example showing use of the CryptoCipher API using a byte array
@@ -39,6 +41,7 @@ public class CipherByteArrayExample {
         final IvParameterSpec iv = new IvParameterSpec(getUTF8Bytes("1234567890123456"));
 
         Properties properties = new Properties();
+        properties.setProperty(CIPHER_CLASSES_KEY, CipherProvider.OPENSSL.getClassName());
         //Creates a CryptoCipher instance with the transformation and properties.
         final String transform = "AES/CBC/PKCS5Padding";
         CryptoCipher encipher = Utils.getCipherInstance(transform, properties);
@@ -48,7 +51,7 @@ public class CipherByteArrayExample {
         System.out.println("input:  " + sampleInput);
 
         byte[] input = getUTF8Bytes(sampleInput);
-        byte[] output = new byte[32]; 
+        byte[] output = new byte[32];
 
         //Initializes the cipher with ENCRYPT_MODE, key and iv.
         encipher.init(Cipher.ENCRYPT_MODE, key, iv);
@@ -63,8 +66,11 @@ public class CipherByteArrayExample {
 
         System.out.println(Arrays.toString(Arrays.copyOf(output, updateBytes+finalBytes)));
 
-        // Now reverse the process
+        // Now reverse the process using a different implementation with the same settings
+        properties.setProperty(CIPHER_CLASSES_KEY, CipherProvider.JCE.getClassName());
         CryptoCipher decipher = Utils.getCipherInstance(transform, properties);
+        System.out.println("Cipher:  " + encipher.getClass().getCanonicalName());
+
         decipher.init(Cipher.DECRYPT_MODE, key, iv);
         byte [] decoded = new byte[32];
         decipher.doFinal(output, 0, updateBytes + finalBytes, decoded, 0);

http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/c8829a51/src/main/java/org/apache/commons/crypto/examples/RandomExample.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/crypto/examples/RandomExample.java b/src/main/java/org/apache/commons/crypto/examples/RandomExample.java
index 7b19b62..2a9ff41 100644
--- a/src/main/java/org/apache/commons/crypto/examples/RandomExample.java
+++ b/src/main/java/org/apache/commons/crypto/examples/RandomExample.java
@@ -38,7 +38,7 @@ public class RandomExample {
 
         Properties properties = new Properties();
         properties.put(ConfigurationKeys.SECURE_RANDOM_CLASSES_KEY,
-                "org.apache.commons.crypto.random.OpensslCryptoRandom"); // TODO replace with alias
+            CryptoRandomFactory.RandomProvider.OPENSSL.getClassName());
 
         //Gets the 'CryptoRandom' instance.
         CryptoRandom random = CryptoRandomFactory.getCryptoRandom(properties);

http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/c8829a51/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 4b9fc58..899a908 100644
--- a/src/main/java/org/apache/commons/crypto/random/CryptoRandomFactory.java
+++ b/src/main/java/org/apache/commons/crypto/random/CryptoRandomFactory.java
@@ -30,6 +30,55 @@ import static org.apache.commons.crypto.conf.ConfigurationKeys.SECURE_RANDOM_CLA
 public class CryptoRandomFactory {
 
     /**
+     * Defines the internal CryptoRandom implementations.
+     * <p>
+     * Usage:
+     * <p>
+     * <code>
+     * props.setProperty(RANDOM_CLASSES_KEY,
+     *  CipherProvider.OPENSSL.getClassName());
+     * </code>
+     */
+    public enum RandomProvider {
+
+        OPENSSL(OpensslCryptoRandom.class),
+        JCE(JavaCryptoRandom.class),
+        OS(OsCryptoRandom.class);
+
+        private final Class<? extends CryptoRandom> klass;
+
+        private final String className;
+
+        /**
+         * Constructs a RandomProvider.
+         *
+         * @param klass the implementation of provider
+         */
+        private RandomProvider(Class<? extends CryptoRandom> klass) {
+            this.klass = klass;
+            this.className = klass.getName();
+        }
+
+        /**
+         * Gets the class name of the provider.
+         *
+         * @return the name of the provider class
+         */
+        public String getClassName() {
+            return className;
+        }
+
+        /**
+         * Gets the implementation class of the provider.
+         *
+         * @return the implementation class of the provider
+         */
+        public Class<? extends CryptoRandom> getImplClass() {
+            return klass;
+        }
+    }
+
+    /**
      * The private constructor of {@Link CryptoRandomFactory}.
      */
     private CryptoRandomFactory() {