package net.i2p.crypto; import java.security.GeneralSecurityException; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; /** * Moved from CryptixAESEngine and net.i2p.router.tasks.CryptoChecker. * This class does not do any logging. See CryptoChecker for the logging. * * @since 0.9.23 */ public class CryptoCheck { private static final boolean _isUnlimited; static { boolean unlimited = false; try { unlimited = Cipher.getMaxAllowedKeyLength("AES") >= 256; } catch (GeneralSecurityException gse) { // a NoSuchAlgorithmException } catch (NoSuchMethodError nsme) { // JamVM, gij try { Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec key = new SecretKeySpec(new byte[32], "AES"); cipher.init(Cipher.ENCRYPT_MODE, key); unlimited = true; } catch (GeneralSecurityException gse) { } } catch (ExceptionInInitializerError eiie) { // Java 9 b134 bug // > java -jar build/i2p.jar cryptocheck // Exception in thread "main" java.lang.ExceptionInInitializerError // at javax.crypto.JceSecurityManager.<clinit>(java.base@9-Ubuntu/JceSecurityManager.java:65) // at javax.crypto.Cipher.getConfiguredPermission(java.base@9-Ubuntu/Cipher.java:2595) // at javax.crypto.Cipher.getMaxAllowedKeyLength(java.base@9-Ubuntu/Cipher.java:2619) // at net.i2p.crypto.CryptoCheck.<clinit>(CryptoCheck.java:19) // at java.lang.Class.forName0(java.base@9-Ubuntu/Native Method) // at java.lang.Class.forName(java.base@9-Ubuntu/Class.java:374) // at net.i2p.util.CommandLine.exec(CommandLine.java:66) // at net.i2p.util.CommandLine.main(CommandLine.java:51) // Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism // at javax.crypto.JceSecurity.<clinit>(java.base@9-Ubuntu/JceSecurity.java:91) // ... 8 more // Caused by: java.lang.NullPointerException // at sun.nio.fs.UnixPath.normalizeAndCheck(java.base@9-Ubuntu/UnixPath.java:75) // at sun.nio.fs.UnixPath.<init>(java.base@9-Ubuntu/UnixPath.java:69) // at sun.nio.fs.UnixFileSystem.getPath(java.base@9-Ubuntu/UnixFileSystem.java:280) // at java.nio.file.Paths.get(java.base@9-Ubuntu/Paths.java:84) // at javax.crypto.JceSecurity.setupJurisdictionPolicies(java.base@9-Ubuntu/JceSecurity.java:254) // at javax.crypto.JceSecurity.access$000(java.base@9-Ubuntu/JceSecurity.java:49) // at javax.crypto.JceSecurity$1.run(java.base@9-Ubuntu/JceSecurity.java:82) // at javax.crypto.JceSecurity$1.run(java.base@9-Ubuntu/JceSecurity.java:79) // at java.security.AccessController.doPrivileged(java.base@9-Ubuntu/Native Method) // at javax.crypto.JceSecurity.<clinit>(java.base@9-Ubuntu/JceSecurity.java:78) // ... 8 more } _isUnlimited = unlimited; } private CryptoCheck() {} /** * Do we have unlimited crypto? */ public static boolean isUnlimited() { return _isUnlimited; } public static void main(String args[]) { System.out.println("Unlimited? " + isUnlimited()); } }