Przeglądaj źródła

serial/types: Add blake2b_simd support.

parazyd 2 lat temu
rodzic
commit
dd49c947a1
2 zmienionych plików z 41 dodań i 8 usunięć
  1. 2 1
      src/serial/Cargo.toml
  2. 39 7
      src/serial/src/types/hash.rs

+ 2 - 1
src/serial/Cargo.toml

@@ -14,6 +14,7 @@ futures-lite = {version = "1.13.0", optional = true}
 async-trait = {version = "0.1.73", optional = true}
 
 # Supported types for encoding
+blake2b_simd = {version = "1.0.1", optional = true}
 blake3 = {version = "1.4.1", optional = true}
 bridgetree = {version = "0.3.0", optional = true}
 pasta_curves = {version = "0.5.1", optional = true}
@@ -28,4 +29,4 @@ async = ["futures-lite", "async-trait", "darkfi-derive/async"]
 
 collections = []
 crypto = ["collections", "hash", "bridgetree", "pasta_curves"]
-hash = ["blake3"]
+hash = ["blake2b_simd", "blake3"]

+ 39 - 7
src/serial/src/types/hash.rs

@@ -21,20 +21,52 @@ use std::io::{Read, Result, Write};
 #[cfg(feature = "async")]
 use crate::{
     async_lib::{AsyncReadExt, AsyncWriteExt},
-    AsyncDecodable, AsyncEncodable,
+    async_trait, AsyncDecodable, AsyncEncodable, AsyncRead, AsyncWrite,
 };
-#[cfg(feature = "async")]
-use async_trait::async_trait;
-#[cfg(feature = "async")]
-use futures_lite::{AsyncRead, AsyncWrite};
 
 use crate::{Decodable, Encodable, ReadExt, WriteExt};
 
+#[cfg(feature = "blake2b_simd")]
+impl Encodable for blake2b_simd::Hash {
+    fn encode<S: Write>(&self, mut s: S) -> Result<usize> {
+        s.write_slice(self.as_bytes())?;
+        Ok(blake2b_simd::OUTBYTES)
+    }
+}
+
+#[cfg(all(feature = "blake2b_simd", feature = "async"))]
+#[async_trait]
+impl AsyncEncodable for blake2b_simd::Hash {
+    async fn encode_async<S: AsyncWrite + Unpin + Send>(&self, s: &mut S) -> Result<usize> {
+        s.write_slice_async(self.as_bytes()).await?;
+        Ok(blake2b_simd::OUTBYTES)
+    }
+}
+
+#[cfg(feature = "blake2b_simd")]
+impl Decodable for blake2b_simd::Hash {
+    fn decode<D: Read>(mut d: D) -> Result<Self> {
+        let mut bytes = [0u8; blake2b_simd::OUTBYTES];
+        d.read_slice(&mut bytes)?;
+        Ok(bytes.into())
+    }
+}
+
+#[cfg(all(feature = "blake2b_simd", feature = "async"))]
+#[async_trait]
+impl AsyncDecodable for blake2b_simd::Hash {
+    async fn decode_async<D: AsyncRead + Unpin + Send>(d: &mut D) -> Result<Self> {
+        let mut bytes = [0u8; blake2b_simd::OUTBYTES];
+        d.read_slice_async(&mut bytes).await?;
+        Ok(bytes.into())
+    }
+}
+
 #[cfg(feature = "blake3")]
 impl Encodable for blake3::Hash {
     fn encode<S: Write>(&self, mut s: S) -> Result<usize> {
         s.write_slice(self.as_bytes())?;
-        Ok(32)
+        Ok(blake3::OUT_LEN)
     }
 }
 
@@ -50,7 +82,7 @@ impl AsyncEncodable for blake3::Hash {
 #[cfg(feature = "blake3")]
 impl Decodable for blake3::Hash {
     fn decode<D: Read>(mut d: D) -> Result<Self> {
-        let mut bytes = [0u8; 32];
+        let mut bytes = [0u8; blake3::OUT_LEN];
         d.read_slice(&mut bytes)?;
         Ok(bytes.into())
     }