diff options
author | Qiu Wenbo <qiuwenbo@kylinos.com.cn> | 2020-12-16 11:54:55 +0800 |
---|---|---|
committer | Qiu Wenbo <qiuwenbo@kylinos.com.cn> | 2020-12-17 16:39:08 +0800 |
commit | 4240381404d492cc49a85b3c04eab836db8969bc (patch) | |
tree | a888a9b2ade778e5809b7ec03d078c3136eac849 | |
parent | 74f380ec534ac6b892fc07a4bf7e3c38fdf74048 (diff) | |
download | rust-openssl-4240381404d492cc49a85b3c04eab836db8969bc.zip |
Support EVP_get_digestbyname binding
-rw-r--r-- | openssl/src/hash.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/openssl/src/hash.rs b/openssl/src/hash.rs index 4f8fe376..26e14861 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,25 @@ 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<MessageDigest> { + #[cfg(not(ossl110))] + 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 +634,12 @@ mod tests { MessageDigest::sha256().as_ptr() ); } + + #[test] + fn from_name() { + assert_eq!( + MessageDigest::from_name("SHA256").unwrap().as_ptr(), + MessageDigest::sha256().as_ptr() + ) + } } |