Author: markt Date: Tue Sep 9 09:36:48 2014 New Revision: 1623728 URL: http://svn.apache.org/r1623728 Log: Replace use of MessageDigest with ConcurrentMessageDigest
Modified: tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java Modified: tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java?rev=1623728&r1=1623727&r2=1623728&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java (original) +++ tomcat/trunk/java/org/apache/catalina/realm/RealmBase.java Tue Sep 9 09:36:48 2014 @@ -104,7 +104,10 @@ public abstract class RealmBase extends /** * The MessageDigest object for digesting user credentials (passwords). + * + * @deprecated Unused. Will be removed in Tomcat 9.0.x onwards. */ + @Deprecated protected volatile MessageDigest md = null; @@ -509,12 +512,8 @@ public abstract class RealmBase extends // Server is storing digested passwords with a prefix indicating // the digest type String serverDigest = serverCredentials.substring(5); - String userDigest; - synchronized (this) { - md.reset(); - md.update(userCredentials.getBytes(StandardCharsets.ISO_8859_1)); - userDigest = Base64.encodeBase64String(md.digest()); - } + String userDigest = Base64.encodeBase64String(ConcurrentMessageDigest.digest( + getDigest(), userCredentials.getBytes(StandardCharsets.ISO_8859_1))); return userDigest.equals(serverDigest); } else if (serverCredentials.startsWith("{SSHA}")) { @@ -531,19 +530,16 @@ public abstract class RealmBase extends byte[] serverDigestBytes = new byte[saltPos]; System.arraycopy(serverDigestPlusSaltBytes, 0, serverDigestBytes, 0, saltPos); + final int saltLength = serverDigestPlusSaltBytes.length - saltPos; + byte[] serverSaltBytes = new byte[saltLength]; + System.arraycopy(serverDigestPlusSaltBytes, saltPos, + serverSaltBytes, 0, saltLength); // Generate the digested form of the user provided password // using the salt - byte[] userDigestBytes; - synchronized (this) { - md.reset(); - // User provided password - md.update(userCredentials.getBytes(StandardCharsets.ISO_8859_1)); - // Add the salt - md.update(serverDigestPlusSaltBytes, saltPos, - serverDigestPlusSaltBytes.length - saltPos); - userDigestBytes = md.digest(); - } + byte[] userDigestBytes = ConcurrentMessageDigest.digest(getDigest(), + userCredentials.getBytes(StandardCharsets.ISO_8859_1), + serverSaltBytes); return Arrays.equals(userDigestBytes, serverDigestBytes); @@ -1120,13 +1116,16 @@ public abstract class RealmBase extends protected void startInternal() throws LifecycleException { // Create a MessageDigest instance for credentials, if desired - if (digest != null) { + + if (getDigest() != null) { try { - md = MessageDigest.getInstance(digest); + md = MessageDigest.getInstance(getDigest()); + ConcurrentMessageDigest.init(getDigest()); } catch (NoSuchAlgorithmException e) { throw new LifecycleException - (sm.getString("realmBase.algorithm", digest), e); + (sm.getString("realmBase.algorithm", getDigest()), e); } + } setState(LifecycleState.STARTING); @@ -1183,8 +1182,6 @@ public abstract class RealmBase extends // Digest the user credentials and return as hexadecimal synchronized (this) { try { - md.reset(); - byte[] bytes = null; try { bytes = credentials.getBytes(getDigestCharset()); @@ -1192,9 +1189,8 @@ public abstract class RealmBase extends log.error("Illegal digestEncoding: " + getDigestEncoding(), uee); throw new IllegalArgumentException(uee.getMessage()); } - md.update(bytes); - return (HexUtils.toHexString(md.digest())); + return (HexUtils.toHexString(ConcurrentMessageDigest.digest(getDigest(), bytes))); } catch (Exception e) { log.error(sm.getString("realmBase.digest"), e); return (credentials); @@ -1204,7 +1200,7 @@ public abstract class RealmBase extends } protected boolean hasMessageDigest() { - return !(md == null); + return !(getDigest() == null && getDigest().length() > 0); } /** --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org