8044659: Java SecureRandom on SPARC T4 much slower than on x86/Linux
Reviewed-by: mullan
Contributed-by: Bradford Wetmore <bradford.wetmore@oracle.com>
--- a/jdk/src/share/classes/sun/security/provider/SecureRandom.java Thu Jul 24 09:01:00 2014 -0700
+++ b/jdk/src/share/classes/sun/security/provider/SecureRandom.java Thu Jul 24 22:22:43 2014 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, 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
@@ -29,6 +29,7 @@
import java.security.MessageDigest;
import java.security.SecureRandomSpi;
import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
/**
* <p>This class provides a crytpographically strong pseudo-random number
@@ -94,9 +95,19 @@
*/
private void init(byte[] seed) {
try {
- digest = MessageDigest.getInstance("SHA");
- } catch (NoSuchAlgorithmException e) {
- throw new InternalError("internal error: SHA-1 not available.", e);
+ /*
+ * Use the local SUN implementation to avoid native
+ * performance overhead.
+ */
+ digest = MessageDigest.getInstance("SHA", "SUN");
+ } catch (NoSuchProviderException | NoSuchAlgorithmException e) {
+ // Fallback to any available.
+ try {
+ digest = MessageDigest.getInstance("SHA");
+ } catch (NoSuchAlgorithmException exc) {
+ throw new InternalError(
+ "internal error: SHA-1 not available.", exc);
+ }
}
if (seed != null) {
@@ -265,9 +276,19 @@
s.defaultReadObject ();
try {
- digest = MessageDigest.getInstance("SHA");
- } catch (NoSuchAlgorithmException e) {
- throw new InternalError("internal error: SHA-1 not available.", e);
+ /*
+ * Use the local SUN implementation to avoid native
+ * performance overhead.
+ */
+ digest = MessageDigest.getInstance("SHA", "SUN");
+ } catch (NoSuchProviderException | NoSuchAlgorithmException e) {
+ // Fallback to any available.
+ try {
+ digest = MessageDigest.getInstance("SHA");
+ } catch (NoSuchAlgorithmException exc) {
+ throw new InternalError(
+ "internal error: SHA-1 not available.", exc);
+ }
}
}
}