< prev index next >
src/share/vm/opto/library_call.cpp
Print this page
rev 7958 : 8152172: PPC64: Support AES intrinsics
Reviewed-by: kvn, mdoerr, simonis
Contributed-by: horii@jp.ibm.com
@@ -6457,11 +6457,24 @@
return true;
}
//------------------------------get_key_start_from_aescrypt_object-----------------------
Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) {
+#ifdef PPC64
+ // MixColumns for decryption can be reduced by preprocessing MixColumns with round keys.
+ // Intel's extention is based on this optimization and AESCrypt generates round keys by preprocessing MixColumns.
+ // However, ppc64 vncipher processes MixColumns and requires the same round keys with encryption.
+ // The ppc64 stubs of encryption and decryption use the same round keys (sessionK[0]).
+ Node* objSessionK = load_field_from_object(aescrypt_object, "sessionK", "[[I", /*is_exact*/ false);
+ assert (objSessionK != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
+ if (objSessionK == NULL) {
+ return (Node *) NULL;
+ }
+ Node* objAESCryptKey = load_array_element(control(), objSessionK, intcon(0), TypeAryPtr::OOPS);
+#else
Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I", /*is_exact*/ false);
+#endif // PPC64
assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
if (objAESCryptKey == NULL) return (Node *) NULL;
// now have the array, need to get the start address of the K array
Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT);
< prev index next >