diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/ByteUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/ByteUtils.java index c9f70f5c6..1e6b0ed99 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/ByteUtils.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/ByteUtils.java @@ -16,28 +16,7 @@ */ package org.jivesoftware.smack.util; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - public class ByteUtils { - - private static MessageDigest md5Digest; - - public synchronized static byte[] md5(byte[] data) { - if (md5Digest == null) { - try { - md5Digest = MessageDigest.getInstance(StringUtils.MD5); - } - catch (NoSuchAlgorithmException nsae) { - // Smack wont be able to function normally if this exception is thrown, wrap it into - // an ISE and make the user aware of the problem. - throw new IllegalStateException(nsae); - } - } - md5Digest.update(data); - return md5Digest.digest(); - } - public static byte[] concact(byte[] arrayOne, byte[] arrayTwo) { int combinedLength = arrayOne.length + arrayTwo.length; byte[] res = new byte[combinedLength]; diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/MD5.java b/smack-core/src/main/java/org/jivesoftware/smack/util/MD5.java new file mode 100644 index 000000000..6de0441ee --- /dev/null +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/MD5.java @@ -0,0 +1,56 @@ +/** + * + * Copyright © 2014 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smack.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MD5 { + + /** + * Used by the hash method. + */ + private static MessageDigest MD5_DIGEST; + + static { + try { + MD5_DIGEST = MessageDigest.getInstance(StringUtils.MD5); + } + catch (NoSuchAlgorithmException e) { + // Smack wont be able to function normally if this exception is thrown, wrap it into + // an ISE and make the user aware of the problem. + throw new IllegalStateException(e); + } + } + + public static synchronized byte[] bytes(byte[] bytes) { + return MD5_DIGEST.digest(bytes); + } + + public static byte[] bytes(String string) { + return bytes(StringUtils.toBytes(string)); + } + + public static String hex(byte[] bytes) { + return StringUtils.encodeHex(bytes(bytes)); + } + + public static String hex(String string) { + return hex(StringUtils.toBytes(string)); + } + +} diff --git a/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java b/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java index 7473829ff..309c25527 100644 --- a/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java +++ b/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java @@ -21,6 +21,7 @@ import javax.security.auth.callback.CallbackHandler; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.sasl.SASLMechanism; import org.jivesoftware.smack.util.ByteUtils; +import org.jivesoftware.smack.util.MD5; import org.jivesoftware.smack.util.StringUtils; public class SASLDigestMD5Mechanism extends SASLMechanism { @@ -124,12 +125,12 @@ public class SASLDigestMD5Mechanism extends SASLMechanism { throw new SmackException("nonce value not present in initial challenge"); } // RFC 2831 2.1.2.1 defines A1, A2, KD and response-value - byte[] a1FirstPart = ByteUtils.md5(toBytes(authenticationId + ':' + serviceName + ':' - + password)); + byte[] a1FirstPart = MD5.bytes(authenticationId + ':' + serviceName + ':' + + password); cnonce = StringUtils.randomString(32); byte[] a1 = ByteUtils.concact(a1FirstPart, toBytes(':' + nonce + ':' + cnonce)); digestUri = "xmpp/" + serviceName; - hex_hashed_a1 = StringUtils.encodeHex(ByteUtils.md5(a1)); + hex_hashed_a1 = StringUtils.encodeHex(MD5.bytes(a1)); String responseValue = calcResponse(DigestType.ClientResponse); // @formatter:off // See RFC 2831 2.1.2 digest-response @@ -189,7 +190,7 @@ public class SASLDigestMD5Mechanism extends SASLMechanism { } a2.append(':'); a2.append(digestUri); - String hex_hashed_a2 = StringUtils.encodeHex(ByteUtils.md5(toBytes(a2.toString()))); + String hex_hashed_a2 = StringUtils.encodeHex(MD5.bytes(a2.toString())); StringBuilder kd_argument = new StringBuilder(); kd_argument.append(hex_hashed_a1); @@ -203,7 +204,7 @@ public class SASLDigestMD5Mechanism extends SASLMechanism { kd_argument.append(QOP_VALUE); kd_argument.append(':'); kd_argument.append(hex_hashed_a2); - byte[] kd = ByteUtils.md5(toBytes(kd_argument.toString())); + byte[] kd = MD5.bytes(kd_argument.toString()); String responseValue = StringUtils.encodeHex(kd); return responseValue; }