Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add common hash sizes From impls #28

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

parazyd
Copy link

@parazyd parazyd commented Aug 28, 2023

blake2s:
* From<[u8; 16]>

blake2b:
* From<[u8; 16]>
* From<[u8; 32]>

Both introduce an intermediate buffer in the implementation, but this is a small tradeoff that allows usage of some common hash sizes more idiomatically for the users of this library.

blake2s:
    * From<[u8; 16]>

blake2b:
    * From<[u8; 16]>
    * From<[u8; 32]>

Both introduce an intermediate buffer in the implementation, but
this is a small tradeoff that allows usage of some common hash
sizes more idiomatically for the users of this library.
@parazyd
Copy link
Author

parazyd commented Feb 10, 2025

@oconnor663 Any plans to check this out?

@oconnor663
Copy link
Owner

Thanks, this looks like a good idea. What would you think about doing it generically, something like this:

diff --git a/blake2b/src/lib.rs b/blake2b/src/lib.rs
index 6c4f92f..aa58385 100644
--- a/blake2b/src/lib.rs
+++ b/blake2b/src/lib.rs
@@ -616,17 +616,20 @@ fn bytes_to_hex(bytes: &[u8]) -> HexString {
     s
 }
 
-impl From<[u8; OUTBYTES]> for Hash {
-    fn from(bytes: [u8; OUTBYTES]) -> Self {
+impl<const N: usize> From<[u8; N]> for Hash {
+    fn from(bytes: [u8; N]) -> Self {
+        assert!(N <= OUTBYTES, "Hash is at most {OUTBYTES} bytes");
+        let mut buf = [0u8; OUTBYTES];
+        buf[0..N].copy_from_slice(&bytes);
         Self {
-            bytes,
-            len: OUTBYTES as u8,
+            bytes: buf,
+            len: N as u8,
         }
     }
 }
 
-impl From<&[u8; OUTBYTES]> for Hash {
-    fn from(bytes: &[u8; OUTBYTES]) -> Self {
+impl<const N: usize> From<&[u8; N]> for Hash {
+    fn from(bytes: &[u8; N]) -> Self {
         Self::from(*bytes)
     }
 }
diff --git a/blake2s/src/lib.rs b/blake2s/src/lib.rs
index f845e96..c2852b4 100644
--- a/blake2s/src/lib.rs
+++ b/blake2s/src/lib.rs
@@ -608,17 +608,20 @@ fn bytes_to_hex(bytes: &[u8]) -> HexString {
     s
 }
 
-impl From<[u8; OUTBYTES]> for Hash {
-    fn from(bytes: [u8; OUTBYTES]) -> Self {
+impl<const N: usize> From<[u8; N]> for Hash {
+    fn from(bytes: [u8; N]) -> Self {
+        assert!(N <= OUTBYTES, "Hash is at most {OUTBYTES} bytes");
+        let mut buf = [0u8; OUTBYTES];
+        buf[0..N].copy_from_slice(&bytes);
         Self {
-            bytes,
-            len: OUTBYTES as u8,
+            bytes: buf,
+            len: N as u8,
         }
     }
 }
 
-impl From<&[u8; OUTBYTES]> for Hash {
-    fn from(bytes: &[u8; OUTBYTES]) -> Self {
+impl<const N: usize> From<&[u8; N]> for Hash {
+    fn from(bytes: &[u8; N]) -> Self {
         Self::from(*bytes)
     }
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants