Changeset 8d9790f


Ignore:
Timestamp:
May 9, 2014 3:28:54 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d2e3547
Parents:
cd91a6b
Message:
  • CPUID:
    • Add hasAES()
    • Fix bugs in unused hasSSE3(), hasSSE41(), hasSSE42()
  • Crypto: Use JVM AES when faster
  • SystemVersion?: Add isJava7() and isX86()
Location:
core/java/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/freenet/support/CPUInformation/CPUIDCPUInfo.java

    rcd91a6b r8d9790f  
    33/**
    44 *  Moved out of CPUID.java
     5 *  Ref: http://en.wikipedia.org/wiki/CPUID
    56 *  @since 0.8.7
    67 */
    7 abstract class CPUIDCPUInfo
     8abstract class CPUIDCPUInfo implements CPUInfo
    89{
    910    protected static boolean isX64 = false;       
     
    1314        return CPUID.getCPUVendorID();
    1415    }
     16
    1517    public boolean hasMMX()
    1618    {
    1719        return (CPUID.getEDXCPUFlags() & 0x800000) != 0; //EDX Bit 23
    1820    }
     21
    1922    public boolean hasSSE(){
    2023        return (CPUID.getEDXCPUFlags() & 0x2000000) != 0; //EDX Bit 25
    2124    }
     25
    2226    public boolean hasSSE2()
    2327    {
    2428        return (CPUID.getEDXCPUFlags() & 0x4000000) != 0; //EDX Bit 26
    2529    }
     30
    2631    public boolean hasSSE3()
    2732    {
    28         return (CPUID.getEDXCPUFlags() & 0x1) != 0; //ECX Bit 0
     33        return (CPUID.getECXCPUFlags() & 0x1) != 0; //ECX Bit 0
    2934    }
     35
    3036    public boolean hasSSE41()
    3137    {
    32         return (CPUID.getEDXCPUFlags() & 0x80000) != 0; //ECX Bit 19
     38        return (CPUID.getECXCPUFlags() & 0x80000) != 0; //ECX Bit 19
    3339    }
     40
    3441    public boolean hasSSE42()
    3542    {
    36         return (CPUID.getEDXCPUFlags() & 0x100000) != 0; //ECX Bit 20
     43        return (CPUID.getECXCPUFlags() & 0x100000) != 0; //ECX Bit 20
    3744    }
     45
    3846    public boolean hasSSE4A()
    3947    {
    4048        return (CPUID.getExtendedECXCPUFlags() & 0x40) != 0; //Extended ECX Bit 6
    4149    }
     50
     51    /**
     52     * @return true iff the CPU supports the AES-NI instruction set.
     53     * @since 0.9.14
     54     */
     55    public boolean hasAES() {
     56        return (CPUID.getECXCPUFlags() & 0x2000000) != 0; //ECX Bit 25
     57    }
    4258   
    4359    public abstract boolean hasX64();
  • core/java/src/freenet/support/CPUInformation/CPUInfo.java

    rcd91a6b r8d9790f  
    6363     */
    6464    public boolean hasSSE4A();
     65
     66    /**
     67     * @return true iff the CPU supports the AES-NI instruction set.
     68     * @since 0.9.14
     69     */
     70    public boolean hasAES();
    6571}
  • core/java/src/net/i2p/crypto/CryptixAESEngine.java

    rcd91a6b r8d9790f  
    1313
    1414// for using system version
    15 //import java.security.GeneralSecurityException;
    16 //import javax.crypto.Cipher;
    17 //import javax.crypto.spec.IvParameterSpec;
    18 //import javax.crypto.spec.SecretKeySpec;
     15import java.security.GeneralSecurityException;
     16import javax.crypto.Cipher;
     17import javax.crypto.spec.IvParameterSpec;
     18import javax.crypto.spec.SecretKeySpec;
     19
     20import freenet.support.CPUInformation.CPUID;
     21import freenet.support.CPUInformation.CPUInfo;
     22import freenet.support.CPUInformation.UnknownCPUException;
    1923
    2024import net.i2p.I2PAppContext;
     
    2327import net.i2p.util.Log;
    2428import net.i2p.util.SimpleByteCache;
     29import net.i2p.util.SystemVersion;
    2530
    2631/**
     
    3843    //private CryptixAESKeyCache _cache;
    3944   
    40 /**** see comments for main() below
    4145    private static final boolean USE_SYSTEM_AES;
    4246    static {
    4347        boolean systemOK = false;
    44         try {
    45             systemOK = Cipher.getMaxAllowedKeyLength("AES") >= 256;
    46         } catch (GeneralSecurityException gse) {
    47             // a NoSuchAlgorithmException
    48         } catch (NoSuchMethodError nsme) {
    49             // JamVM, gij
    50             try {
    51                 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    52                 SecretKeySpec key = new SecretKeySpec(new byte[32], "AES");
    53                 cipher.init(Cipher.ENCRYPT_MODE, key);
    54                 systemOK = true;
     48        if (hasAESNI()) {
     49            try {
     50                systemOK = Cipher.getMaxAllowedKeyLength("AES") >= 256;
    5551            } catch (GeneralSecurityException gse) {
     52                // a NoSuchAlgorithmException
     53            } catch (NoSuchMethodError nsme) {
     54                // JamVM, gij
     55                try {
     56                    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
     57                    SecretKeySpec key = new SecretKeySpec(new byte[32], "AES");
     58                    cipher.init(Cipher.ENCRYPT_MODE, key);
     59                    systemOK = true;
     60                } catch (GeneralSecurityException gse) {
     61                }
    5662            }
    5763        }
     
    5965        //System.out.println("Using system AES? " + systemOK);
    6066    }
    61 ****/
     67
     68    /**
     69     *  Do we have AES-NI support in the processor and JVM?
     70     *  Only on 64-bit x86 Java 7 fast JVMs, with AES-NI support.
     71     *  See comments in main() below.
     72     *  @since 0.9.14
     73     */
     74    private static boolean hasAESNI() {
     75        if (SystemVersion.isX86() && SystemVersion.is64Bit() && SystemVersion.isJava7() &&
     76            !SystemVersion.isApache() && !SystemVersion.isGNU()) {
     77            try {
     78                return CPUID.getInfo().hasAES();
     79            } catch (UnknownCPUException e) {
     80                return false;
     81            }
     82        } else {
     83            return false;
     84        }
     85    }
    6286
    6387    /** */
     
    105129        }
    106130
    107 /****
    108131        if (USE_SYSTEM_AES) {
    109132            try {
     
    119142            }
    120143        }
    121 ****/
    122144
    123145        int numblock = length / 16;
     
    160182        }
    161183
    162 /****
    163184        if (USE_SYSTEM_AES) {
    164185            try {
     
    174195            }
    175196        }
    176 ****/
    177197
    178198        int numblock = length / 16;
     
    262282   
    263283/******
    264     private static final int MATCH_RUNS = 5000;
    265     private static final int TIMING_RUNS = 10000;
     284    private static final int MATCH_RUNS = 11000;
     285    private static final int TIMING_RUNS = 100000;
    266286******/
    267287
     
    283303     *</pre>
    284304     *
     305     * Speed ups with AES-NI:
     306     * May 2014 AMD Hexcore 100K runs:
     307     *<pre>
     308     *  JVM             Cryptix (ms)    System (ms)
     309     * OpenJDK 6        3314              5030
     310     * OpenJDK 7        3285              2476
     311     *</pre>
     312     *
     313     *
    285314     */
    286315/*******
  • core/java/src/net/i2p/util/NativeBigInteger.java

    rcd91a6b r8d9790f  
    182182    private static final boolean _is64 = SystemVersion.is64Bit();
    183183
    184     private static final boolean _isX86 = System.getProperty("os.arch").contains("86") ||
    185                                          System.getProperty("os.arch").equals("amd64");
     184    private static final boolean _isX86 = SystemVersion.isX86();
    186185
    187186    private static final boolean _isArm = SystemVersion.isARM();
  • core/java/src/net/i2p/util/SystemVersion.java

    rcd91a6b r8d9790f  
    1717    private static final boolean _isMac = System.getProperty("os.name").startsWith("Mac");
    1818    private static final boolean _isArm = System.getProperty("os.arch").startsWith("arm");
     19    private static final boolean _isX86 = System.getProperty("os.arch").contains("86") ||
     20                                          System.getProperty("os.arch").equals("amd64");
    1921    private static final boolean _isAndroid;
    2022    private static final boolean _isApache;
     
    2426
    2527    private static final boolean _oneDotSix;
     28    private static final boolean _oneDotSeven;
    2629    private static final int _androidSDK;
    2730
     
    5760        if (_isAndroid) {
    5861            _oneDotSix = _androidSDK >= 9;
     62            _oneDotSeven = _androidSDK >= 19;
    5963        } else {
    6064            _oneDotSix = VersionComparator.comp(System.getProperty("java.version"), "1.6") >= 0;
     65            _oneDotSeven = VersionComparator.comp(System.getProperty("java.version"), "1.7") >= 0;
    6166        }
    6267    }
     
    96101
    97102    /**
     103     *  @since 0.9.14
     104     */
     105    public static boolean isX86() {
     106        return _isX86;
     107    }
     108
     109    /**
    98110     *  Better than (new VersionComparator()).compare(System.getProperty("java.version"), "1.6") >= 0
    99111     *  as it handles Android also, where java.version = "0".
     
    103115    public static boolean isJava6() {
    104116        return _oneDotSix;
     117    }
     118
     119    /**
     120     *  Better than (new VersionComparator()).compare(System.getProperty("java.version"), "1.7") >= 0
     121     *  as it handles Android also, where java.version = "0".
     122     *
     123     *  @return true if Java 1.7 or higher, or Android API 19 or higher
     124     *  @since 0.9.14
     125     */
     126    public static boolean isJava7() {
     127        return _oneDotSeven;
    105128    }
    106129
Note: See TracChangeset for help on using the changeset viewer.