mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 12:09:14 +00:00
8326609: New AES implementation with updates specified in FIPS 197
Reviewed-by: valeriep
This commit is contained in:
parent
b2e431a1cb
commit
62f11cd407
@ -467,8 +467,8 @@ class methodHandle;
|
||||
do_intrinsic(_Reference_clear0, java_lang_ref_Reference, clear0_name, void_method_signature, F_RN) \
|
||||
do_intrinsic(_PhantomReference_clear0, java_lang_ref_PhantomReference, clear0_name, void_method_signature, F_RN) \
|
||||
\
|
||||
/* support for com.sun.crypto.provider.AESCrypt and some of its callers */ \
|
||||
do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AESCrypt") \
|
||||
/* support for com.sun.crypto.provider.AES_Crypt and some of its callers */ \
|
||||
do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AES_Crypt") \
|
||||
do_intrinsic(_aescrypt_encryptBlock, com_sun_crypto_provider_aescrypt, encryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \
|
||||
do_intrinsic(_aescrypt_decryptBlock, com_sun_crypto_provider_aescrypt, decryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \
|
||||
do_name( encryptBlock_name, "implEncryptBlock") \
|
||||
|
||||
@ -7273,7 +7273,7 @@ bool LibraryCallKit::inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id) {
|
||||
const TypeInstPtr* tinst = _gvn.type(cipherBlockChaining_object)->isa_instptr();
|
||||
assert(tinst != nullptr, "CBC obj is null");
|
||||
assert(tinst->is_loaded(), "CBC obj is not loaded");
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded");
|
||||
|
||||
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
|
||||
@ -7359,7 +7359,7 @@ bool LibraryCallKit::inline_electronicCodeBook_AESCrypt(vmIntrinsics::ID id) {
|
||||
const TypeInstPtr* tinst = _gvn.type(electronicCodeBook_object)->isa_instptr();
|
||||
assert(tinst != nullptr, "ECB obj is null");
|
||||
assert(tinst->is_loaded(), "ECB obj is not loaded");
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded");
|
||||
|
||||
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
|
||||
@ -7429,7 +7429,7 @@ bool LibraryCallKit::inline_counterMode_AESCrypt(vmIntrinsics::ID id) {
|
||||
const TypeInstPtr* tinst = _gvn.type(counterMode_object)->isa_instptr();
|
||||
assert(tinst != nullptr, "CTR obj is null");
|
||||
assert(tinst->is_loaded(), "CTR obj is not loaded");
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded");
|
||||
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
|
||||
const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt);
|
||||
@ -7469,7 +7469,7 @@ Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object)
|
||||
// However, ppc64 vncipher processes MixColumns and requires the same round keys with encryption.
|
||||
// The ppc64 and riscv64 stubs of encryption and decryption use the same round keys (sessionK[0]).
|
||||
Node* objSessionK = load_field_from_object(aescrypt_object, "sessionK", "[[I");
|
||||
assert (objSessionK != nullptr, "wrong version of com.sun.crypto.provider.AESCrypt");
|
||||
assert (objSessionK != nullptr, "wrong version of com.sun.crypto.provider.AES_Crypt");
|
||||
if (objSessionK == nullptr) {
|
||||
return (Node *) nullptr;
|
||||
}
|
||||
@ -7477,7 +7477,7 @@ Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object)
|
||||
#else
|
||||
Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I");
|
||||
#endif // PPC64
|
||||
assert (objAESCryptKey != nullptr, "wrong version of com.sun.crypto.provider.AESCrypt");
|
||||
assert (objAESCryptKey != nullptr, "wrong version of com.sun.crypto.provider.AES_Crypt");
|
||||
if (objAESCryptKey == nullptr) return (Node *) nullptr;
|
||||
|
||||
// now have the array, need to get the start address of the K array
|
||||
@ -7512,7 +7512,7 @@ Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypt
|
||||
assert(tinst->is_loaded(), "CBCobj is not loaded");
|
||||
|
||||
// we want to do an instanceof comparison against the AESCrypt class
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
if (!klass_AESCrypt->is_loaded()) {
|
||||
// if AESCrypt is not even loaded, we never take the intrinsic fast path
|
||||
Node* ctrl = control();
|
||||
@ -7575,7 +7575,7 @@ Node* LibraryCallKit::inline_electronicCodeBook_AESCrypt_predicate(bool decrypti
|
||||
assert(tinst->is_loaded(), "ECBobj is not loaded");
|
||||
|
||||
// we want to do an instanceof comparison against the AESCrypt class
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
if (!klass_AESCrypt->is_loaded()) {
|
||||
// if AESCrypt is not even loaded, we never take the intrinsic fast path
|
||||
Node* ctrl = control();
|
||||
@ -7635,7 +7635,7 @@ Node* LibraryCallKit::inline_counterMode_AESCrypt_predicate() {
|
||||
assert(tinst->is_loaded(), "CTRobj is not loaded");
|
||||
|
||||
// we want to do an instanceof comparison against the AESCrypt class
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
if (!klass_AESCrypt->is_loaded()) {
|
||||
// if AESCrypt is not even loaded, we never take the intrinsic fast path
|
||||
Node* ctrl = control();
|
||||
@ -8608,7 +8608,7 @@ bool LibraryCallKit::inline_galoisCounterMode_AESCrypt() {
|
||||
const TypeInstPtr* tinst = _gvn.type(gctr_object)->isa_instptr();
|
||||
assert(tinst != nullptr, "GCTR obj is null");
|
||||
assert(tinst->is_loaded(), "GCTR obj is not loaded");
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded");
|
||||
ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass();
|
||||
const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt);
|
||||
@ -8662,7 +8662,7 @@ Node* LibraryCallKit::inline_galoisCounterMode_AESCrypt_predicate() {
|
||||
assert(tinst->is_loaded(), "GCTR obj is not loaded");
|
||||
|
||||
// we want to do an instanceof comparison against the AESCrypt class
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt"));
|
||||
ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt"));
|
||||
if (!klass_AESCrypt->is_loaded()) {
|
||||
// if AESCrypt is not even loaded, we never take the intrinsic fast path
|
||||
Node* ctrl = control();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -49,7 +49,7 @@ import java.util.Arrays;
|
||||
*
|
||||
* @author Valerie Peng
|
||||
*
|
||||
* @see AESCrypt
|
||||
* @see AES_Crypt
|
||||
* @see CipherBlockChaining
|
||||
* @see ElectronicCodeBook
|
||||
* @see CipherFeedback
|
||||
@ -174,7 +174,7 @@ class AESCipher extends CipherSpi {
|
||||
* PKCS5Padding.
|
||||
*/
|
||||
protected AESCipher(int keySize) {
|
||||
core = new CipherCore(new AESCrypt(), AESConstants.AES_BLOCK_SIZE);
|
||||
core = new CipherCore(new AES_Crypt(), AESConstants.AES_BLOCK_SIZE);
|
||||
fixedKeySize = keySize;
|
||||
}
|
||||
|
||||
@ -504,7 +504,7 @@ class AESCipher extends CipherSpi {
|
||||
protected int engineGetKeySize(Key key) throws InvalidKeyException {
|
||||
byte[] encoded = key.getEncoded();
|
||||
Arrays.fill(encoded, (byte)0);
|
||||
if (!AESCrypt.isKeySizeValid(encoded.length)) {
|
||||
if (!AES_Crypt.isKeySizeValid(encoded.length)) {
|
||||
throw new InvalidKeyException("Invalid AES key length: " +
|
||||
encoded.length + " bytes");
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -91,7 +91,7 @@ public final class AESKeyGenerator extends KeyGeneratorSpi {
|
||||
*/
|
||||
protected void engineInit(int keysize, SecureRandom random) {
|
||||
if (((keysize % 8) != 0) ||
|
||||
(!AESCrypt.isKeySizeValid(keysize/8))) {
|
||||
(!AES_Crypt.isKeySizeValid(keysize/8))) {
|
||||
throw new InvalidParameterException
|
||||
("Wrong keysize: must be equal to 128, 192 or 256");
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -50,7 +50,7 @@ class AESKeyWrap extends FeedbackCipher {
|
||||
};
|
||||
|
||||
AESKeyWrap() {
|
||||
super(new AESCrypt());
|
||||
super(new AES_Crypt());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -87,7 +87,7 @@ class AESKeyWrapPadded extends FeedbackCipher {
|
||||
}
|
||||
|
||||
AESKeyWrapPadded() {
|
||||
super(new AESCrypt());
|
||||
super(new AES_Crypt());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
1392
src/java.base/share/classes/com/sun/crypto/provider/AES_Crypt.java
Normal file
1392
src/java.base/share/classes/com/sun/crypto/provider/AES_Crypt.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -40,7 +40,7 @@ import java.util.Arrays;
|
||||
* to 16 bytes.
|
||||
*
|
||||
* If any invariant is broken, failures can occur because the
|
||||
* AESCrypt.encryptBlock method can be intrinsified on the HotSpot VM
|
||||
* AES_Crypt.encryptBlock method can be intrinsified on the HotSpot VM
|
||||
* (see JDK-8067648 for details).
|
||||
*
|
||||
* The counter mode operations can be intrinsified and parallelized
|
||||
|
||||
@ -102,7 +102,7 @@ abstract class GaloisCounterMode extends CipherSpi {
|
||||
/**
|
||||
*
|
||||
* @param keySize length of key.
|
||||
* @param embeddedCipher Cipher object, such as AESCrypt.
|
||||
* @param embeddedCipher Cipher object, such as AES_Crypt.
|
||||
*/
|
||||
GaloisCounterMode(int keySize, SymmetricCipher embeddedCipher) {
|
||||
blockCipher = embeddedCipher;
|
||||
@ -198,7 +198,7 @@ abstract class GaloisCounterMode extends CipherSpi {
|
||||
protected int engineGetKeySize(Key key) throws InvalidKeyException {
|
||||
byte[] encoded = key.getEncoded();
|
||||
Arrays.fill(encoded, (byte)0);
|
||||
if (!AESCrypt.isKeySizeValid(encoded.length)) {
|
||||
if (!AES_Crypt.isKeySizeValid(encoded.length)) {
|
||||
throw new InvalidKeyException("Invalid key length: " +
|
||||
encoded.length + " bytes");
|
||||
}
|
||||
@ -1693,25 +1693,25 @@ abstract class GaloisCounterMode extends CipherSpi {
|
||||
|
||||
public static final class AESGCM extends GaloisCounterMode {
|
||||
public AESGCM() {
|
||||
super(-1, new AESCrypt());
|
||||
super(-1, new AES_Crypt());
|
||||
}
|
||||
}
|
||||
|
||||
public static final class AES128 extends GaloisCounterMode {
|
||||
public AES128() {
|
||||
super(16, new AESCrypt());
|
||||
super(16, new AES_Crypt());
|
||||
}
|
||||
}
|
||||
|
||||
public static final class AES192 extends GaloisCounterMode {
|
||||
public AES192() {
|
||||
super(24, new AESCrypt());
|
||||
super(24, new AES_Crypt());
|
||||
}
|
||||
}
|
||||
|
||||
public static final class AES256 extends GaloisCounterMode {
|
||||
public AES256() {
|
||||
super(32, new AESCrypt());
|
||||
super(32, new AES_Crypt());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -137,7 +137,7 @@ abstract class KeyWrapCipher extends CipherSpi {
|
||||
}
|
||||
int keyLen = keyBytes.length;
|
||||
if (!key.getAlgorithm().equalsIgnoreCase("AES") ||
|
||||
!AESCrypt.isKeySizeValid(keyLen) ||
|
||||
!AES_Crypt.isKeySizeValid(keyLen) ||
|
||||
(fixedKeySize != -1 && fixedKeySize != keyLen)) {
|
||||
throw new InvalidKeyException("Invalid key length: " +
|
||||
keyLen + " bytes");
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -68,7 +68,7 @@ abstract class PBES2Core extends CipherSpi {
|
||||
|
||||
if (cipherAlgo.equals("AES")) {
|
||||
blkSize = AESConstants.AES_BLOCK_SIZE;
|
||||
cipher = new CipherCore(new AESCrypt(), blkSize);
|
||||
cipher = new CipherCore(new AES_Crypt(), blkSize);
|
||||
|
||||
switch(kdfAlgo) {
|
||||
case "HmacSHA1":
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -36,7 +36,7 @@ import java.security.InvalidKeyException;
|
||||
* @author Jan Luehe
|
||||
*
|
||||
*
|
||||
* @see AESCrypt
|
||||
* @see AES_Crypt
|
||||
* @see DESCrypt
|
||||
* @see DESedeCrypt
|
||||
* @see BlowfishCrypt
|
||||
|
||||
@ -1,36 +0,0 @@
|
||||
## Cryptix AES v3.2.0
|
||||
|
||||
### Cryptix General License
|
||||
<pre>
|
||||
|
||||
Cryptix General License
|
||||
|
||||
Copyright (c) 1995-2005 The Cryptix Foundation Limited.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
|
||||
CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
</pre>
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -155,7 +155,7 @@ public class TestAESMain {
|
||||
public static void main(String[] args) {
|
||||
String mode = System.getProperty("mode", "CBC");
|
||||
if ((mode.equals("CBC") || mode.equals("ECB")) &&
|
||||
!Compiler.isIntrinsicAvailable(CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION, "com.sun.crypto.provider.AESCrypt", "implEncryptBlock", byte[].class, int.class, byte[].class, int.class)) {
|
||||
!Compiler.isIntrinsicAvailable(CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION, "com.sun.crypto.provider.AES_Crypt", "implEncryptBlock", byte[].class, int.class, byte[].class, int.class)) {
|
||||
throw new SkippedException("AES intrinsic is not available");
|
||||
}
|
||||
if (mode.equals("GCM") &&
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,7 +31,7 @@ public abstract class AESIntrinsicsBase {
|
||||
+ ".provider\\.CipherBlockChaining::"
|
||||
+ "(implEncrypt|implDecrypt) \\([0-9]+ bytes\\)\\s+\\(intrinsic[,\\)]";
|
||||
public static final String AES_INTRINSIC = "com\\.sun\\.crypto\\"
|
||||
+ ".provider\\.AESCrypt::(implEncryptBlock|implDecryptBlock) \\([0-9]+ "
|
||||
+ ".provider\\.AES_Crypt::(implEncryptBlock|implDecryptBlock) \\([0-9]+ "
|
||||
+ "bytes\\)\\s+\\(intrinsic[,\\)]";
|
||||
public static final String USE_AES = "UseAES";
|
||||
public static final String USE_AES_INTRINSICS = "UseAESIntrinsics";
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -114,7 +114,7 @@ public class TestHotSpotJVMCIRuntime {
|
||||
VirtualObjectLayoutTest.class,
|
||||
TestHotSpotJVMCIRuntime.class));
|
||||
try {
|
||||
classes.add(Class.forName("com.sun.crypto.provider.AESCrypt"));
|
||||
classes.add(Class.forName("com.sun.crypto.provider.AES_Crypt"));
|
||||
classes.add(Class.forName("com.sun.crypto.provider.CipherBlockChaining"));
|
||||
} catch (ClassNotFoundException e) {
|
||||
// Extension classes not available
|
||||
|
||||
84
test/micro/org/openjdk/bench/javax/crypto/AESDecrypt.java
Normal file
84
test/micro/org/openjdk/bench/javax/crypto/AESDecrypt.java
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package org.openjdk.bench.javax.crypto;
|
||||
|
||||
import org.openjdk.jmh.annotations.Fork;
|
||||
import org.openjdk.jmh.annotations.Benchmark;
|
||||
import org.openjdk.jmh.annotations.OutputTimeUnit;
|
||||
import org.openjdk.jmh.annotations.Param;
|
||||
import org.openjdk.jmh.annotations.Scope;
|
||||
import org.openjdk.jmh.annotations.Setup;
|
||||
import org.openjdk.jmh.annotations.State;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@OutputTimeUnit(TimeUnit.SECONDS)
|
||||
@State(Scope.Thread)
|
||||
public class AESDecrypt {
|
||||
|
||||
@Param("10000000")
|
||||
private int count;
|
||||
|
||||
private Cipher cipher;
|
||||
private byte[] src;
|
||||
private byte[] ct;
|
||||
|
||||
@Setup
|
||||
public void setup() throws Exception {
|
||||
SecretKeySpec keySpec = new SecretKeySpec(new byte[]{-80, -103, -1, 68, -29, -94, 61, -52, 93, -59, -128, 105, 110, 88, 44, 105}, "AES");
|
||||
IvParameterSpec iv = new IvParameterSpec(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
|
||||
|
||||
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||
cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
|
||||
|
||||
src = new byte[count];
|
||||
new Random(1).nextBytes(src);
|
||||
|
||||
ct = cipher.doFinal(src);
|
||||
|
||||
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
@Fork(jvmArgs = {"-XX:+UnlockDiagnosticVMOptions", "-XX:-UseAES", "-XX:-UseAESIntrinsics"})
|
||||
public byte[] testBaseline() throws Exception {
|
||||
return cipher.doFinal(ct);
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
@Fork(jvmArgs = {"-XX:+UnlockDiagnosticVMOptions", "-XX:+UseAES", "-XX:-UseAESIntrinsics"})
|
||||
public byte[] testUseAes() throws Exception {
|
||||
return cipher.doFinal(ct);
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
@Fork(jvmArgs = {"-XX:+UnlockDiagnosticVMOptions", "-XX:+UseAES", "-XX:+UseAESIntrinsics"})
|
||||
public byte[] testUseAesIntrinsics() throws Exception {
|
||||
return cipher.doFinal(ct);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user