use std::sync::OnceLock;
use native_ossl::cipher::CipherAlg;
use native_ossl::digest::DigestAlg;
macro_rules! cached_digest {
($fn_name:ident, $ossl_name:literal) => {
pub(super) fn $fn_name() -> Option<DigestAlg> {
static D: OnceLock<Option<DigestAlg>> = OnceLock::new();
D.get_or_init(|| DigestAlg::fetch($ossl_name, None).ok())
.as_ref()
.map(Clone::clone)
}
};
}
cached_digest!(sha1, c"SHA1");
cached_digest!(sha224, c"SHA2-224");
cached_digest!(sha256, c"SHA2-256");
cached_digest!(sha384, c"SHA2-384");
cached_digest!(sha512, c"SHA2-512");
cached_digest!(md5, c"MD5");
macro_rules! cached_cipher {
($fn_name:ident, $ossl_name:literal) => {
pub(super) fn $fn_name() -> Option<CipherAlg> {
static C: OnceLock<Option<CipherAlg>> = OnceLock::new();
C.get_or_init(|| CipherAlg::fetch($ossl_name, None).ok())
.as_ref()
.map(Clone::clone)
}
};
}
cached_cipher!(aes128_cbc, c"AES-128-CBC");
cached_cipher!(aes192_cbc, c"AES-192-CBC");
cached_cipher!(aes256_cbc, c"AES-256-CBC");
cached_cipher!(aes128_gcm, c"AES-128-GCM");
cached_cipher!(aes192_gcm, c"AES-192-GCM");
cached_cipher!(aes256_gcm, c"AES-256-GCM");
cached_cipher!(des3_cbc, c"DES-EDE3-CBC");
pub(super) fn digest_by_name(name: &std::ffi::CStr) -> Option<DigestAlg> {
match name.to_bytes() {
b"SHA1" => sha1(),
b"SHA2-224" => sha224(),
b"SHA2-256" => sha256(),
b"SHA2-384" => sha384(),
b"SHA2-512" => sha512(),
b"MD5" => md5(),
_ => None,
}
}
pub(super) fn digest_by_str(alg: &str) -> Option<DigestAlg> {
match alg {
"sha1" => sha1(),
"sha224" => sha224(),
"sha256" => sha256(),
"sha384" => sha384(),
"sha512" => sha512(),
"md5" => md5(),
_ => None,
}
}