diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/HashManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/HashManager.java new file mode 100644 index 000000000..03bfd064f --- /dev/null +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/HashManager.java @@ -0,0 +1,261 @@ +package org.jivesoftware.smackx.hash; + +import org.bouncycastle.jcajce.provider.digest.Blake2b; +import org.bouncycastle.jcajce.provider.digest.SHA224; +import org.bouncycastle.jcajce.provider.digest.SHA256; +import org.bouncycastle.jcajce.provider.digest.SHA3; +import org.bouncycastle.jcajce.provider.digest.SHA384; +import org.bouncycastle.jcajce.provider.digest.SHA512; +import org.jivesoftware.smack.Manager; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.util.MD5; +import org.jivesoftware.smack.util.SHA1; +import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.WeakHashMap; + +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.BLAKE2B256; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.BLAKE2B384; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.BLAKE2B512; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.SHA3_256; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.SHA3_384; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.SHA3_512; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.SHA_256; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.SHA_384; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.SHA_512; + +/** + * Manager that can be used to determine support for hash functions. + */ +public final class HashManager extends Manager { + public static final String NAMESPACE_V2 = "urn:xmpp:hashes:2"; + public static final String PREFIX_NS_ALGO = "urn:xmpp:hash-function-text-names:"; + + public static final List RECOMMENDED = Collections.unmodifiableList(Arrays.asList( + SHA_256, SHA_384, SHA_512, + SHA3_256, SHA3_384, SHA3_512, + BLAKE2B256, BLAKE2B384, BLAKE2B512)); + + private static final WeakHashMap INSTANCES = new WeakHashMap<>(); + + /** + * Constructor of the HashManager. + * By default the Manager announces support for XEP-0300, as well as for the RECOMMENDED set of hash algorithms. + * Those contain SHA256, SHA384, SHA512, SHA3-256, SHA3-384, SHA3-512, BLAKE2B256, BLAKE2B384 and BLAKE2B512. + * Those algorithms got recommended here: https://xmpp.org/extensions/xep-0300.html#recommendations + * @param connection connection + */ + private HashManager(XMPPConnection connection) { + super(connection); + ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); + sdm.addFeature(NAMESPACE_V2); + addAlgorithmsToFeatures(RECOMMENDED); + } + + /** + * Announce support for the given list of algorithms. + * @param algorithms + */ + public void addAlgorithmsToFeatures(List algorithms) { + ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection()); + for (ALGORITHM algo : algorithms) { + sdm.addFeature(asFeature(algo)); + } + } + + /** + * Get an instance of the HashManager for the given connection. + * @param connection + * @return + */ + public HashManager getInstanceFor(XMPPConnection connection) { + HashManager hashManager = INSTANCES.get(connection); + if (hashManager == null) { + hashManager = new HashManager(connection); + INSTANCES.put(connection, hashManager); + } + return hashManager; + } + + /** + * Return the feature name of the given algorithm. + * @param algorithm eg. 'SHA_1' + * @return feature name (eg. urn:xmpp:hash-function-text-names:sha-1') + */ + public static String asFeature(ALGORITHM algorithm) { + return PREFIX_NS_ALGO + algorithm.toString(); + } + + public enum ALGORITHM { // RECOMMENDATION: + MD5 ("md5"), // MUST NOT use this + SHA_1 ("sha-1"), // SHOULD NOT use this + SHA_224 ("sha-224"), + SHA_256 ("sha-256"), // MUST use this + SHA_384 ("sha-384"), + SHA_512 ("sha-512"), // SHOULD use this + SHA3_224 ("sha3-224"), + SHA3_256 ("sha3-256"), // MUST use this + SHA3_384 ("sha3-384"), + SHA3_512 ("sha3-512"), // SHOULD use this + BLAKE2B160("id-blake2b160"), + BLAKE2B256("id-blake2b256"), // MUST use this + BLAKE2B384("id-blake2b384"), + BLAKE2B512("id-blake2b512"); // SHOULD use this + + private final String name; + + ALGORITHM(String name) { + this.name = name; + } + + /** + * Return the name of the algorithm as it is used in the XEP. + * @return name. + */ + @Override + public String toString() { + return this.name; + } + + /** + * Compensational method for static 'valueOf' function + * @param s + * @return + */ + public static ALGORITHM valueOfName(String s) { + for (ALGORITHM a : ALGORITHM.values()) { + if (s.equals(a.toString())) { + return a; + } + } + throw new IllegalArgumentException("No ALGORITHM enum with this name (" + s + ") found."); + } + } + + /** + * Calculate the hash sum of data using algorithm. + * @param algorithm + * @param data + * @return + */ + public static byte[] hash(ALGORITHM algorithm, byte[] data) { + byte[] hash; + switch (algorithm) { + case MD5: + hash = md5(data); + break; + case SHA_1: + hash = sha_1(data); + break; + case SHA_224: + hash = sha_224(data); + break; + case SHA_256: + hash = sha_256(data); + break; + case SHA_384: + hash = sha_384(data); + break; + case SHA_512: + hash = sha_512(data); + break; + case SHA3_224: + hash = sha3_224(data); + break; + case SHA3_256: + hash = sha3_256(data); + break; + case SHA3_384: + hash = sha3_384(data); + break; + case SHA3_512: + hash = sha3_512(data); + break; + case BLAKE2B160: + hash = blake2b160(data); + break; + case BLAKE2B256: + hash = blake2b256(data); + break; + case BLAKE2B384: + hash = blake2b384(data); + break; + case BLAKE2B512: + hash = blake2b512(data); + break; + default: + throw new AssertionError("Invalid enum value."); + } + return hash; + } + + public static byte[] md5(byte[] data) { + return MD5.bytes(data); + } + + public static byte[] sha_1(byte[] data) { + return SHA1.bytes(data); + } + + public static byte[] sha_224(byte[] data) { + return new SHA224.Digest().digest(data); + } + + public static byte[] sha_256(byte[] data) { + return new SHA256.Digest().digest(data); + } + + public static byte[] sha_384(byte[] data) { + return new SHA384.Digest().digest(data); + } + + public static byte[] sha_512(byte[] data) { + return new SHA512.Digest().digest(data); + } + + public static byte[] sha3_224(byte[] data) { + return new SHA3.Digest224().digest(data); + } + + public static byte[] sha3_256(byte[] data) { + return new SHA3.Digest256().digest(data); + } + + public static byte[] sha3_384(byte[] data) { + return new SHA3.Digest384().digest(data); + } + + public static byte[] sha3_512(byte[] data) { + return new SHA3.Digest512().digest(data); + } + + public static byte[] blake2b160(byte[] data) { + return new Blake2b.Blake2b160().digest(data); + } + + public static byte[] blake2b256(byte[] data) { + return new Blake2b.Blake2b256().digest(data); + } + + public static byte[] blake2b384(byte[] data) { + return new Blake2b.Blake2b384().digest(data); + } + + public static byte[] blake2b512(byte[] data) { + return new Blake2b.Blake2b512().digest(data); + } + + /** + * Encode a byte array in HEX. + * @param hash + * @return + */ + public static String hex(byte[] hash) { + return new BigInteger(1, hash).toString(16); + } + +} diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/HashUtil.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/HashUtil.java deleted file mode 100644 index bf051e409..000000000 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/HashUtil.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * - * Copyright © 2017 Paul Schaub - * - * 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.smackx.hash; - -import org.bouncycastle.jcajce.provider.digest.Blake2b; -import org.bouncycastle.jcajce.provider.digest.SHA224; -import org.bouncycastle.jcajce.provider.digest.SHA256; -import org.bouncycastle.jcajce.provider.digest.SHA3; -import org.bouncycastle.jcajce.provider.digest.SHA384; -import org.bouncycastle.jcajce.provider.digest.SHA512; -import org.jivesoftware.smack.util.MD5; -import org.jivesoftware.smack.util.SHA1; - -import java.math.BigInteger; - -/** - * Class that provides hash functionality. - */ -public final class HashUtil { - - public enum ALGORITHM { - MD5 ("md5"), - SHA_1 ("sha-1"), - SHA_224 ("sha-224"), - SHA_256 ("sha-256"), - SHA_384 ("sha-384"), - SHA_512 ("sha-512"), - SHA3_224 ("sha3-224"), - SHA3_256 ("sha3-256"), - SHA3_384 ("sha3-384"), - SHA3_512 ("sha3-512"), - ID_BLAKE2B160 ("id-blake2b160"), - ID_BLAKE2B256 ("id-blake2b256"), - ID_BLAKE2B384 ("id-blake2b384"), - ID_BLAKE2B512 ("id-blake2b512"); - - private final String name; - - ALGORITHM(String name) { - this.name = name; - } - - @Override - public String toString() { - return this.name; - } - - public static ALGORITHM get(String s) { - for (ALGORITHM a : ALGORITHM.values()) { - if (s.equals(a.toString())) { - return a; - } - } - throw new IllegalArgumentException("No ALGORITHM enum with this name (" + s + ") found."); - } - } - - public static byte[] hash(ALGORITHM algorithm, byte[] data) { - byte[] hash; - switch (algorithm) { - case MD5: - hash = md5(data); - break; - case SHA_1: - hash = sha_1(data); - break; - case SHA_224: - hash = sha_224(data); - break; - case SHA_256: - hash = sha_256(data); - break; - case SHA_384: - hash = sha_384(data); - break; - case SHA_512: - hash = sha_512(data); - break; - case SHA3_224: - hash = sha3_224(data); - break; - case SHA3_256: - hash = sha3_256(data); - break; - case SHA3_384: - hash = sha3_384(data); - break; - case SHA3_512: - hash = sha3_512(data); - break; - case ID_BLAKE2B160: - hash = id_blake2b160(data); - break; - case ID_BLAKE2B256: - hash = id_blake2b256(data); - break; - case ID_BLAKE2B384: - hash = id_blake2b384(data); - break; - case ID_BLAKE2B512: - hash = id_blake2b512(data); - break; - default: - throw new AssertionError("Invalid enum value."); - } - return hash; - } - - public static byte[] md5(byte[] data) { - return MD5.bytes(data); - } - - public static byte[] sha_1(byte[] data) { - return SHA1.bytes(data); - } - - public static byte[] sha_224(byte[] data) { - return new SHA224.Digest().digest(data); - } - - public static byte[] sha_256(byte[] data) { - return new SHA256.Digest().digest(data); - } - - public static byte[] sha_384(byte[] data) { - return new SHA384.Digest().digest(data); - } - - public static byte[] sha_512(byte[] data) { - return new SHA512.Digest().digest(data); - } - - public static byte[] sha3_224(byte[] data) { - return new SHA3.Digest224().digest(data); - } - - public static byte[] sha3_256(byte[] data) { - return new SHA3.Digest256().digest(data); - } - - public static byte[] sha3_384(byte[] data) { - return new SHA3.Digest384().digest(data); - } - - public static byte[] sha3_512(byte[] data) { - return new SHA3.Digest512().digest(data); - } - - public static byte[] id_blake2b160(byte[] data) { - return new Blake2b.Blake2b160().digest(data); - } - - public static byte[] id_blake2b256(byte[] data) { - return new Blake2b.Blake2b256().digest(data); - } - - public static byte[] id_blake2b384(byte[] data) { - return new Blake2b.Blake2b384().digest(data); - } - - public static byte[] id_blake2b512(byte[] data) { - return new Blake2b.Blake2b512().digest(data); - } - - public static String hex(byte[] hash) { - return new BigInteger(1, hash).toString(16); - } -} diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/element/HashElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/element/HashElement.java index b9de53adc..732908fb1 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/element/HashElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/element/HashElement.java @@ -20,7 +20,7 @@ package org.jivesoftware.smackx.hash.element; import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smack.util.stringencoder.Base64; -import org.jivesoftware.smackx.hash.HashUtil; +import org.jivesoftware.smackx.hash.HashManager; import static org.jivesoftware.smack.util.Objects.requireNonNull; @@ -31,40 +31,66 @@ import static org.jivesoftware.smack.util.Objects.requireNonNull; */ public class HashElement implements ExtensionElement { - - public static final String ELEMENT = "hash"; - public static final String NAMESPACE = "urn:xmpp:hashes:2"; - public static final String ALGO = "algo"; + public static final String ATTR_ALGO = "algo"; - private final HashUtil.ALGORITHM algorithm; + private final HashManager.ALGORITHM algorithm; private final byte[] hash; private final String hashB64; - public HashElement(HashUtil.ALGORITHM type, byte[] hash) { - this.algorithm = requireNonNull(type); + /** + * Create a HashElement from pre-calculated values. + * @param algorithm The algorithm which was used. + * @param hash the checksum as byte array. + */ + public HashElement(HashManager.ALGORITHM algorithm, byte[] hash) { + this.algorithm = requireNonNull(algorithm); this.hash = requireNonNull(hash); hashB64 = Base64.encodeToString(hash); } - public HashElement(HashUtil.ALGORITHM type, String hashB64) { - this.algorithm = type; + /** + * Create a HashElement from pre-calculated values. + * @param algorithm the algorithm that was used. + * @param hashB64 the checksum in base 64. + */ + public HashElement(HashManager.ALGORITHM algorithm, String hashB64) { + this.algorithm = algorithm; this.hash = Base64.decode(hashB64); this.hashB64 = hashB64; } - public static HashElement fromData(HashUtil.ALGORITHM algorithm, byte[] data) { - return new HashElement(algorithm, HashUtil.hash(algorithm, data)); + /** + * Create a new HashElement that contains the hash sum calculated using 'algorithm' based on the data in 'data'. + * + * @param algorithm algorithm which will be used to calculate data's checksum. + * @param data data of which we will calculate the checksum. + * @return HashElement with the checksum of data. + */ + public static HashElement fromData(HashManager.ALGORITHM algorithm, byte[] data) { + return new HashElement(algorithm, HashManager.hash(algorithm, data)); } - public HashUtil.ALGORITHM getAlgorithm() { + /** + * Return the hash algorithm used in this HashElement. + * @return algorithm + */ + public HashManager.ALGORITHM getAlgorithm() { return algorithm; } + /** + * Return the checksum as a byte array. + * @return + */ public byte[] getHash() { return hash; } + /** + * Return the checksum as a base16 (hex) string. + * @return + */ public String getHashB64() { return hashB64; } @@ -77,7 +103,7 @@ public class HashElement implements ExtensionElement { @Override public CharSequence toXML() { XmlStringBuilder sb = new XmlStringBuilder(this); - sb.attribute(ALGO, algorithm.toString()); + sb.attribute(ATTR_ALGO, algorithm.toString()); sb.rightAngleBracket(); sb.append(hashB64); sb.closeElement(this); @@ -86,6 +112,6 @@ public class HashElement implements ExtensionElement { @Override public String getNamespace() { - return NAMESPACE; + return HashManager.NAMESPACE_V2; } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/provider/HashElementProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/provider/HashElementProvider.java index 5d22eae36..523c6e157 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/provider/HashElementProvider.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/hash/provider/HashElementProvider.java @@ -17,7 +17,7 @@ package org.jivesoftware.smackx.hash.provider; import org.jivesoftware.smack.provider.ExtensionElementProvider; -import org.jivesoftware.smackx.hash.HashUtil; +import org.jivesoftware.smackx.hash.HashManager; import org.jivesoftware.smackx.hash.element.HashElement; import org.xmlpull.v1.XmlPullParser; @@ -28,8 +28,8 @@ public class HashElementProvider extends ExtensionElementProvider { @Override public HashElement parse(XmlPullParser parser, int initialDepth) throws Exception { - String algo = parser.getAttributeValue(null, HashElement.ALGO); + String algo = parser.getAttributeValue(null, HashElement.ATTR_ALGO); String hashB64 = parser.nextText(); - return new HashElement(HashUtil.ALGORITHM.get(algo), hashB64); + return new HashElement(HashManager.ALGORITHM.valueOfName(algo), hashB64); } } diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashElementTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashElementTest.java index 1fae3e3f9..1548fbeab 100644 --- a/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashElementTest.java +++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashElementTest.java @@ -24,6 +24,8 @@ import org.jivesoftware.smackx.hash.provider.HashElementProvider; import org.junit.Test; import static junit.framework.TestCase.assertEquals; +import static org.jivesoftware.smackx.hash.HashManager.ALGORITHM.SHA_256; +import static org.junit.Assert.assertArrayEquals; /** * Test toXML and parse of HashElement and HashElementProvider. @@ -33,12 +35,15 @@ public class HashElementTest extends SmackTestSuite { @Test public void stanzaTest() throws Exception { String message = "Hello World!"; - HashElement element = HashElement.fromData(HashUtil.ALGORITHM.SHA_256, message.getBytes(StringUtils.UTF8)); + HashElement element = HashElement.fromData(SHA_256, message.getBytes(StringUtils.UTF8)); String expected = "f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk="; assertEquals(expected, element.toXML().toString()); HashElement parsed = new HashElementProvider().parse(TestUtils.getParser(expected)); assertEquals(expected, parsed.toXML().toString()); + assertEquals(SHA_256, parsed.getAlgorithm()); + assertEquals("f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=", parsed.getHashB64()); + assertArrayEquals(HashManager.sha_256(message.getBytes(StringUtils.UTF8)), parsed.getHash()); } } diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashTest.java new file mode 100644 index 000000000..ff2c0a6c8 --- /dev/null +++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashTest.java @@ -0,0 +1,172 @@ +/** + * + * Copyright 2014 Andriy Tsykholyas + * + * 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.smackx.hash; + +import org.jivesoftware.smack.test.util.SmackTestSuite; +import org.jivesoftware.smack.util.StringUtils; +import org.junit.Test; + +import java.io.UnsupportedEncodingException; + +import static junit.framework.TestCase.assertEquals; + +/** + * Test HashManager functionality. + * The test sums got calculated using 'echo "Hello World!" | {md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, + * sha3-224sum -l, sha3-256sum -l, sha3-384sum -l, sha3-512sum -l, b2sum -l 160, b2sum -l 256, b2sum -l 384, b2sum -l 512} + */ +public class HashTest extends SmackTestSuite { + + private static final String testString = "Hello World!"; + private static final String md5sum = "ed076287532e86365e841e92bfc50d8c"; + private static final String sha1sum = "2ef7bde608ce5404e97d5f042f95f89f1c232871"; + private static final String sha224sum = "4575bb4ec129df6380cedde6d71217fe0536f8ffc4e18bca530a7a1b"; + private static final String sha256sum = "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069"; + private static final String sha384sum = "bfd76c0ebbd006fee583410547c1887b0292be76d582d96c242d2a792723e3fd6fd061f9d5cfd13b8f961358e6adba4a"; + private static final String sha512sum = "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8"; + private static final String sha3_224sum = "716596afadfa17cd1cb35133829a02b03e4eed398ce029ce78a2161d"; + private static final String sha3_256sum = "d0e47486bbf4c16acac26f8b653592973c1362909f90262877089f9c8a4536af"; + private static final String sha3_384sum = "f324cbd421326a2abaedf6f395d1a51e189d4a71c755f531289e519f079b224664961e385afcc37da348bd859f34fd1c"; + private static final String sha3_512sum = "32400b5e89822de254e8d5d94252c52bdcb27a3562ca593e980364d9848b8041b98eabe16c1a6797484941d2376864a1b0e248b0f7af8b1555a778c336a5bf48"; + private static final String b2_160sum = "e7338d05e5aa2b5e4943389f9475fce2525b92f2"; + private static final String b2_256sum = "bf56c0728fd4e9cf64bfaf6dabab81554103298cdee5cc4d580433aa25e98b00"; + private static final String b2_384sum = "53fd759520545fe93270e61bac03b243b686af32ed39a4aa635555be47a89004851d6a13ece00d95b7bdf9910cb71071"; + private static final String b2_512sum = "54b113f499799d2f3c0711da174e3bc724737ad18f63feb286184f0597e1466436705d6c8e8c7d3d3b88f5a22e83496e0043c44a3c2b1700e0e02259f8ac468e"; + + private byte[] array() { + if(testArray == null) { + try { + testArray = testString.getBytes(StringUtils.UTF8); + } catch (UnsupportedEncodingException e) { + throw new AssertionError("UTF8 MUST be supported."); + } + } + return testArray; + } + + private byte[] testArray; + + @Test + public void hashTest() { + assertEquals(md5sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.MD5, array()))); + assertEquals(sha1sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA_1, array()))); + assertEquals(sha224sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA_224, array()))); + assertEquals(sha256sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA_256, array()))); + assertEquals(sha384sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA_384, array()))); + assertEquals(sha512sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA_512, array()))); + assertEquals(sha3_224sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA3_224, array()))); + assertEquals(sha3_256sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA3_256, array()))); + assertEquals(sha3_384sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA3_384, array()))); + assertEquals(sha3_512sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.SHA3_512, array()))); + assertEquals(b2_160sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.BLAKE2B160, array()))); + assertEquals(b2_256sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.BLAKE2B256, array()))); + assertEquals(b2_384sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.BLAKE2B384, array()))); + assertEquals(b2_512sum, HashManager.hex(HashManager.hash(HashManager.ALGORITHM.BLAKE2B512, array()))); + } + + @Test + public void md5Test() { + String actual = HashManager.hex(HashManager.md5(array())); + assertEquals(md5sum, actual); + } + + @Test + public void sha1Test() { + String actual = HashManager.hex(HashManager.sha_1(array())); + assertEquals(sha1sum, actual); + } + + @Test + public void sha224Test() { + String actual = HashManager.hex(HashManager.sha_224(array())); + assertEquals(sha224sum, actual); + } + + @Test + public void sha256Test() { + String actual = HashManager.hex(HashManager.sha_256(array())); + assertEquals(sha256sum, actual); + } + + @Test + public void sha384Test() { + String actual = HashManager.hex(HashManager.sha_384(array())); + assertEquals(sha384sum, actual); + } + + @Test + public void sha512Test() { + String actual = HashManager.hex(HashManager.sha_512(array())); + assertEquals(sha512sum, actual); + } + + @Test + public void sha3_224Test() { + String actual = HashManager.hex(HashManager.sha3_224(array())); + assertEquals(sha3_224sum, actual); + } + + @Test + public void sha3_256Test() { + String actual = HashManager.hex(HashManager.sha3_256(array())); + assertEquals(sha3_256sum, actual); + } + + @Test + public void sha3_384Test() { + String actual = HashManager.hex(HashManager.sha3_384(array())); + assertEquals(sha3_384sum, actual); + } + + @Test + public void sha3_512Test() { + String actual = HashManager.hex(HashManager.sha3_512(array())); + assertEquals(sha3_512sum, actual); + } + + @Test + public void blake2b160Test() { + String actual = HashManager.hex(HashManager.blake2b160(array())); + assertEquals(b2_160sum, actual); + } + + @Test + public void blake2b256Test() { + String actual = HashManager.hex(HashManager.blake2b256(array())); + assertEquals(b2_256sum, actual); + } + + @Test + public void blake2b384Test() { + String actual = HashManager.hex(HashManager.blake2b384(array())); + assertEquals(b2_384sum, actual); + } + + @Test + public void blake2b512Test() { + String actual = HashManager.hex(HashManager.blake2b512(array())); + assertEquals(b2_512sum, actual); + } + + @Test + public void asFeatureTest() { + assertEquals("urn:xmpp:hash-function-text-names:id-blake2b384", HashManager.asFeature(HashManager.ALGORITHM.BLAKE2B384)); + assertEquals("urn:xmpp:hash-function-text-names:md5", HashManager.asFeature(HashManager.ALGORITHM.MD5)); + assertEquals("urn:xmpp:hash-function-text-names:sha3-512", HashManager.asFeature(HashManager.ALGORITHM.SHA3_512)); + assertEquals("urn:xmpp:hash-function-text-names:sha-512", HashManager.asFeature(HashManager.ALGORITHM.SHA_512)); + } +} diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashUtilTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashUtilTest.java deleted file mode 100644 index bc8e2378e..000000000 --- a/smack-experimental/src/test/java/org/jivesoftware/smackx/hash/HashUtilTest.java +++ /dev/null @@ -1,158 +0,0 @@ -/** - * - * Copyright 2014 Andriy Tsykholyas - * - * 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.smackx.hash; - -import org.jivesoftware.smack.test.util.SmackTestSuite; -import org.jivesoftware.smack.util.StringUtils; -import org.junit.Test; - -import java.io.UnsupportedEncodingException; - -import static junit.framework.TestCase.assertEquals; - -/** - * Test HashUtil functionality. - */ -public class HashUtilTest extends SmackTestSuite { - - public static final String testString = "Hello World!"; - public static final String md5sum = "ed076287532e86365e841e92bfc50d8c"; - public static final String sha1sum = "2ef7bde608ce5404e97d5f042f95f89f1c232871"; - public static final String sha224sum = "4575bb4ec129df6380cedde6d71217fe0536f8ffc4e18bca530a7a1b"; - public static final String sha256sum = "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069"; - public static final String sha384sum = "bfd76c0ebbd006fee583410547c1887b0292be76d582d96c242d2a792723e3fd6fd061f9d5cfd13b8f961358e6adba4a"; - public static final String sha512sum = "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8"; - public static final String sha3_224sum = "716596afadfa17cd1cb35133829a02b03e4eed398ce029ce78a2161d"; - public static final String sha3_256sum = "d0e47486bbf4c16acac26f8b653592973c1362909f90262877089f9c8a4536af"; - public static final String sha3_384sum = "f324cbd421326a2abaedf6f395d1a51e189d4a71c755f531289e519f079b224664961e385afcc37da348bd859f34fd1c"; - public static final String sha3_512sum = "32400b5e89822de254e8d5d94252c52bdcb27a3562ca593e980364d9848b8041b98eabe16c1a6797484941d2376864a1b0e248b0f7af8b1555a778c336a5bf48"; - public static final String b2_160sum = "e7338d05e5aa2b5e4943389f9475fce2525b92f2"; - public static final String b2_256sum = "bf56c0728fd4e9cf64bfaf6dabab81554103298cdee5cc4d580433aa25e98b00"; - public static final String b2_384sum = "53fd759520545fe93270e61bac03b243b686af32ed39a4aa635555be47a89004851d6a13ece00d95b7bdf9910cb71071"; - public static final String b2_512sum = "54b113f499799d2f3c0711da174e3bc724737ad18f63feb286184f0597e1466436705d6c8e8c7d3d3b88f5a22e83496e0043c44a3c2b1700e0e02259f8ac468e"; - - private byte[] array() { - try { - return testString.getBytes(StringUtils.UTF8); - } catch (UnsupportedEncodingException e) { - throw new AssertionError("UTF8 MUST be supported."); - } - } - - @Test - public void hashTest() throws UnsupportedEncodingException { - byte[] b = testString.getBytes(StringUtils.UTF8); - assertEquals(md5sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.MD5, b))); - assertEquals(sha1sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA_1, b))); - assertEquals(sha224sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA_224, b))); - assertEquals(sha256sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA_256, b))); - assertEquals(sha384sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA_384, b))); - assertEquals(sha512sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA_512, b))); - assertEquals(sha3_224sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA3_224, b))); - assertEquals(sha3_256sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA3_256, b))); - assertEquals(sha3_384sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA3_384, b))); - assertEquals(sha3_512sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.SHA3_512, b))); - assertEquals(b2_160sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.ID_BLAKE2B160, b))); - assertEquals(b2_256sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.ID_BLAKE2B256, b))); - assertEquals(b2_384sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.ID_BLAKE2B384, b))); - assertEquals(b2_512sum, HashUtil.hex(HashUtil.hash(HashUtil.ALGORITHM.ID_BLAKE2B512, b))); - } - - @Test - public void md5Test() { - String actual = HashUtil.hex(HashUtil.md5(array())); - assertEquals(md5sum, actual); - } - - @Test - public void sha1Test() { - String actual = HashUtil.hex(HashUtil.sha_1(array())); - assertEquals(sha1sum, actual); - } - - @Test - public void sha224Test() { - String actual = HashUtil.hex(HashUtil.sha_224(array())); - assertEquals(sha224sum, actual); - } - - @Test - public void sha256Test() { - String actual = HashUtil.hex(HashUtil.sha_256(array())); - assertEquals(sha256sum, actual); - } - - @Test - public void sha384Test() { - String actual = HashUtil.hex(HashUtil.sha_384(array())); - assertEquals(sha384sum, actual); - } - - @Test - public void sha512Test() { - String actual = HashUtil.hex(HashUtil.sha_512(array())); - assertEquals(sha512sum, actual); - } - - @Test - public void sha3_224Test() { - String actual = HashUtil.hex(HashUtil.sha3_224(array())); - assertEquals(sha3_224sum, actual); - } - - @Test - public void sha3_256Test() { - String actual = HashUtil.hex(HashUtil.sha3_256(array())); - assertEquals(sha3_256sum, actual); - } - - @Test - public void sha3_384Test() { - String actual = HashUtil.hex(HashUtil.sha3_384(array())); - assertEquals(sha3_384sum, actual); - } - - @Test - public void sha3_512Test() { - String actual = HashUtil.hex(HashUtil.sha3_512(array())); - assertEquals(sha3_512sum, actual); - } - - @Test - public void id_blake2b160Test() { - String actual = HashUtil.hex(HashUtil.id_blake2b160(array())); - assertEquals(b2_160sum, actual); - } - - @Test - public void id_blake2b256Test() { - String actual = HashUtil.hex(HashUtil.id_blake2b256(array())); - assertEquals(b2_256sum, actual); - } - - @Test - public void id_blake2b384Test() { - String actual = HashUtil.hex(HashUtil.id_blake2b384(array())); - assertEquals(b2_384sum, actual); - } - - @Test - public void id_blake2b512Test() { - String actual = HashUtil.hex(HashUtil.id_blake2b512(array())); - assertEquals(b2_512sum, actual); - } -} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleContentFile.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleContentFile.java index 09938cbd4..92ef88852 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleContentFile.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleContentFile.java @@ -24,6 +24,8 @@ import org.jivesoftware.smack.packet.ExtensionElement; public class JingleContentFile implements ExtensionElement { public static final String ELEMENT = "file"; + + @Override public String getElementName() { return ELEMENT;