http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/95a8d486/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 228cee7..df41b54 100644 --- a/src/main/java/org/apache/commons/crypto/utils/NativeCodeLoader.java +++ b/src/main/java/org/apache/commons/crypto/utils/NativeCodeLoader.java @@ -30,259 +30,257 @@ 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 default java implementations where appropriate. + * 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 + * default java implementations where appropriate. */ public class NativeCodeLoader { - private static final Log LOG = - LogFactory.getLog(NativeCodeLoader.class); - - private final static boolean nativeCodeLoaded; + private static final Log LOG = LogFactory.getLog(NativeCodeLoader.class); - private NativeCodeLoader() {} + private final static boolean nativeCodeLoaded; - 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..."); + private NativeCodeLoader() { } - boolean nativeLoaded = false; - try { - File nativeLibFile = findNativeLibrary(); - if (nativeLibFile != null) { - // Load extracted or specified native library. - System.load(nativeLibFile.getAbsolutePath()); - } else { - // Load preinstalled library (in the path -Djava.library.path) - System.loadLibrary("commons-crypto"); - } - LOG.debug("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")); - } - } + 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..."); + } - nativeCodeLoaded = nativeLoaded; - if (!nativeCodeLoaded) { - LOG.warn("Unable to load native library for the platform... " - + "using builtin-java classes where applicable"); + boolean nativeLoaded = false; + try { + File nativeLibFile = findNativeLibrary(); + if (nativeLibFile != null) { + // Load extracted or specified native library. + System.load(nativeLibFile.getAbsolutePath()); + } else { + // Load preinstalled library (in the path -Djava.library.path) + System.loadLibrary("commons-crypto"); + } + LOG.debug("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")); + } + } + + nativeCodeLoaded = nativeLoaded; + if (!nativeCodeLoaded) { + LOG.warn("Unable to load native library for the platform... " + + "using builtin-java classes where applicable"); + } } - } - static File findNativeLibrary() { - // Try to load the library in commons-crypto.lib.path */ - String nativeLibraryPath = Utils - .getLibPath(); - String nativeLibraryName = Utils - .getLibName(); + static File findNativeLibrary() { + // Try to load the library in commons-crypto.lib.path */ + String nativeLibraryPath = Utils.getLibPath(); + String nativeLibraryName = Utils.getLibName(); - // Resolve the library file name with a suffix (e.g., dll, .so, etc.) - if (nativeLibraryName == null) { - nativeLibraryName = System.mapLibraryName("commons-crypto"); - } - if (nativeLibraryPath != null) { - File nativeLib = new File(nativeLibraryPath, - nativeLibraryName); - if (nativeLib.exists()) { - return nativeLib; - } - } + // Resolve the library file name with a suffix (e.g., dll, .so, etc.) + if (nativeLibraryName == null) { + nativeLibraryName = System.mapLibraryName("commons-crypto"); + } + if (nativeLibraryPath != null) { + File nativeLib = new File(nativeLibraryPath, nativeLibraryName); + if (nativeLib.exists()) { + return nativeLib; + } + } - // Load an OS-dependent native library inside a jar file - nativeLibraryPath = "/org/apache/commons/crypto/native/" - + OSInfo.getNativeLibFolderPathForCurrentOS(); - boolean hasNativeLib = hasResource(nativeLibraryPath + "/" - + nativeLibraryName); - if(!hasNativeLib) { - if (OSInfo.getOSName().equals("Mac")) { - // Fix for openjdk7 for Mac - String altName = "libcommons-crypto.jnilib"; - if (hasResource(nativeLibraryPath + "/" + altName)) { - nativeLibraryName = altName; - hasNativeLib = true; + // Load an OS-dependent native library inside a jar file + nativeLibraryPath = "/org/apache/commons/crypto/native/" + + OSInfo.getNativeLibFolderPathForCurrentOS(); + boolean hasNativeLib = hasResource(nativeLibraryPath + "/" + + nativeLibraryName); + if (!hasNativeLib) { + if (OSInfo.getOSName().equals("Mac")) { + // Fix for openjdk7 for Mac + String altName = "libcommons-crypto.jnilib"; + if (hasResource(nativeLibraryPath + "/" + altName)) { + nativeLibraryName = altName; + hasNativeLib = true; + } + } } - } - } - if (!hasNativeLib) { - String errorMessage = String.format( - "no native library is found for os.name=%s and os.arch=%s", - OSInfo.getOSName(), OSInfo.getArchName()); - throw new RuntimeException(errorMessage); - } + if (!hasNativeLib) { + String errorMessage = String.format( + "no native library is found for os.name=%s and os.arch=%s", + OSInfo.getOSName(), OSInfo.getArchName()); + throw new RuntimeException(errorMessage); + } + + // Temporary folder for the native lib. Use the value of + // commons-crypto.tempdir or java.io.tmpdir + String tempFolder = new File(Utils.getTmpDir()).getAbsolutePath(); - // Temporary folder for the native lib. Use the value of - // commons-crypto.tempdir or java.io.tmpdir - String tempFolder = new File(Utils.getTmpDir()) - .getAbsolutePath(); + // Extract and load a native library inside the jar file + return extractLibraryFile(nativeLibraryPath, nativeLibraryName, + tempFolder); + } - // Extract and load a native library inside the jar file - return extractLibraryFile(nativeLibraryPath, - nativeLibraryName, tempFolder); - } + /** + * Extracts the specified library file to the target folder. + * + * @param libFolderForCurrentOS the library in commons-crypto.lib.path. + * @param libraryFileName the library name. + * @param targetFolder Target folder for the native lib. Use the value of + * commons-crypto.tempdir or java.io.tmpdir. + * @return the library file. + */ + private static File extractLibraryFile(String libFolderForCurrentOS, + String libraryFileName, String targetFolder) { + String nativeLibraryFilePath = libFolderForCurrentOS + "/" + + libraryFileName; - /** - * Extracts the specified library file to the target folder. - * - * @param libFolderForCurrentOS the library in commons-crypto.lib.path. - * @param libraryFileName the library name. - * @param targetFolder Target folder for the native lib. Use the value of - * commons-crypto.tempdir or java.io.tmpdir. - * @return the library file. - */ - private static File extractLibraryFile(String libFolderForCurrentOS, - String libraryFileName, String targetFolder) { - String nativeLibraryFilePath = libFolderForCurrentOS + "/" - + libraryFileName; + // Attach UUID to the native library file to ensure multiple class + // loaders + // can read the libcommons-crypto multiple times. + String uuid = UUID.randomUUID().toString(); + String extractedLibFileName = String.format("commons-crypto-%s-%s-%s", + getVersion(), uuid, libraryFileName); + File extractedLibFile = new File(targetFolder, extractedLibFileName); - // Attach UUID to the native library file to ensure multiple class loaders - // can read the libcommons-crypto multiple times. - String uuid = UUID.randomUUID().toString(); - String extractedLibFileName = String.format("commons-crypto-%s-%s-%s", getVersion(), uuid, - libraryFileName); - File extractedLibFile = new File(targetFolder, extractedLibFileName); + InputStream reader = null; + try { + // Extract a native library file into the target directory + reader = NativeCodeLoader.class + .getResourceAsStream(nativeLibraryFilePath); + FileOutputStream writer = new FileOutputStream(extractedLibFile); + try { + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); + } + } finally { + // Delete the extracted lib file on JVM exit. + extractedLibFile.deleteOnExit(); - InputStream reader = null; - try { - // Extract a native library file into the target directory - reader = NativeCodeLoader.class.getResourceAsStream(nativeLibraryFilePath); - FileOutputStream writer = new FileOutputStream(extractedLibFile); - try { - byte[] buffer = new byte[8192]; - int bytesRead; - while ((bytesRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, bytesRead); - } - } finally { - // Delete the extracted lib file on JVM exit. - extractedLibFile.deleteOnExit(); + if (writer != null) { + writer.close(); + } - if (writer != null){ - writer.close(); - } + if (reader != null) { + reader.close(); + reader = null; + } + } - if (reader != null) { - reader.close(); - reader = null; - } - } + // Set executable (x) flag to enable Java to load the native library + if (!extractedLibFile.setReadable(true) + || !extractedLibFile.setExecutable(true) + || !extractedLibFile.setWritable(true, true)) { + throw new RuntimeException("Invalid path for library path"); + } - // Set executable (x) flag to enable Java to load the native library - if (!extractedLibFile.setReadable(true) || !extractedLibFile.setExecutable(true) - || !extractedLibFile.setWritable(true, true)) { - throw new RuntimeException("Invalid path for library path"); - } + // Check whether the contents are properly copied from the resource + // folder + { + InputStream nativeIn = null; + InputStream extractedLibIn = null; + try { + nativeIn = NativeCodeLoader.class + .getResourceAsStream(nativeLibraryFilePath); + extractedLibIn = new FileInputStream(extractedLibFile); + if (!contentsEquals(nativeIn, extractedLibIn)) { + throw new RuntimeException(String.format( + "Failed to write a native library file at %s", + extractedLibFile)); + } + } finally { + if (nativeIn != null) { + nativeIn.close(); + } + if (extractedLibIn != null) { + extractedLibIn.close(); + } + } + } - // Check whether the contents are properly copied from the resource folder - { - InputStream nativeIn = null; - InputStream extractedLibIn = null; - try { - nativeIn = - NativeCodeLoader.class.getResourceAsStream(nativeLibraryFilePath); - extractedLibIn = new FileInputStream(extractedLibFile); - if (!contentsEquals(nativeIn, extractedLibIn)) { - throw new RuntimeException(String.format( - "Failed to write a native library file at %s", - extractedLibFile)); - } + return new File(targetFolder, extractedLibFileName); + } catch (IOException e) { + e.printStackTrace(System.err); + return null; } finally { - if (nativeIn != null) { - nativeIn.close(); - } - if (extractedLibIn != null) { - extractedLibIn.close(); - } + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } - } + } - return new File(targetFolder, extractedLibFileName); - } catch (IOException e) { - e.printStackTrace(System.err); - return null; - } finally{ - if(reader != null){ + /** + * Gets the version by reading pom.properties embedded in jar. This version + * data is used as a suffix of a dll file extracted from the jar. + * + * @return the version string + */ + public static String getVersion() { + URL versionFile = NativeCodeLoader.class + .getResource("/META-INF/maven/org.apache.commons.crypto/commons-crypto/pom.properties"); + if (versionFile == null) { + versionFile = NativeCodeLoader.class + .getResource("/org/apache/commons/crypto/VERSION"); + } + String version = "unknown"; try { - reader.close(); + if (versionFile != null) { + Properties versionData = new Properties(); + versionData.load(versionFile.openStream()); + version = versionData.getProperty("version", version); + if (version.equals("unknown")) { + version = versionData.getProperty("VERSION", version); + } + version = version.trim().replaceAll("[^0-9M\\.]", ""); + } } catch (IOException e) { - e.printStackTrace(); + System.err.println(e); } - } + return version; } - } - /** - * Gets the version by reading pom.properties embedded in jar. - * This version data is used as a suffix of a dll file extracted from the - * jar. - * - * @return the version string - */ - public static String getVersion() { - URL versionFile = NativeCodeLoader.class - .getResource("/META-INF/maven/org.apache.commons.crypto/commons-crypto/pom.properties"); - if (versionFile == null) { - versionFile = NativeCodeLoader.class - .getResource("/org/apache/commons/crypto/VERSION"); - } - String version = "unknown"; - try { - if (versionFile != null) { - Properties versionData = new Properties(); - versionData.load(versionFile.openStream()); - version = versionData.getProperty("version", version); - if (version.equals("unknown")) { - version = versionData.getProperty("VERSION", version); + private static boolean contentsEquals(InputStream in1, InputStream in2) + throws IOException { + if (!(in1 instanceof BufferedInputStream)) { + in1 = new BufferedInputStream(in1); + } + if (!(in2 instanceof BufferedInputStream)) { + in2 = new BufferedInputStream(in2); } - version = version.trim().replaceAll("[^0-9M\\.]", ""); - } - } catch (IOException e) { - System.err.println(e); - } - return version; - } - private static boolean contentsEquals(InputStream in1, InputStream in2) - throws IOException { - if (!(in1 instanceof BufferedInputStream)) { - in1 = new BufferedInputStream(in1); - } - if (!(in2 instanceof BufferedInputStream)) { - in2 = new BufferedInputStream(in2); + int ch = in1.read(); + while (ch != -1) { + int ch2 = in2.read(); + if (ch != ch2) { + return false; + } + ch = in1.read(); + } + int ch2 = in2.read(); + return ch2 == -1; } - int ch = in1.read(); - while (ch != -1) { - int ch2 = in2.read(); - if (ch != ch2) { - return false; - } - ch = in1.read(); + private static boolean hasResource(String path) { + return NativeCodeLoader.class.getResource(path) != null; } - int ch2 = in2.read(); - return ch2 == -1; - } - private static boolean hasResource(String path) { - return NativeCodeLoader.class.getResource(path) != null; - } - - /** - * Checks whether native code is loaded for this platform. - * - * @return <code>true</code> if native is loaded, - * else <code>false</code>. - */ - public static boolean isNativeCodeLoaded() { - return nativeCodeLoaded; - } + /** + * Checks whether native code is loaded for this platform. + * + * @return <code>true</code> if native is loaded, else <code>false</code>. + */ + public static boolean isNativeCodeLoaded() { + return nativeCodeLoaded; + } }
http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/95a8d486/src/main/java/org/apache/commons/crypto/utils/OSInfo.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/utils/OSInfo.java b/src/main/java/org/apache/commons/crypto/utils/OSInfo.java index 9d1cb88..21f2fe3 100644 --- a/src/main/java/org/apache/commons/crypto/utils/OSInfo.java +++ b/src/main/java/org/apache/commons/crypto/utils/OSInfo.java @@ -25,170 +25,184 @@ import java.util.Locale; * Provides OS name and architecture name. */ public class OSInfo { - private final static HashMap<String, String> archMapping = new HashMap<String, String>(); - - /** - * The constant string represents for X86 architecture, the value is: {@value #X86}.*/ - public static final String X86 = "x86"; - - /** - * The constant string represents for X86_64 architecture, the value is:{@value #X86_64}.*/ - public static final String X86_64 = "x86_64"; - - /** - * The constant string represents for IA64_32 architecture, the value is:{@value #IA64_32}.*/ - public static final String IA64_32 = "ia64_32"; - - /** - * The constant string represents for IA64 architecture, the value is:{@value #IA64}.*/ - public static final String IA64 = "ia64"; - - /** - * The constant string represents for PPC architecture, the value is:{@value #PPC}.*/ - public static final String PPC = "ppc"; - - /** - * The constant string represents for PPC64 architecture, the value is:{@value #PPC64}.*/ - public static final String PPC64 = "ppc64"; - - private OSInfo() {} - - static { - // x86 mappings - archMapping.put(X86, X86); - archMapping.put("i386", X86); - archMapping.put("i486", X86); - archMapping.put("i586", X86); - archMapping.put("i686", X86); - archMapping.put("pentium", X86); - - // x86_64 mappings - archMapping.put(X86_64, X86_64); - archMapping.put("amd64", X86_64); - archMapping.put("em64t", X86_64); - archMapping.put("universal", X86_64); // Needed for openjdk7 in Mac - - // Itenium 64-bit mappings - archMapping.put(IA64, IA64); - archMapping.put("ia64w", IA64); - - // Itenium 32-bit mappings, usually an HP-UX construct - archMapping.put(IA64_32, IA64_32); - archMapping.put("ia64n", IA64_32); - - // PowerPC mappings - archMapping.put(PPC, PPC); - archMapping.put("power", PPC); - archMapping.put("powerpc", PPC); - archMapping.put("power_pc", PPC); - archMapping.put("power_rs", PPC); - - // TODO: PowerPC 64bit mappings - archMapping.put(PPC64, PPC64); - archMapping.put("power64", PPC64); - archMapping.put("powerpc64", PPC64); - archMapping.put("power_pc64", PPC64); - archMapping.put("power_rs64", PPC64); - } - - public static void main(String[] args) { - if (args.length >= 1) { - if ("--os".equals(args[0])) { - System.out.print(getOSName()); - return; - } else if ("--arch".equals(args[0])) { - System.out.print(getArchName()); - return; - } + private final static HashMap<String, String> archMapping = new HashMap<String, String>(); + + /** + * The constant string represents for X86 architecture, the value is: + * {@value #X86}. + */ + public static final String X86 = "x86"; + + /** + * The constant string represents for X86_64 architecture, the value is: + * {@value #X86_64}. + */ + public static final String X86_64 = "x86_64"; + + /** + * The constant string represents for IA64_32 architecture, the value is: + * {@value #IA64_32}. + */ + public static final String IA64_32 = "ia64_32"; + + /** + * The constant string represents for IA64 architecture, the value is: + * {@value #IA64}. + */ + public static final String IA64 = "ia64"; + + /** + * The constant string represents for PPC architecture, the value is: + * {@value #PPC}. + */ + public static final String PPC = "ppc"; + + /** + * The constant string represents for PPC64 architecture, the value is: + * {@value #PPC64}. + */ + public static final String PPC64 = "ppc64"; + + private OSInfo() { } - System.out.print(getNativeLibFolderPathForCurrentOS()); - } - - /** - * Gets the native lib folder. - * - * @return the current OS's native lib folder. - */ - public static String getNativeLibFolderPathForCurrentOS() { - return getOSName() + "/" + getArchName(); - } - - /** - * Gets the OS name. - * - * @return the OS name. - */ - public static String getOSName() { - return translateOSNameToFolderName(System.getProperty("os.name")); - } - - /** - * Gets the architecture name. - * - * @return the architecture name. - */ - public static String getArchName() { - // if running Linux on ARM, need to determine ABI of JVM - String osArch = System.getProperty("os.arch"); - if (osArch.startsWith("arm") - && System.getProperty("os.name").contains("Linux")) { - String javaHome = System.getProperty("java.home"); - try { - // determine if first JVM found uses ARM hard-float ABI - String[] cmdarray = { - "/bin/sh", - "-c", - "find '" + javaHome - + "' -name 'libjvm.so' | head -1 | xargs readelf -A | " - + "grep 'Tag_ABI_VFP_args: VFP registers'" }; - int exitCode = Runtime.getRuntime().exec(cmdarray).waitFor(); - if (exitCode == 0) { - return "armhf"; + static { + // x86 mappings + archMapping.put(X86, X86); + archMapping.put("i386", X86); + archMapping.put("i486", X86); + archMapping.put("i586", X86); + archMapping.put("i686", X86); + archMapping.put("pentium", X86); + + // x86_64 mappings + archMapping.put(X86_64, X86_64); + archMapping.put("amd64", X86_64); + archMapping.put("em64t", X86_64); + archMapping.put("universal", X86_64); // Needed for openjdk7 in Mac + + // Itenium 64-bit mappings + archMapping.put(IA64, IA64); + archMapping.put("ia64w", IA64); + + // Itenium 32-bit mappings, usually an HP-UX construct + archMapping.put(IA64_32, IA64_32); + archMapping.put("ia64n", IA64_32); + + // PowerPC mappings + archMapping.put(PPC, PPC); + archMapping.put("power", PPC); + archMapping.put("powerpc", PPC); + archMapping.put("power_pc", PPC); + archMapping.put("power_rs", PPC); + + // TODO: PowerPC 64bit mappings + archMapping.put(PPC64, PPC64); + archMapping.put("power64", PPC64); + archMapping.put("powerpc64", PPC64); + archMapping.put("power_pc64", PPC64); + archMapping.put("power_rs64", PPC64); + } + + public static void main(String[] args) { + if (args.length >= 1) { + if ("--os".equals(args[0])) { + System.out.print(getOSName()); + return; + } else if ("--arch".equals(args[0])) { + System.out.print(getArchName()); + return; + } + } + + System.out.print(getNativeLibFolderPathForCurrentOS()); + } + + /** + * Gets the native lib folder. + * + * @return the current OS's native lib folder. + */ + public static String getNativeLibFolderPathForCurrentOS() { + return getOSName() + "/" + getArchName(); + } + + /** + * Gets the OS name. + * + * @return the OS name. + */ + public static String getOSName() { + return translateOSNameToFolderName(System.getProperty("os.name")); + } + + /** + * Gets the architecture name. + * + * @return the architecture name. + */ + public static String getArchName() { + // if running Linux on ARM, need to determine ABI of JVM + String osArch = System.getProperty("os.arch"); + if (osArch.startsWith("arm") + && System.getProperty("os.name").contains("Linux")) { + String javaHome = System.getProperty("java.home"); + try { + // determine if first JVM found uses ARM hard-float ABI + String[] cmdarray = { + "/bin/sh", + "-c", + "find '" + + javaHome + + "' -name 'libjvm.so' | head -1 | xargs readelf -A | " + + "grep 'Tag_ABI_VFP_args: VFP registers'" }; + int exitCode = Runtime.getRuntime().exec(cmdarray).waitFor(); + if (exitCode == 0) { + return "armhf"; + } + } catch (IOException e) { + // ignored: fall back to "arm" arch (soft-float ABI) + } catch (InterruptedException e) { + // ignored: fall back to "arm" arch (soft-float ABI) + } + } else { + String lc = osArch.toLowerCase(Locale.US); + if (archMapping.containsKey(lc)) { + return archMapping.get(lc); + } } - } catch (IOException e) { - // ignored: fall back to "arm" arch (soft-float ABI) - } catch (InterruptedException e) { - // ignored: fall back to "arm" arch (soft-float ABI) - } - } else { - String lc = osArch.toLowerCase(Locale.US); - if (archMapping.containsKey(lc)) { - return archMapping.get(lc); - } + return translateArchNameToFolderName(osArch); } - return translateArchNameToFolderName(osArch); - } - - /** - * Translates the OS name to folder name. - * - * @param osName the OS name. - * @return the folder name. - */ - static String translateOSNameToFolderName(String osName) { - if (osName.contains("Windows")) { - return "Windows"; - } else if (osName.contains("Mac")) { - return "Mac"; - } else if (osName.contains("Linux")) { - return "Linux"; - } else if (osName.contains("AIX")) { - return "AIX"; + + /** + * Translates the OS name to folder name. + * + * @param osName the OS name. + * @return the folder name. + */ + static String translateOSNameToFolderName(String osName) { + if (osName.contains("Windows")) { + return "Windows"; + } else if (osName.contains("Mac")) { + return "Mac"; + } else if (osName.contains("Linux")) { + return "Linux"; + } else if (osName.contains("AIX")) { + return "AIX"; + } + + else { + return osName.replaceAll("\\W", ""); + } } - else { - return osName.replaceAll("\\W", ""); + /** + * Translates the architecture name to folder name. + * + * @param archName the architecture name. + * @return the folder name. + */ + static String translateArchNameToFolderName(String archName) { + return archName.replaceAll("\\W", ""); } - } - - /** - * Translates the architecture name to folder name. - * - * @param archName the architecture name. - * @return the folder name. - */ - static String translateArchNameToFolderName(String archName) { - return archName.replaceAll("\\W", ""); - } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/95a8d486/src/main/java/org/apache/commons/crypto/utils/ReflectionUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/utils/ReflectionUtils.java b/src/main/java/org/apache/commons/crypto/utils/ReflectionUtils.java index ce077d7..aab3196 100644 --- a/src/main/java/org/apache/commons/crypto/utils/ReflectionUtils.java +++ b/src/main/java/org/apache/commons/crypto/utils/ReflectionUtils.java @@ -30,180 +30,182 @@ import org.apache.commons.crypto.cipher.CryptoCipher; */ public class ReflectionUtils { - private static final Map<ClassLoader, Map<String, WeakReference<Class<?>>>> - CACHE_CLASSES = new WeakHashMap<ClassLoader, Map<String, WeakReference<Class<?>>>>(); - - private final static ClassLoader classLoader; - - static { - ClassLoader threadClassLoader = Thread.currentThread().getContextClassLoader(); - classLoader = (threadClassLoader != null) ? threadClassLoader : CryptoCipher.class.getClassLoader(); - } - - /** - * Sentinel value to store negative cache results in {@link #CACHE_CLASSES}. - */ - private static final Class<?> NEGATIVE_CACHE_SENTINEL = - NegativeCacheSentinel.class; - - private ReflectionUtils() {} - - /** - * A unique class which is used as a sentinel value in the caching - * for getClassByName. {@link CryptoCipher#getClassByNameOrNull(String)}. - */ - private static abstract class NegativeCacheSentinel {} - - /** - * Uses the constructor represented by this {@code Constructor} object to - * create and initialize a new instance of the constructor's - * declaring class, with the specified initialization parameters. - * - * @param <T> type for the new instance - * @param klass the Class object. - * @param args array of objects to be passed as arguments to - * the constructor call. - * @return a new object created by calling the constructor - * this object represents. - */ - @SuppressWarnings("rawtypes") - public static <T> T newInstance(Class<T> klass, Object ... args) { - try { - Constructor<T> ctor = null; - - if (args.length == 0) { - ctor = klass.getDeclaredConstructor(new Class[] {}); - } else { - Class[] argClses = new Class[args.length]; - for (int i = 0; i < args.length; i++) { - argClses[i] = args[i].getClass(); - } - ctor = klass.getDeclaredConstructor(argClses); - } - ctor.setAccessible(true); - return ctor.newInstance(args); - } catch (Exception e) { - throw new RuntimeException(e); + private static final Map<ClassLoader, Map<String, WeakReference<Class<?>>>> CACHE_CLASSES = new WeakHashMap<ClassLoader, Map<String, WeakReference<Class<?>>>>(); + + private final static ClassLoader classLoader; + + static { + ClassLoader threadClassLoader = Thread.currentThread() + .getContextClassLoader(); + classLoader = (threadClassLoader != null) ? threadClassLoader + : CryptoCipher.class.getClassLoader(); } - } - - /** - * Gets the value of the <code>name</code> property as a <code>Class</code> - * implementing the interface specified by <code>xface</code>. - * If no such property is specified, then <code>defaultValue</code> is - * returned.An exception is thrown if the returned class does not - * implement the named interface. - * - * @param <U> type for the class. - * @param name the class name of default implementation. - * @param defaultValue default value. - * @param xface the interface implemented by the named class. - * @return property value as a <code>Class</code>, - * or <code>defaultValue</code>. - */ - public static <U> Class<? extends U> getClass(String name, - Class<? extends U> defaultValue, - Class<U> xface) { - try { - Class<?> theClass = null; - if (name != null && !name.isEmpty()) { - theClass = getClassByName(name); - } - if (theClass == null) { - theClass = defaultValue; - } - if (theClass != null && !xface.isAssignableFrom(theClass)) { - throw new RuntimeException(theClass+" not "+xface.getName()); - } else if (theClass != null) { - return theClass.asSubclass(xface); - } else { - return null; - } - } catch (Exception e) { - throw new RuntimeException(e); + + /** + * Sentinel value to store negative cache results in {@link #CACHE_CLASSES}. + */ + private static final Class<?> NEGATIVE_CACHE_SENTINEL = NegativeCacheSentinel.class; + + private ReflectionUtils() { } - } - - /** - * Gets the value of the <code>name</code> property as a <code>Class</code>. - * If no such property is specified, then <code>defaultValue</code> is - * returned. - * - * @param name the class name. - * @param defaultValue default value. - * @return property value as a <code>Class</code>, - * or <code>defaultValue</code>. - */ - public static Class<?> getClass(String name, Class<?> defaultValue) { - String valueString = System.getProperty(name); - if (valueString == null) { - return defaultValue; + + /** + * A unique class which is used as a sentinel value in the caching for + * getClassByName. {@link CryptoCipher#getClassByNameOrNull(String)}. + */ + private static abstract class NegativeCacheSentinel { } - try { - return getClassByName(valueString); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + + /** + * Uses the constructor represented by this {@code Constructor} object to + * create and initialize a new instance of the constructor's declaring + * class, with the specified initialization parameters. + * + * @param <T> type for the new instance + * @param klass the Class object. + * @param args array of objects to be passed as arguments to the constructor + * call. + * @return a new object created by calling the constructor this object + * represents. + */ + @SuppressWarnings("rawtypes") + public static <T> T newInstance(Class<T> klass, Object... args) { + try { + Constructor<T> ctor = null; + + if (args.length == 0) { + ctor = klass.getDeclaredConstructor(new Class[] {}); + } else { + Class[] argClses = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + argClses[i] = args[i].getClass(); + } + ctor = klass.getDeclaredConstructor(argClses); + } + ctor.setAccessible(true); + return ctor.newInstance(args); + } catch (Exception e) { + throw new RuntimeException(e); + } } - } - - /** - * Loads a class by name. - * - * @param name the class name. - * @return the class object. - * @throws ClassNotFoundException if the class is not found. - */ - public static Class<?> getClassByName(String name) - throws ClassNotFoundException { - Class<?> ret = getClassByNameOrNull(name); - if (ret == null) { - throw new ClassNotFoundException("Class " + name + " not found"); + + /** + * Gets the value of the <code>name</code> property as a <code>Class</code> + * implementing the interface specified by <code>xface</code>. If no such + * property is specified, then <code>defaultValue</code> is returned.An + * exception is thrown if the returned class does not implement the named + * interface. + * + * @param <U> type for the class. + * @param name the class name of default implementation. + * @param defaultValue default value. + * @param xface the interface implemented by the named class. + * @return property value as a <code>Class</code>, or + * <code>defaultValue</code>. + */ + public static <U> Class<? extends U> getClass(String name, + Class<? extends U> defaultValue, Class<U> xface) { + try { + Class<?> theClass = null; + if (name != null && !name.isEmpty()) { + theClass = getClassByName(name); + } + if (theClass == null) { + theClass = defaultValue; + } + if (theClass != null && !xface.isAssignableFrom(theClass)) { + throw new RuntimeException(theClass + " not " + xface.getName()); + } else if (theClass != null) { + return theClass.asSubclass(xface); + } else { + return null; + } + } catch (Exception e) { + throw new RuntimeException(e); + } } - return ret; - } - - /** - * Loads a class by name, returning null rather than throwing an exception - * if it couldn't be loaded. This is to avoid the overhead of creating - * an exception. - * - * @param name the class name. - * @return the class object, or null if it could not be found. - */ - private static Class<?> getClassByNameOrNull(String name) { - Map<String, WeakReference<Class<?>>> map; - - synchronized (CACHE_CLASSES) { - map = CACHE_CLASSES.get(classLoader); - if (map == null) { - map = Collections.synchronizedMap( - new WeakHashMap<String, WeakReference<Class<?>>>()); - CACHE_CLASSES.put(classLoader, map); - } + + /** + * Gets the value of the <code>name</code> property as a <code>Class</code>. + * If no such property is specified, then <code>defaultValue</code> is + * returned. + * + * @param name the class name. + * @param defaultValue default value. + * @return property value as a <code>Class</code>, or + * <code>defaultValue</code>. + */ + public static Class<?> getClass(String name, Class<?> defaultValue) { + String valueString = System.getProperty(name); + if (valueString == null) { + return defaultValue; + } + try { + return getClassByName(valueString); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } } - Class<?> clazz = null; - WeakReference<Class<?>> ref = map.get(name); - if (ref != null) { - clazz = ref.get(); + /** + * Loads a class by name. + * + * @param name the class name. + * @return the class object. + * @throws ClassNotFoundException if the class is not found. + */ + public static Class<?> getClassByName(String name) + throws ClassNotFoundException { + Class<?> ret = getClassByNameOrNull(name); + if (ret == null) { + throw new ClassNotFoundException("Class " + name + " not found"); + } + return ret; } - if (clazz == null) { - try { - clazz = Class.forName(name, true, classLoader); - } catch (ClassNotFoundException e) { - // Leave a marker that the class isn't found - map.put(name, new WeakReference<Class<?>>(NEGATIVE_CACHE_SENTINEL)); - return null; - } - // two putters can race here, but they'll put the same class - map.put(name, new WeakReference<Class<?>>(clazz)); - return clazz; - } else if (clazz == NEGATIVE_CACHE_SENTINEL) { - return null; // not found - } else { - // cache hit - return clazz; + /** + * Loads a class by name, returning null rather than throwing an exception + * if it couldn't be loaded. This is to avoid the overhead of creating an + * exception. + * + * @param name the class name. + * @return the class object, or null if it could not be found. + */ + private static Class<?> getClassByNameOrNull(String name) { + Map<String, WeakReference<Class<?>>> map; + + synchronized (CACHE_CLASSES) { + map = CACHE_CLASSES.get(classLoader); + if (map == null) { + map = Collections + .synchronizedMap(new WeakHashMap<String, WeakReference<Class<?>>>()); + CACHE_CLASSES.put(classLoader, map); + } + } + + Class<?> clazz = null; + WeakReference<Class<?>> ref = map.get(name); + if (ref != null) { + clazz = ref.get(); + } + + if (clazz == null) { + try { + clazz = Class.forName(name, true, classLoader); + } catch (ClassNotFoundException e) { + // Leave a marker that the class isn't found + map.put(name, new WeakReference<Class<?>>( + NEGATIVE_CACHE_SENTINEL)); + return null; + } + // two putters can race here, but they'll put the same class + map.put(name, new WeakReference<Class<?>>(clazz)); + return clazz; + } else if (clazz == NEGATIVE_CACHE_SENTINEL) { + return null; // not found + } else { + // cache hit + return clazz; + } } - } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/95a8d486/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 16ce270..17c98c2 100644 --- a/src/main/java/org/apache/commons/crypto/utils/Utils.java +++ b/src/main/java/org/apache/commons/crypto/utils/Utils.java @@ -47,330 +47,338 @@ import static org.apache.commons.crypto.conf.ConfigurationKeys.COMMONS_CRYPTO_LI * General utility methods. */ public class Utils { - private static final int MIN_BUFFER_SIZE = 512; + private static final int MIN_BUFFER_SIZE = 512; - protected static final CipherTransformation AES_CTR_NOPADDING = CipherTransformation.AES_CTR_NOPADDING; + protected static final CipherTransformation AES_CTR_NOPADDING = CipherTransformation.AES_CTR_NOPADDING; - /** - * For AES, the algorithm block is fixed size of 128 bits. - * @see <a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"> - * http://en.wikipedia.org/wiki/Advanced_Encryption_Standard</a> - */ - private static final int AES_BLOCK_SIZE = AES_CTR_NOPADDING.getAlgorithmBlockSize(); + /** + * For AES, the algorithm block is fixed size of 128 bits. + * + * @see <a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"> + * http://en.wikipedia.org/wiki/Advanced_Encryption_Standard</a> + */ + private static final int AES_BLOCK_SIZE = AES_CTR_NOPADDING + .getAlgorithmBlockSize(); - private Utils() {} + private Utils() { + } - static { - loadSystemProperties(); - } + static { + loadSystemProperties(); + } - /** - * loads system properties when configuration file of the name - * {@link #COMMONS_CRYPTO_SYSTEM_PROPERTIES_FILE} is found. - */ - private static void loadSystemProperties() { - try { - InputStream is = Thread.currentThread().getContextClassLoader() - .getResourceAsStream(COMMONS_CRYPTO_SYSTEM_PROPERTIES_FILE); + /** + * loads system properties when configuration file of the name + * {@link #COMMONS_CRYPTO_SYSTEM_PROPERTIES_FILE} is found. + */ + private static void loadSystemProperties() { + try { + InputStream is = Thread.currentThread().getContextClassLoader() + .getResourceAsStream(COMMONS_CRYPTO_SYSTEM_PROPERTIES_FILE); - if (is == null) { - return; // no configuration file is found - } - // Load property file - Properties props = new Properties(); - props.load(is); - is.close(); - Enumeration<?> names = props.propertyNames(); - while (names.hasMoreElements()) { - String name = (String) names.nextElement(); - if (name.startsWith(ConfigurationKeys.CONF_PREFIX)) { - if (System.getProperty(name) == null) { - System.setProperty(name, props.getProperty(name)); - } + if (is == null) { + return; // no configuration file is found + } + // Load property file + Properties props = new Properties(); + props.load(is); + is.close(); + Enumeration<?> names = props.propertyNames(); + while (names.hasMoreElements()) { + String name = (String) names.nextElement(); + if (name.startsWith(ConfigurationKeys.CONF_PREFIX)) { + if (System.getProperty(name) == null) { + System.setProperty(name, props.getProperty(name)); + } + } + } + } catch (Throwable ex) { + System.err.println("Could not load '" + + COMMONS_CRYPTO_SYSTEM_PROPERTIES_FILE + + "' from classpath: " + ex.toString()); } - } - } catch (Throwable ex) { - System.err.println("Could not load '" - + COMMONS_CRYPTO_SYSTEM_PROPERTIES_FILE + "' from classpath: " - + ex.toString()); } - } - /** - * Forcibly free the direct buffer. - * - * @param buffer the bytebuffer to be freed. - */ - public static void freeDirectBuffer(ByteBuffer buffer) { - if (buffer instanceof sun.nio.ch.DirectBuffer) { - final sun.misc.Cleaner bufferCleaner = - ((sun.nio.ch.DirectBuffer) buffer).cleaner(); - bufferCleaner.clean(); + /** + * Forcibly free the direct buffer. + * + * @param buffer the bytebuffer to be freed. + */ + public static void freeDirectBuffer(ByteBuffer buffer) { + if (buffer instanceof sun.nio.ch.DirectBuffer) { + final sun.misc.Cleaner bufferCleaner = ((sun.nio.ch.DirectBuffer) buffer) + .cleaner(); + bufferCleaner.clean(); + } } - } - /** - * Reads crypto buffer size. - * - * @param props The <code>Properties</code> class represents a set of - * properties. - * @return the buffer size. - * */ - public static int getBufferSize(Properties props) { - String bufferSizeStr = props.getProperty( - COMMONS_CRYPTO_STREAM_BUFFER_SIZE_KEY); - if (bufferSizeStr == null || bufferSizeStr.isEmpty()) { - bufferSizeStr = System - .getProperty(COMMONS_CRYPTO_STREAM_BUFFER_SIZE_KEY); - } - if (bufferSizeStr == null || bufferSizeStr.isEmpty()) { - return COMMONS_CRYPTO_STREAM_BUFFER_SIZE_DEFAULT; - } else { - return Integer.parseInt(bufferSizeStr); + /** + * Reads crypto buffer size. + * + * @param props The <code>Properties</code> class represents a set of + * properties. + * @return the buffer size. + * */ + public static int getBufferSize(Properties props) { + String bufferSizeStr = props + .getProperty(COMMONS_CRYPTO_STREAM_BUFFER_SIZE_KEY); + if (bufferSizeStr == null || bufferSizeStr.isEmpty()) { + bufferSizeStr = System + .getProperty(COMMONS_CRYPTO_STREAM_BUFFER_SIZE_KEY); + } + if (bufferSizeStr == null || bufferSizeStr.isEmpty()) { + return COMMONS_CRYPTO_STREAM_BUFFER_SIZE_DEFAULT; + } else { + return Integer.parseInt(bufferSizeStr); + } } - } - /** - * Gets the cipher class. - * - * @param props The <code>Properties</code> class represents a set of - * properties. - * @return the cipher class based on the props. - */ - public static String getCipherClassString(Properties props) { - final String configName = COMMONS_CRYPTO_CIPHER_CLASSES_KEY; - String cipherClassString = props.getProperty(configName) != null ? props - .getProperty(configName, COMMONS_CRYPTO_CIPHER_CLASSES_DEFAULT) : System - .getProperty(configName, COMMONS_CRYPTO_CIPHER_CLASSES_DEFAULT); - if (cipherClassString.isEmpty()) { - cipherClassString = COMMONS_CRYPTO_CIPHER_CLASSES_DEFAULT; + /** + * Gets the cipher class. + * + * @param props The <code>Properties</code> class represents a set of + * properties. + * @return the cipher class based on the props. + */ + public static String getCipherClassString(Properties props) { + final String configName = COMMONS_CRYPTO_CIPHER_CLASSES_KEY; + String cipherClassString = props.getProperty(configName) != null ? props + .getProperty(configName, COMMONS_CRYPTO_CIPHER_CLASSES_DEFAULT) + : System.getProperty(configName, + COMMONS_CRYPTO_CIPHER_CLASSES_DEFAULT); + if (cipherClassString.isEmpty()) { + cipherClassString = COMMONS_CRYPTO_CIPHER_CLASSES_DEFAULT; + } + return cipherClassString; } - return cipherClassString; - } - /** - * Gets the Jce provider. - * - * @param props The <code>Properties</code> class represents a set of - * properties. - * @return the jce provider based on the props. - */ - public static String getJCEProvider(Properties props) { - return props.getProperty(COMMONS_CRYPTO_CIPHER_JCE_PROVIDER_KEY) != null ? - props.getProperty(COMMONS_CRYPTO_CIPHER_JCE_PROVIDER_KEY) : - System.getProperty(COMMONS_CRYPTO_CIPHER_JCE_PROVIDER_KEY); - } + /** + * Gets the Jce provider. + * + * @param props The <code>Properties</code> class represents a set of + * properties. + * @return the jce provider based on the props. + */ + public static String getJCEProvider(Properties props) { + return props.getProperty(COMMONS_CRYPTO_CIPHER_JCE_PROVIDER_KEY) != null ? props + .getProperty(COMMONS_CRYPTO_CIPHER_JCE_PROVIDER_KEY) : System + .getProperty(COMMONS_CRYPTO_CIPHER_JCE_PROVIDER_KEY); + } - /** - * Gets the random device path. - * - * @param props The <code>Properties</code> class represents a set of - * properties. - * @return the random device path based on the props. - */ - public static String getRandomDevPath(Properties props) { - String devPath = props.getProperty( - COMMONS_CRYPTO_SECURE_RANDOM_DEVICE_FILE_PATH_KEY); - if (devPath == null) { - devPath = System.getProperty( - COMMONS_CRYPTO_SECURE_RANDOM_DEVICE_FILE_PATH_KEY, - COMMONS_CRYPTO_SECURE_RANDOM_DEVICE_FILE_PATH_DEFAULT); + /** + * Gets the random device path. + * + * @param props The <code>Properties</code> class represents a set of + * properties. + * @return the random device path based on the props. + */ + public static String getRandomDevPath(Properties props) { + String devPath = props + .getProperty(COMMONS_CRYPTO_SECURE_RANDOM_DEVICE_FILE_PATH_KEY); + if (devPath == null) { + devPath = System.getProperty( + COMMONS_CRYPTO_SECURE_RANDOM_DEVICE_FILE_PATH_KEY, + COMMONS_CRYPTO_SECURE_RANDOM_DEVICE_FILE_PATH_DEFAULT); + } + return devPath; } - return devPath; - } - /** - * Gets path of native library. - * - * @return the path of native library. - */ - public static String getLibPath() { - return System.getProperty(COMMONS_CRYPTO_LIB_PATH_KEY); - } + /** + * Gets path of native library. + * + * @return the path of native library. + */ + public static String getLibPath() { + return System.getProperty(COMMONS_CRYPTO_LIB_PATH_KEY); + } - /** - * Gets the file name of native library. - * - * @return the file name of native library. - */ - public static String getLibName() { - return System.getProperty(COMMONS_CRYPTO_LIB_NAME_KEY); - } + /** + * Gets the file name of native library. + * + * @return the file name of native library. + */ + public static String getLibName() { + return System.getProperty(COMMONS_CRYPTO_LIB_NAME_KEY); + } - /** - * Gets the temp directory for extracting crypto library. - * - * @return the temp directory. - */ - public static String getTmpDir() { - return System.getProperty(COMMONS_CRYPTO_LIB_TEMPDIR_KEY, - System.getProperty("java.io.tmpdir")); - } + /** + * Gets the temp directory for extracting crypto library. + * + * @return the temp directory. + */ + public static String getTmpDir() { + return System.getProperty(COMMONS_CRYPTO_LIB_TEMPDIR_KEY, + System.getProperty("java.io.tmpdir")); + } - /** - * Checks whether the cipher is supported streaming. - * - * @param cipher the {@link CryptoCipher} instance. - * @throws IOException if an I/O error occurs. - */ - public static void checkStreamCipher(CryptoCipher cipher) throws IOException { - if (cipher.getTransformation() != CipherTransformation.AES_CTR_NOPADDING) { - throw new IOException("AES/CTR/NoPadding is required"); + /** + * Checks whether the cipher is supported streaming. + * + * @param cipher the {@link CryptoCipher} instance. + * @throws IOException if an I/O error occurs. + */ + public static void checkStreamCipher(CryptoCipher cipher) + throws IOException { + if (cipher.getTransformation() != CipherTransformation.AES_CTR_NOPADDING) { + throw new IOException("AES/CTR/NoPadding is required"); + } } - } - /** - * Checks and floors buffer size. - * - * @param cipher the {@link CryptoCipher} instance. - * @param bufferSize the buffer size. - * @return the remaining buffer size. - */ - public static int checkBufferSize(CryptoCipher cipher, int bufferSize) { - checkArgument(bufferSize >= MIN_BUFFER_SIZE, - "Minimum value of buffer size is " + MIN_BUFFER_SIZE + "."); - return bufferSize - bufferSize % cipher.getTransformation() - .getAlgorithmBlockSize(); - } + /** + * Checks and floors buffer size. + * + * @param cipher the {@link CryptoCipher} instance. + * @param bufferSize the buffer size. + * @return the remaining buffer size. + */ + public static int checkBufferSize(CryptoCipher cipher, int bufferSize) { + checkArgument(bufferSize >= MIN_BUFFER_SIZE, + "Minimum value of buffer size is " + MIN_BUFFER_SIZE + "."); + return bufferSize - bufferSize + % cipher.getTransformation().getAlgorithmBlockSize(); + } - /** - * <p> - * This method is only for Counter (CTR) mode. Generally the CryptoCipher calculates the - * IV and maintain encryption context internally.For example a Cipher will maintain its - * encryption context internally when we do encryption/decryption using the - * CryptoCipher#update interface. - * </p> - * <p> - * Encryption/Decryption is not always on the entire file. For example, - * in Hadoop, a node may only decrypt a portion of a file (i.e. a split). - * In these situations, the counter is derived from the file position. - * </p> - * The IV can be calculated by combining the initial IV and the counter with - * a lossless operation (concatenation, addition, or XOR). - * - * @see <a href="http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29"> - * http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29</a> - * - * @param initIV initial IV - * @param counter counter for input stream position - * @param IV the IV for input stream position - */ - public static void calculateIV(byte[] initIV, long counter, byte[] IV) { - checkArgument(initIV.length == AES_BLOCK_SIZE); - checkArgument(IV.length == AES_BLOCK_SIZE); + /** + * <p> + * This method is only for Counter (CTR) mode. Generally the CryptoCipher + * calculates the IV and maintain encryption context internally.For example + * a Cipher will maintain its encryption context internally when we do + * encryption/decryption using the CryptoCipher#update interface. + * </p> + * <p> + * Encryption/Decryption is not always on the entire file. For example, in + * Hadoop, a node may only decrypt a portion of a file (i.e. a split). In + * these situations, the counter is derived from the file position. + * </p> + * The IV can be calculated by combining the initial IV and the counter with + * a lossless operation (concatenation, addition, or XOR). + * + * @see <a + * href="http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29"> + * http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29</a> + * + * @param initIV initial IV + * @param counter counter for input stream position + * @param IV the IV for input stream position + */ + public static void calculateIV(byte[] initIV, long counter, byte[] IV) { + checkArgument(initIV.length == AES_BLOCK_SIZE); + checkArgument(IV.length == AES_BLOCK_SIZE); - int i = IV.length; // IV length - int j = 0; // counter bytes index - int sum = 0; - while (i-- > 0) { - // (sum >>> Byte.SIZE) is the carry for addition - sum = (initIV[i] & 0xff) + (sum >>> Byte.SIZE); - if (j++ < 8) { // Big-endian, and long is 8 bytes length - sum += (byte) counter & 0xff; - counter >>>= 8; - } - IV[i] = (byte) sum; + int i = IV.length; // IV length + int j = 0; // counter bytes index + int sum = 0; + while (i-- > 0) { + // (sum >>> Byte.SIZE) is the carry for addition + sum = (initIV[i] & 0xff) + (sum >>> Byte.SIZE); + if (j++ < 8) { // Big-endian, and long is 8 bytes length + sum += (byte) counter & 0xff; + counter >>>= 8; + } + IV[i] = (byte) sum; + } } - } - /** - * Helper method to create a CryptoCipher instance and throws only IOException. - * - * @param props The <code>Properties</code> class represents a set of - * properties. - * @param transformation the CipherTransformation instance. - * @return the CryptoCipher instance. - * @throws IOException if an I/O error occurs. - */ - public static CryptoCipher getCipherInstance(CipherTransformation transformation, - Properties props) throws IOException { - try { - return CryptoCipherFactory.getInstance(transformation, props); - } catch (GeneralSecurityException e) { - throw new IOException(e); + /** + * Helper method to create a CryptoCipher instance and throws only + * IOException. + * + * @param props The <code>Properties</code> class represents a set of + * properties. + * @param transformation the CipherTransformation instance. + * @return the CryptoCipher instance. + * @throws IOException if an I/O error occurs. + */ + public static CryptoCipher getCipherInstance( + CipherTransformation transformation, Properties props) + throws IOException { + try { + return CryptoCipherFactory.getInstance(transformation, props); + } catch (GeneralSecurityException e) { + throw new IOException(e); + } } - } - /** - * Ensures the truth of an expression involving one or more parameters to - * the calling method. - * - * @param expression a boolean expression. - * @throws IllegalArgumentException if expression is false. - */ - public static void checkArgument(boolean expression) { - if(!expression) { - throw new IllegalArgumentException(); + /** + * Ensures the truth of an expression involving one or more parameters to + * the calling method. + * + * @param expression a boolean expression. + * @throws IllegalArgumentException if expression is false. + */ + public static void checkArgument(boolean expression) { + if (!expression) { + throw new IllegalArgumentException(); + } } - } - /** - * Checks the truth of an expression. - * - * @param expression a boolean expression. - * @param errorMessage the exception message to use if the check fails; - * will be converted to a string using <code>String - * .valueOf(Object)</code>. - * @throws IllegalArgumentException if expression is false. - */ - public static void checkArgument(boolean expression, Object errorMessage) { - if (!expression) { - throw new IllegalArgumentException(String.valueOf(errorMessage)); + /** + * Checks the truth of an expression. + * + * @param expression a boolean expression. + * @param errorMessage the exception message to use if the check fails; will + * be converted to a string using <code>String + * .valueOf(Object)</code>. + * @throws IllegalArgumentException if expression is false. + */ + public static void checkArgument(boolean expression, Object errorMessage) { + if (!expression) { + throw new IllegalArgumentException(String.valueOf(errorMessage)); + } } - } - /** - * Ensures that an object reference passed as a parameter to the calling - * method is not null. - * - * @param <T> the type of the object reference to be checked. - * @param reference an object reference. - * @return the non-null reference that was validated. - * @throws NullPointerException if reference is null. - */ - public static <T> T checkNotNull(T reference) { - if(reference == null) { - throw new NullPointerException(); - } else { - return reference; + /** + * Ensures that an object reference passed as a parameter to the calling + * method is not null. + * + * @param <T> the type of the object reference to be checked. + * @param reference an object reference. + * @return the non-null reference that was validated. + * @throws NullPointerException if reference is null. + */ + public static <T> T checkNotNull(T reference) { + if (reference == null) { + throw new NullPointerException(); + } else { + return reference; + } } - } - /** - * Ensures the truth of an expression involving the state of the calling - * instance, but not involving any parameters to the calling method. - * - * @param expression a boolean expression. - * @throws IllegalStateException if expression is false. - */ - public static void checkState(boolean expression) { - if(!expression) { - throw new IllegalStateException(); + /** + * Ensures the truth of an expression involving the state of the calling + * instance, but not involving any parameters to the calling method. + * + * @param expression a boolean expression. + * @throws IllegalStateException if expression is false. + */ + public static void checkState(boolean expression) { + if (!expression) { + throw new IllegalStateException(); + } } - } - /** - * Splits class names sequence into substrings, Trim each substring into an - * entry,and returns an list of the entries. - * - * @param clazzNames a string consist of a list of the entries joined by a - * delimiter. - * @param separator a delimiter for the input string. - * @return a list of class entries. - */ - public static List<String> splitClassNames(String clazzNames, - String separator) { - List<String> res = new ArrayList<String>(); - if (clazzNames == null || clazzNames.isEmpty()) { - return res; - } + /** + * Splits class names sequence into substrings, Trim each substring into an + * entry,and returns an list of the entries. + * + * @param clazzNames a string consist of a list of the entries joined by a + * delimiter. + * @param separator a delimiter for the input string. + * @return a list of class entries. + */ + public static List<String> splitClassNames(String clazzNames, + String separator) { + List<String> res = new ArrayList<String>(); + if (clazzNames == null || clazzNames.isEmpty()) { + return res; + } - for (String clazzName : clazzNames.split(separator)) { - clazzName = clazzName.trim(); - if (!clazzName.isEmpty()) { - res.add(clazzName); - } + for (String clazzName : clazzNames.split(separator)) { + clazzName = clazzName.trim(); + if (!clazzName.isEmpty()) { + res.add(clazzName); + } + } + return res; } - return res; - } } http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/95a8d486/src/main/java/org/apache/commons/crypto/utils/package-info.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/utils/package-info.java b/src/main/java/org/apache/commons/crypto/utils/package-info.java index 7a3c334..20785f2 100644 --- a/src/main/java/org/apache/commons/crypto/utils/package-info.java +++ b/src/main/java/org/apache/commons/crypto/utils/package-info.java @@ -19,3 +19,4 @@ * Utils classes */ package org.apache.commons.crypto.utils; + http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/95a8d486/src/test/java/org/apache/commons/crypto/cipher/AbstractCipherTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/crypto/cipher/AbstractCipherTest.java b/src/test/java/org/apache/commons/crypto/cipher/AbstractCipherTest.java index f60f29c..00d1505 100644 --- a/src/test/java/org/apache/commons/crypto/cipher/AbstractCipherTest.java +++ b/src/test/java/org/apache/commons/crypto/cipher/AbstractCipherTest.java @@ -36,209 +36,229 @@ import org.junit.Test; public abstract class AbstractCipherTest { - // data - public static final int BYTEBUFFER_SIZE = 1000; - public String[] cipherTests = null; - Properties props = null; - String cipherClass = null; - CipherTransformation[] transformations = null; - - // cipher - static final byte[] KEY = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, - 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16}; - static final byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, - 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; - CryptoCipher enc, dec; - - @Before - public void setup() { - init(); - Utils.checkNotNull(cipherClass); - Utils.checkNotNull(transformations); - props = new Properties(); - props.setProperty(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, - cipherClass); - } - - protected abstract void init() ; - - @Test - public void cryptoTest() throws GeneralSecurityException, IOException { - for (CipherTransformation tran : transformations) { - /** uses the small data set in {@link TestData} */ - cipherTests = TestData.getTestData(tran); - for (int i = 0; i != cipherTests.length; i += 5) { - byte[] key = DatatypeConverter.parseHexBinary(cipherTests[i + 1]); - byte[] iv = DatatypeConverter.parseHexBinary(cipherTests[i + 2]); - - byte[] inputBytes = DatatypeConverter.parseHexBinary(cipherTests[i + 3]); - byte[] outputBytes = DatatypeConverter.parseHexBinary(cipherTests[i + 4]); - - ByteBuffer inputBuffer = ByteBuffer.allocateDirect(inputBytes.length); - ByteBuffer outputBuffer = ByteBuffer.allocateDirect(outputBytes.length); - inputBuffer.put(inputBytes); - inputBuffer.flip(); - outputBuffer.put(outputBytes); - outputBuffer.flip(); - - byteBufferTest(tran,key, iv, inputBuffer, outputBuffer); - byteArrayTest(tran, key, iv, inputBytes, outputBytes); - } - - /** uses randomly generated big data set */ - byteArrayTest(tran, KEY, IV); - } - } - - private void byteBufferTest(CipherTransformation transformation, byte[] key, - byte[] iv, - ByteBuffer input, ByteBuffer output) throws - GeneralSecurityException, IOException { - ByteBuffer decResult = ByteBuffer.allocateDirect(BYTEBUFFER_SIZE); - ByteBuffer encResult = ByteBuffer.allocateDirect(BYTEBUFFER_SIZE); + // data + public static final int BYTEBUFFER_SIZE = 1000; + public String[] cipherTests = null; + Properties props = null; + String cipherClass = null; + CipherTransformation[] transformations = null; + + // cipher + static final byte[] KEY = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; + static final byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; CryptoCipher enc, dec; - enc = getCipher(transformation); - dec = getCipher(transformation); - - try { - enc.init(CryptoCipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"), new IvParameterSpec(iv)); - } catch (Exception e) { - Assert.fail("AES failed initialisation - " + e.toString()); + @Before + public void setup() { + init(); + Utils.checkNotNull(cipherClass); + Utils.checkNotNull(transformations); + props = new Properties(); + props.setProperty(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, + cipherClass); } - try { - dec.init(CryptoCipher.DECRYPT_MODE, new SecretKeySpec(key,"AES"), new IvParameterSpec(iv)); - } catch (Exception e) { - Assert.fail("AES failed initialisation - " + e.toString()); + protected abstract void init(); + + @Test + public void cryptoTest() throws GeneralSecurityException, IOException { + for (CipherTransformation tran : transformations) { + /** uses the small data set in {@link TestData} */ + cipherTests = TestData.getTestData(tran); + for (int i = 0; i != cipherTests.length; i += 5) { + byte[] key = DatatypeConverter + .parseHexBinary(cipherTests[i + 1]); + byte[] iv = DatatypeConverter + .parseHexBinary(cipherTests[i + 2]); + + byte[] inputBytes = DatatypeConverter + .parseHexBinary(cipherTests[i + 3]); + byte[] outputBytes = DatatypeConverter + .parseHexBinary(cipherTests[i + 4]); + + ByteBuffer inputBuffer = ByteBuffer + .allocateDirect(inputBytes.length); + ByteBuffer outputBuffer = ByteBuffer + .allocateDirect(outputBytes.length); + inputBuffer.put(inputBytes); + inputBuffer.flip(); + outputBuffer.put(outputBytes); + outputBuffer.flip(); + + byteBufferTest(tran, key, iv, inputBuffer, outputBuffer); + byteArrayTest(tran, key, iv, inputBytes, outputBytes); + } + + /** uses randomly generated big data set */ + byteArrayTest(tran, KEY, IV); + } } - // - // encryption pass - // - enc.doFinal(input, encResult); - input.flip(); - encResult.flip(); - if (!output.equals(encResult)) { - byte[] b = new byte[output.remaining()]; - output.get(b); - byte[] c = new byte[encResult.remaining()]; - encResult.get(c); - Assert.fail("AES failed encryption - expected " + new String( - DatatypeConverter - .printHexBinary(b)) + " got " + new String( - DatatypeConverter.printHexBinary(c))); - } + private void byteBufferTest(CipherTransformation transformation, + byte[] key, byte[] iv, ByteBuffer input, ByteBuffer output) + throws GeneralSecurityException, IOException { + ByteBuffer decResult = ByteBuffer.allocateDirect(BYTEBUFFER_SIZE); + ByteBuffer encResult = ByteBuffer.allocateDirect(BYTEBUFFER_SIZE); + CryptoCipher enc, dec; + + enc = getCipher(transformation); + dec = getCipher(transformation); + + try { + enc.init(CryptoCipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), + new IvParameterSpec(iv)); + } catch (Exception e) { + Assert.fail("AES failed initialisation - " + e.toString()); + } - // - // decryption pass - // - dec.doFinal(encResult, decResult); - decResult.flip(); - - if (!input.equals(decResult)) { - byte[] inArray = new byte[input.remaining()]; - byte[] decResultArray = new byte[decResult.remaining()]; - input.get(inArray); - decResult.get(decResultArray); - Assert.fail(); - } - } - - /** test byte array whose data is planned in {@link TestData} */ - private void byteArrayTest(CipherTransformation transformation, byte[] key, - byte[] iv, byte[] input, byte[] output) throws GeneralSecurityException { - resetCipher(transformation, key, iv); - int blockSize = transformation.getAlgorithmBlockSize(); - - byte[] temp = new byte[input.length + blockSize]; - int n = enc.doFinal(input, 0, input.length, temp, 0); - byte[] cipherText = new byte[n]; - System.arraycopy(temp, 0, cipherText, 0, n); - Assert.assertArrayEquals("byte array encryption error.", output, cipherText); - - temp = new byte[cipherText.length + blockSize]; - int m = dec.doFinal(cipherText, 0, cipherText.length, temp, 0); - byte[] plainText = new byte[m]; - System.arraycopy(temp, 0, plainText, 0, m); - Assert.assertArrayEquals("byte array decryption error.", input, plainText); - } - - /** test byte array whose data is randomly generated */ - private void byteArrayTest(CipherTransformation transformation, byte[] key, - byte[] iv) throws GeneralSecurityException { - int blockSize = transformation.getAlgorithmBlockSize(); - - // AES_CBC_NOPADDING only accepts data whose size is the multiple of block size - int[] dataLenList = (transformation == CipherTransformation.AES_CBC_NOPADDING) - ? new int[] {10 * 1024} : new int[] {10 * 1024, 10 * 1024 - 3}; - for (int dataLen : dataLenList) { - byte[] plainText = new byte[dataLen]; - Random random = new SecureRandom(); - random.nextBytes(plainText); - byte[] cipherText = new byte[dataLen + blockSize]; - - // check update method with inputs whose sizes are the multiple of block size or not - int[] bufferLenList = new int[] {2 * 1024 - 128, 2 * 1024 - 125}; - for (int bufferLen : bufferLenList) { - resetCipher(transformation, key, iv); + try { + dec.init(CryptoCipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), + new IvParameterSpec(iv)); + } catch (Exception e) { + Assert.fail("AES failed initialisation - " + e.toString()); + } - int offset = 0; - // encrypt (update + doFinal) the data - int cipherPos = 0; - for (int i = 0; i < dataLen / bufferLen; i ++) { - cipherPos += enc.update(plainText, offset, bufferLen, cipherText, cipherPos); - offset += bufferLen; + // + // encryption pass + // + enc.doFinal(input, encResult); + input.flip(); + encResult.flip(); + if (!output.equals(encResult)) { + byte[] b = new byte[output.remaining()]; + output.get(b); + byte[] c = new byte[encResult.remaining()]; + encResult.get(c); + Assert.fail("AES failed encryption - expected " + + new String(DatatypeConverter.printHexBinary(b)) + " got " + + new String(DatatypeConverter.printHexBinary(c))); } - cipherPos += enc.doFinal(plainText, offset, dataLen % bufferLen, cipherText, cipherPos); - - offset = 0; - // decrypt (update + doFinal) the data - byte[] realPlainText = new byte[cipherPos + blockSize]; - int plainPos = 0; - for (int i = 0; i < cipherPos / bufferLen; i ++) { - plainPos += dec.update(cipherText, offset, bufferLen, realPlainText, plainPos); - offset += bufferLen; + + // + // decryption pass + // + dec.doFinal(encResult, decResult); + decResult.flip(); + + if (!input.equals(decResult)) { + byte[] inArray = new byte[input.remaining()]; + byte[] decResultArray = new byte[decResult.remaining()]; + input.get(inArray); + decResult.get(decResultArray); + Assert.fail(); } - plainPos += dec.doFinal(cipherText, offset, cipherPos % bufferLen, realPlainText, plainPos); + } - // verify - Assert.assertEquals("random byte array length changes after transformation", - dataLen, plainPos); + /** test byte array whose data is planned in {@link TestData} */ + private void byteArrayTest(CipherTransformation transformation, byte[] key, + byte[] iv, byte[] input, byte[] output) + throws GeneralSecurityException { + resetCipher(transformation, key, iv); + int blockSize = transformation.getAlgorithmBlockSize(); + + byte[] temp = new byte[input.length + blockSize]; + int n = enc.doFinal(input, 0, input.length, temp, 0); + byte[] cipherText = new byte[n]; + System.arraycopy(temp, 0, cipherText, 0, n); + Assert.assertArrayEquals("byte array encryption error.", output, + cipherText); + + temp = new byte[cipherText.length + blockSize]; + int m = dec.doFinal(cipherText, 0, cipherText.length, temp, 0); + byte[] plainText = new byte[m]; + System.arraycopy(temp, 0, plainText, 0, m); + Assert.assertArrayEquals("byte array decryption error.", input, + plainText); + } - byte[] shrinkPlainText = new byte[plainPos]; - System.arraycopy(realPlainText, 0, shrinkPlainText, 0, plainPos); - Assert.assertArrayEquals("random byte array contents changes after transformation", - plainText, shrinkPlainText); - } + /** test byte array whose data is randomly generated */ + private void byteArrayTest(CipherTransformation transformation, byte[] key, + byte[] iv) throws GeneralSecurityException { + int blockSize = transformation.getAlgorithmBlockSize(); + + // AES_CBC_NOPADDING only accepts data whose size is the multiple of + // block size + int[] dataLenList = (transformation == CipherTransformation.AES_CBC_NOPADDING) ? new int[] { 10 * 1024 } + : new int[] { 10 * 1024, 10 * 1024 - 3 }; + for (int dataLen : dataLenList) { + byte[] plainText = new byte[dataLen]; + Random random = new SecureRandom(); + random.nextBytes(plainText); + byte[] cipherText = new byte[dataLen + blockSize]; + + // check update method with inputs whose sizes are the multiple of + // block size or not + int[] bufferLenList = new int[] { 2 * 1024 - 128, 2 * 1024 - 125 }; + for (int bufferLen : bufferLenList) { + resetCipher(transformation, key, iv); + + int offset = 0; + // encrypt (update + doFinal) the data + int cipherPos = 0; + for (int i = 0; i < dataLen / bufferLen; i++) { + cipherPos += enc.update(plainText, offset, bufferLen, + cipherText, cipherPos); + offset += bufferLen; + } + cipherPos += enc.doFinal(plainText, offset, + dataLen % bufferLen, cipherText, cipherPos); + + offset = 0; + // decrypt (update + doFinal) the data + byte[] realPlainText = new byte[cipherPos + blockSize]; + int plainPos = 0; + for (int i = 0; i < cipherPos / bufferLen; i++) { + plainPos += dec.update(cipherText, offset, bufferLen, + realPlainText, plainPos); + offset += bufferLen; + } + plainPos += dec.doFinal(cipherText, offset, cipherPos + % bufferLen, realPlainText, plainPos); + + // verify + Assert.assertEquals( + "random byte array length changes after transformation", + dataLen, plainPos); + + byte[] shrinkPlainText = new byte[plainPos]; + System.arraycopy(realPlainText, 0, shrinkPlainText, 0, plainPos); + Assert.assertArrayEquals( + "random byte array contents changes after transformation", + plainText, shrinkPlainText); + } + } } - } - private void resetCipher(CipherTransformation transformation, byte[] key, byte[] iv) { - enc = getCipher(transformation); - dec = getCipher(transformation); + private void resetCipher(CipherTransformation transformation, byte[] key, + byte[] iv) { + enc = getCipher(transformation); + dec = getCipher(transformation); - try { - enc.init(CryptoCipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"), new IvParameterSpec(iv)); - } catch (Exception e) { - Assert.fail("AES failed initialisation - " + e.toString()); - } + try { + enc.init(CryptoCipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), + new IvParameterSpec(iv)); + } catch (Exception e) { + Assert.fail("AES failed initialisation - " + e.toString()); + } - try { - dec.init(CryptoCipher.DECRYPT_MODE, new SecretKeySpec(key,"AES"), new IvParameterSpec(iv)); - } catch (Exception e) { - Assert.fail("AES failed initialisation - " + e.toString()); - } - } - - private CryptoCipher getCipher(CipherTransformation transformation) { - try { - return (CryptoCipher) ReflectionUtils - .newInstance(ReflectionUtils.getClassByName(cipherClass), props, - transformation); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + try { + dec.init(CryptoCipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), + new IvParameterSpec(iv)); + } catch (Exception e) { + Assert.fail("AES failed initialisation - " + e.toString()); + } } - } + private CryptoCipher getCipher(CipherTransformation transformation) { + try { + return (CryptoCipher) ReflectionUtils.newInstance( + ReflectionUtils.getClassByName(cipherClass), props, + transformation); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/95a8d486/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 3653cf9..bc1f6bd 100644 --- a/src/test/java/org/apache/commons/crypto/cipher/CryptoCipherFactoryTest.java +++ b/src/test/java/org/apache/commons/crypto/cipher/CryptoCipherFactoryTest.java @@ -26,32 +26,32 @@ import junit.framework.Assert; import org.junit.Test; public class CryptoCipherFactoryTest { - @Test - public void testDefaultCipher() throws GeneralSecurityException { - CryptoCipher defaultCipher = CryptoCipherFactory.getInstance( - CipherTransformation.AES_CBC_NOPADDING); - Assert.assertEquals(OpensslCipher.class.getName(), - defaultCipher.getClass().getName()); - } + @Test + public void testDefaultCipher() throws GeneralSecurityException { + CryptoCipher defaultCipher = CryptoCipherFactory + .getInstance(CipherTransformation.AES_CBC_NOPADDING); + Assert.assertEquals(OpensslCipher.class.getName(), defaultCipher + .getClass().getName()); + } - @Test - public void testEmptyCipher() throws GeneralSecurityException { - Properties properties = new Properties(); - properties.put(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, ""); - CryptoCipher defaultCipher = CryptoCipherFactory.getInstance( - CipherTransformation.AES_CBC_NOPADDING, properties); - Assert.assertEquals(OpensslCipher.class.getName(), - defaultCipher.getClass().getName()); - } + @Test + public void testEmptyCipher() throws GeneralSecurityException { + Properties properties = new Properties(); + properties.put(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, ""); + CryptoCipher defaultCipher = CryptoCipherFactory.getInstance( + CipherTransformation.AES_CBC_NOPADDING, properties); + Assert.assertEquals(OpensslCipher.class.getName(), defaultCipher + .getClass().getName()); + } - @Test - public void testInvalidCipher() throws GeneralSecurityException { - Properties properties = new Properties(); - properties.put(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 testInvalidCipher() throws GeneralSecurityException { + Properties properties = new Properties(); + properties.put(ConfigurationKeys.COMMONS_CRYPTO_CIPHER_CLASSES_KEY, + "InvalidCipherName"); + CryptoCipher defaultCipher = CryptoCipherFactory.getInstance( + CipherTransformation.AES_CBC_NOPADDING, properties); + Assert.assertEquals(JceCipher.class.getName(), defaultCipher.getClass() + .getName()); + } }