web-dev-qa-db-fra.com

Intrinsèques AES-NI activées par défaut?

Oracle a ceci à dire sur Java 8 en ce qui concerne AES-NI:

Des éléments intrinsèques matériels ont été ajoutés pour utiliser Advanced Encryption Standard (AES). Les indicateurs UseAES et UseAESIntrinsics sont disponibles pour activer les intrinsèques AES basés sur le matériel pour le matériel Intel. Le matériel doit être du matériel Westmere 2010 ou plus récent. Par exemple, pour activer le matériel AES, utilisez les indicateurs suivants:

-XX:+UseAES -XX:+UseAESIntrinsics

Pour désactiver le matériel AES, utilisez les drapeaux suivants:

-XX:-UseAES -XX:-UseAESIntrinsics

Mais cela n'indique pas si les intrinsèques AES sont activés par défaut (pour les processeurs qui le prennent en charge). La question est donc simple: si le processeur prend en charge AES-NI, les intrinsèques AES sont-ils utilisés?

Question bonus: existe-t-il un moyen de tester si AES-NI est utilisé? Je suppose que vous pouvez deviner en fonction des performances, mais ce n'est pas un moyen de test optimal ou sûr.


Pour les lecteurs qui ne sont pas familiers avec les intrinsèques AES-NI: il remplace le code octet par du code machine précompilé, en utilisant le jeu d'instructions AES-NI. Cela se produit par la JVM, donc il n'apparaît pas dans l'API du runtime ou du bytecode Java.

31
Maarten Bodewes

Le drapeau a une valeur par défaut true et il sera défini sur false si la détection échoue, vous pouvez donc simplement utiliser + PrintFlagsFinal pour voir s'il est utilisé:

Mon ordinateur portable sans AES-NI:

C:\>"C:\Program Files\Java\jdk1.7.0_51\bin\Java" -XX:+PrintFlagsFinal -version | find "UseAES"
     bool UseAES                                    = false           {product}
     bool UseAESIntrinsics                          = false           {product}
Java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

Idem sur le bureau avec AES-NI:

C:\>"C:\Program Files\Java\jdk7\bin\Java" -XX:+PrintFlagsFinal -version | find "AES"
     bool UseAES                                    = true            {product}
     bool UseAESIntrinsics                          = true            {product}

Java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

C:\>"C:\Program Files (x86)\Java\jre7\bin\Java" -XX:+PrintFlagsFinal -version | find "AES"
     bool UseAES                                    = true            {product}
     bool UseAESIntrinsics                          = true            {product}

Java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing)

Donc, cela fonctionne à la fois pour x64 et i686 (WOW64) avec la récente Java 7. La fonctionnalité a été introduite avec https://bugs.openjdk.Java.net/browse/JDK-7184394 et rétroporté à 7u40 et 7u45.


Important: AES-NI peut uniquement être disponible sur la machine virtuelle du serveur .

Cela a été reconnu par Oracle après n rapport de bogue a été déposé . Cette information vitale manquait quand ils ont créé la liste des featues de Java 8 où elle a été introduite (elle a ensuite été rétroportée à 7 également). Le serveur VM peut être choisi explicitement en fournissant l'option -server Sur la ligne de commande Java ou javaw.

32
eckes

Impossible de commenter (stupide SO règles de plus de 50 crédits requis!). Ce mailthread de openjdk dit, tous les intrinsèques AES sont activés par défaut. Bien que je sois Je ne sais pas quelle part du noyau Oracle VM partage avec openjdk. Si vous lisez le fil entier, ils discutent également des défis sur les machines virtuelles 32 bits, ce qui explique probablement votre problème avec votre deuxième test courir.

  • En ce qui concerne votre test (désolé, je ne peux pas commenter), ne pensez-vous pas que les différences dans les processeurs font une grande différence? Les Core i7 sont quadcore et ont de meilleures vitesses d'horloge en général. Cela n'aurait-il pas fait de différence? Je suppose que le passage de 21s (core i5, 32bitVM, AES-NI off) à 8s (core i7, 64bitVM, AES-NI off) est la différence entre i5 et i7.
  • L'amélioration de 8s à 3s, bien que non 7 fois, vaut en effet un 'Yipes'! :)
  • En ce qui concerne le mécanisme de détection - il ne semble pas y avoir de méthode simple. JVM envoie un avertissement "Intrinsèques AES non disponibles sur cette CPU" si vous avez activé les drapeaux et si elle ne trouve pas de support AES - selon ce rapport de bogue .
4
user30622