feat: impl Blake2 algo & reduce more boilerplate

* Expands the `impl_hash_algo!` macro to implement required methods in
  the Crypto struct for each CryptoAlgo
* Adds Blake2 hashers (Blake2s256 & Blake2b512)
This commit is contained in:
Erica Marigold 2023-10-15 03:25:43 -07:00
parent eedf6534fb
commit 8cafaed68e
No known key found for this signature in database
GPG key ID: 2768CC0C23D245D1
4 changed files with 59 additions and 53 deletions

18
Cargo.lock generated
View file

@ -204,6 +204,15 @@ version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
[[package]]
name = "blake2"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
dependencies = [
"digest",
]
[[package]] [[package]]
name = "blake2b_simd" name = "blake2b_simd"
version = "0.5.11" version = "0.5.11"
@ -520,6 +529,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [ dependencies = [
"block-buffer", "block-buffer",
"crypto-common", "crypto-common",
"subtle",
] ]
[[package]] [[package]]
@ -1120,6 +1130,7 @@ dependencies = [
"async-compression", "async-compression",
"async-trait", "async-trait",
"base64 0.21.4", "base64 0.21.4",
"blake2",
"chrono", "chrono",
"chrono_lc", "chrono_lc",
"clap", "clap",
@ -1142,6 +1153,7 @@ dependencies = [
"num-traits", "num-traits",
"once_cell", "once_cell",
"os_str_bytes", "os_str_bytes",
"paste",
"path-clean", "path-clean",
"pin-project", "pin-project",
"rand", "rand",
@ -2236,6 +2248,12 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "subtle"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.109" version = "1.0.109"

View file

@ -98,12 +98,17 @@ serde_json = { version = "1.0", features = ["preserve_order"] }
serde_yaml = "0.9" serde_yaml = "0.9"
toml = { version = "0.8", features = ["preserve_order"] } toml = { version = "0.8", features = ["preserve_order"] }
paste = "1.0.14"
base64 = "0.21.4" base64 = "0.21.4"
hex = "0.4.3" hex = "0.4.3"
digest = "0.10.7"
md-5 = "0.10.6" md-5 = "0.10.6"
sha1 = "0.10.6" sha1 = "0.10.6"
sha2 = "0.10.8" sha2 = "0.10.8"
digest = { version = "0.10.7", default-features = true } blake2 = "0.10.6"
### NET ### NET

View file

@ -40,15 +40,35 @@ macro_rules! impl_hash_algo {
} }
} }
} }
impl Crypto {
$(
paste::item! {
pub fn [<$algo:lower>]<T: ToString>(content: Option<T>) -> Self {
let constructed = Self {
algo: Arc::new(Mutex::new(CryptoAlgo::$algo(Box::new($Type::new())))),
};
match content {
Some(inner) => constructed.update(inner.to_string()).clone(),
None => constructed,
}
}
}
)*
}
} }
} }
// enum CryptoAlgo // Macro call creates the CryptoAlgo enum and implementations for it
// It also adds a method corresponding to the enum in the `Crypto` struct
impl_hash_algo! { impl_hash_algo! {
Sha1 => sha1::Sha1, Sha1 => sha1::Sha1,
Sha256 => sha2::Sha256, Sha256 => sha2::Sha256,
Sha512 => sha2::Sha512, Sha512 => sha2::Sha512,
Md5 => md5::Md5 Md5 => md5::Md5,
Blake2s256 => blake2::Blake2s256,
Blake2b512 => blake2::Blake2b512
} }
#[derive(Clone)] #[derive(Clone)]
@ -101,62 +121,19 @@ impl FromLua<'_> for EncodingKind {
} }
} }
impl Crypto { trait CryptoResult {
pub fn sha1<T: ToString>(content: Option<T>) -> Crypto { fn update(&self, content: impl AsRef<[u8]>) -> &Self;
let constructed = Self { fn digest(&self, encoding: EncodingKind) -> Result<String>;
algo: Arc::new(Mutex::new(CryptoAlgo::Sha1(Box::new(sha1::Sha1::new())))), }
};
match content { impl CryptoResult for Crypto {
Some(inner) => constructed.update(inner.to_string()).clone(), fn update(&self, content: impl AsRef<[u8]>) -> &Crypto {
None => constructed,
}
}
pub fn sha256<T: ToString>(content: Option<T>) -> Crypto {
let constructed = Self {
algo: Arc::new(Mutex::new(CryptoAlgo::Sha256(
Box::new(sha2::Sha256::new()),
))),
};
match content {
Some(inner) => constructed.update(inner.to_string()).clone(),
None => constructed,
}
}
pub fn sha512<T: ToString>(content: Option<T>) -> Crypto {
let constructed = Self {
algo: Arc::new(Mutex::new(CryptoAlgo::Sha512(
Box::new(sha2::Sha512::new()),
))),
};
match content {
Some(inner) => constructed.update(inner.to_string()).clone(),
None => constructed,
}
}
pub fn md5<T: ToString>(content: Option<T>) -> Crypto {
let constructed = Self {
algo: Arc::new(Mutex::new(CryptoAlgo::Md5(Box::new(md5::Md5::new())))),
};
match content {
Some(inner) => constructed.update(inner.to_string()).clone(),
None => constructed,
}
}
pub fn update(&self, content: impl AsRef<[u8]>) -> &Crypto {
(self.algo.lock().unwrap()).update(content); (self.algo.lock().unwrap()).update(content);
self self
} }
pub fn digest(&self, encoding: EncodingKind) -> Result<String> { fn digest(&self, encoding: EncodingKind) -> Result<String> {
(*self.algo.lock().unwrap()).digest(encoding) (*self.algo.lock().unwrap()).digest(encoding)
} }
} }

View file

@ -29,6 +29,12 @@ pub fn create(lua: &'static Lua) -> LuaResult<LuaTable> {
Ok(Crypto::sha512(content)) Ok(Crypto::sha512(content))
})? })?
.with_function("md5", |_, content: Option<String>| Ok(Crypto::md5(content)))? .with_function("md5", |_, content: Option<String>| Ok(Crypto::md5(content)))?
.with_function("blake2s256", |_, content: Option<String>| {
Ok(Crypto::blake2s256(content))
})?
.with_function("blake2b512", |_, content: Option<String>| {
Ok(Crypto::blake2b512(content))
})?
.build()?, .build()?,
)? )?
.build_readonly() .build_readonly()