summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiu Wenbo <qiuwenbo@kylinos.com.cn>2020-12-16 11:54:55 +0800
committerQiu Wenbo <qiuwenbo@kylinos.com.cn>2020-12-17 16:39:08 +0800
commit4240381404d492cc49a85b3c04eab836db8969bc (patch)
treea888a9b2ade778e5809b7ec03d078c3136eac849
parent74f380ec534ac6b892fc07a4bf7e3c38fdf74048 (diff)
downloadrust-openssl-4240381404d492cc49a85b3c04eab836db8969bc.zip
Support EVP_get_digestbyname binding
-rw-r--r--openssl/src/hash.rs28
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()
+ )
+ }
}