diff --git a/openssl/src/hash.rs b/openssl/src/hash.rs index 4f8fe3762d1f929e043b8c4475efee4709633add..81c3ff3264bc9b542211b05457d443678ccaed1b 100644 --- a/openssl/src/hash.rs +++ b/openssl/src/hash.rs @@ -1,4 +1,5 @@ use ffi; +use std::ffi::CString; use std::fmt; use std::io; use std::io::prelude::*; @@ -46,6 +47,24 @@ impl MessageDigest { } } + /// Returns the `MessageDigest` corresponding to an algorithm name. + /// + /// This corresponds to [`EVP_get_digestbyname`]. + /// + /// [`EVP_get_digestbyname`]: https://www.openssl.org/docs/man1.1.0/crypto/EVP_DigestInit.html + pub fn from_name(name: &str) -> Option { + ffi::init(); + let name = CString::new(name).ok()?; + unsafe { + let ptr = ffi::EVP_get_digestbyname(name.as_ptr()); + if ptr.is_null() { + None + } else { + Some(MessageDigest(ptr)) + } + } + } + pub fn null() -> MessageDigest { unsafe { MessageDigest(ffi::EVP_md_null()) } } @@ -614,4 +633,12 @@ mod tests { MessageDigest::sha256().as_ptr() ); } + + #[test] + fn from_name() { + assert_eq!( + MessageDigest::from_name("SHA256").unwrap().as_ptr(), + MessageDigest::sha256().as_ptr() + ) + } }