package tools; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.security.Permission; import java.security.PermissionCollection; import java.util.Map; public class AutoJCE{ // AutoJCE into server source thanks to Acernis dev team /** * Credits: ntoskrnl of StackOverflow * http://stackoverflow.com/questions/1179672/ */ public static byte removeCryptographyRestrictions(){ if(!isRestrictedCryptography()){ //System.out.println("Cryptography restrictions removal not needed"); return 0; } try{ /* * Do the following, but with reflection to bypass access checks: * * JceSecurity.isRestricted = false; * JceSecurity.defaultPolicy.perms.clear(); * JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE); */ final Class jceSecurity = Class.forName("javax.crypto.JceSecurity"); final Class cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions"); final Class cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission"); final Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");// was set to final in Java 8 Update 112. Requires you to remove the final modifier. Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL); isRestrictedField.setAccessible(true); isRestrictedField.set(null, false); final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy"); defaultPolicyField.setAccessible(true); final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null); final Field perms = cryptoPermissions.getDeclaredField("perms"); perms.setAccessible(true); ((Map) perms.get(defaultPolicy)).clear(); final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE"); instance.setAccessible(true); defaultPolicy.add((Permission) instance.get(null)); //System.out.println("Successfully removed cryptography restrictions"); return 1; }catch(final Exception e){ e.printStackTrace(); System.err.println("Failed to remove cryptography restrictions"); return -1; } } private static boolean isRestrictedCryptography(){ // This simply matches the Oracle JRE, but not OpenJDK. return "Java(TM) SE Runtime Environment".equals(System.getProperty("java.runtime.name")); } }