You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuweni.apache.org by to...@apache.org on 2019/12/16 08:38:54 UTC
[incubator-tuweni] 02/02: Fix TUWENI-30: expose key for GenericHash
This is an automated email from the ASF dual-hosted git repository.
toulmean pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git
commit 528fd0bae7cce6bbd3be42f3cc3f7e0540f61d32
Author: Antoine Toulme <an...@lunar-ocean.com>
AuthorDate: Mon Dec 16 00:38:41 2019 -0800
Fix TUWENI-30: expose key for GenericHash
---
.../apache/tuweni/crypto/sodium/GenericHash.java | 120 +++++++++++++++++++++
.../tuweni/crypto/sodium/GenericHashTest.java | 7 ++
2 files changed, 127 insertions(+)
diff --git a/crypto/src/main/java/org/apache/tuweni/crypto/sodium/GenericHash.java b/crypto/src/main/java/org/apache/tuweni/crypto/sodium/GenericHash.java
index b37003f..84a32cd 100644
--- a/crypto/src/main/java/org/apache/tuweni/crypto/sodium/GenericHash.java
+++ b/crypto/src/main/java/org/apache/tuweni/crypto/sodium/GenericHash.java
@@ -128,6 +128,106 @@ public final class GenericHash {
}
/**
+ * Key of generic hash function.
+ */
+ public static final class Key implements Destroyable {
+ private final Allocated value;
+
+ private Key(Pointer ptr, int length) {
+ this.value = new Allocated(ptr, length);
+ }
+
+ @Override
+ public void destroy() {
+ value.destroy();
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return value.isDestroyed();
+ }
+
+ /**
+ *
+ * @return the length of the key
+ */
+ public int length() {
+ return value.length();
+ }
+
+ /**
+ * Create a {@link GenericHash.Key} from a pointer.
+ *
+ * @param allocated the allocated pointer
+ * @return A key.
+ */
+ public static Key fromPointer(Allocated allocated) {
+ return new Key(Sodium.dup(allocated.pointer(), allocated.length()), allocated.length());
+ }
+
+ /**
+ * Create a {@link GenericHash.Key} from a hash.
+ *
+ * @param hash the hash
+ * @return A key.
+ */
+ public static Key fromHash(Hash hash) {
+ return new Key(Sodium.dup(hash.value.pointer(), hash.value.length()), hash.value.length());
+ }
+
+ /**
+ * Create a {@link GenericHash.Key} from an array of bytes.
+ *
+ * @param bytes The bytes for the key.
+ * @return A key.
+ */
+ public static Key fromBytes(Bytes bytes) {
+ return fromBytes(bytes.toArrayUnsafe());
+ }
+
+ /**
+ * Create a {@link GenericHash.Key} from an array of bytes.
+ *
+ * @param bytes The bytes for the key.
+ * @return A key.
+ */
+ public static Key fromBytes(byte[] bytes) {
+ return Sodium.dup(bytes, GenericHash.Key::new);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof GenericHash.Key)) {
+ return false;
+ }
+ Key other = (Key) obj;
+ return other.value.equals(value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(value);
+ }
+
+ /**
+ * @return The bytes of this key.
+ */
+ public Bytes bytes() {
+ return value.bytes();
+ }
+
+ /**
+ * @return The bytes of this key.
+ */
+ public byte[] bytesArray() {
+ return value.bytesArray();
+ }
+ }
+
+ /**
* Generic hash function output.
*/
public static final class Hash implements Destroyable {
@@ -210,4 +310,24 @@ public final class GenericHash {
Sodium.crypto_generichash(output, hashLength, input.value.pointer(), input.length(), null, 0);
return new Hash(output, hashLength);
}
+
+ /**
+ * Creates a generic hash of specified length of the input
+ *
+ * @param hashLength the length of the hash
+ * @param input the input of the hash function
+ * @param key the key of the hash function
+ * @return the hash of the input
+ */
+ public static Hash hash(int hashLength, Input input, Key key) {
+ Pointer output = Sodium.malloc(hashLength);
+ Sodium.crypto_generichash(
+ output,
+ hashLength,
+ input.value.pointer(),
+ input.length(),
+ key.value.pointer(),
+ key.length());
+ return new Hash(output, hashLength);
+ }
}
diff --git a/crypto/src/test/java/org/apache/tuweni/crypto/sodium/GenericHashTest.java b/crypto/src/test/java/org/apache/tuweni/crypto/sodium/GenericHashTest.java
index 9e5193e..489ce69 100644
--- a/crypto/src/test/java/org/apache/tuweni/crypto/sodium/GenericHashTest.java
+++ b/crypto/src/test/java/org/apache/tuweni/crypto/sodium/GenericHashTest.java
@@ -34,4 +34,11 @@ class GenericHashTest {
assertNotNull(output);
assertEquals(64, output.bytes().size());
}
+
+ @Test
+ void hashWithKeyValue() {
+ GenericHash.Hash output = GenericHash.hash(64, GenericHash.Input.fromBytes(Bytes.random(384)), GenericHash.Key.fromBytes(Bytes.random(32)));
+ assertNotNull(output);
+ assertEquals(64, output.bytes().size());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@tuweni.apache.org
For additional commands, e-mail: commits-help@tuweni.apache.org