aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/hash.rs
diff options
context:
space:
mode:
authorBenjamin Cheng <[email protected]>2018-06-02 10:56:31 -0400
committerBenjamin Cheng <[email protected]>2018-06-02 10:56:31 -0400
commitb1eb1224f50b6242f82cdeca7a876409c98e1d3a (patch)
tree4aad295a6847fb1bd2d54880cf5bcd4b7ec522f5 /openssl/src/hash.rs
parentAdd wrapper for SSL_CTX_set_psk_server_callback (diff)
parentMerge pull request #940 from CmdrMoozy/rsa_padding (diff)
downloadrust-openssl-b1eb1224f50b6242f82cdeca7a876409c98e1d3a.tar.xz
rust-openssl-b1eb1224f50b6242f82cdeca7a876409c98e1d3a.zip
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'openssl/src/hash.rs')
-rw-r--r--openssl/src/hash.rs64
1 files changed, 46 insertions, 18 deletions
diff --git a/openssl/src/hash.rs b/openssl/src/hash.rs
index 726ebe9c..dd4d136c 100644
--- a/openssl/src/hash.rs
+++ b/openssl/src/hash.rs
@@ -1,22 +1,44 @@
-use std::io::prelude::*;
+use ffi;
+use std::fmt;
use std::io;
+use std::io::prelude::*;
use std::ops::{Deref, DerefMut};
-use std::fmt;
-use ffi;
-#[cfg(ossl110)]
-use ffi::{EVP_MD_CTX_free, EVP_MD_CTX_new};
-#[cfg(any(ossl101, ossl102))]
-use ffi::{EVP_MD_CTX_create as EVP_MD_CTX_new, EVP_MD_CTX_destroy as EVP_MD_CTX_free};
-
-use {cvt, cvt_p};
use error::ErrorStack;
+use nid::Nid;
+use {cvt, cvt_p};
+
+cfg_if! {
+ if #[cfg(ossl110)] {
+ use ffi::{EVP_MD_CTX_free, EVP_MD_CTX_new};
+ } else {
+ use ffi::{EVP_MD_CTX_create as EVP_MD_CTX_new, EVP_MD_CTX_destroy as EVP_MD_CTX_free};
+ }
+}
#[derive(Copy, Clone)]
pub struct MessageDigest(*const ffi::EVP_MD);
impl MessageDigest {
- pub unsafe fn from_ptr(x: *const ffi::EVP_MD) -> Self { MessageDigest(x) }
+ pub unsafe fn from_ptr(x: *const ffi::EVP_MD) -> Self {
+ MessageDigest(x)
+ }
+
+ /// Returns the `MessageDigest` corresponding to an `Nid`.
+ ///
+ /// This corresponds to [`EVP_get_digestbynid`].
+ ///
+ /// [`EVP_get_digestbynid`]: https://www.openssl.org/docs/man1.1.0/crypto/EVP_DigestInit.html
+ pub fn from_nid(type_: Nid) -> Option<MessageDigest> {
+ unsafe {
+ let ptr = ffi::EVP_get_digestbynid(type_.as_raw());
+ if ptr.is_null() {
+ None
+ } else {
+ Some(MessageDigest(ptr))
+ }
+ }
+ }
pub fn md5() -> MessageDigest {
unsafe { MessageDigest(ffi::EVP_md5()) }
@@ -229,8 +251,8 @@ impl Drop for Hasher {
/// store the digest data.
#[derive(Copy)]
pub struct DigestBytes {
- buf: [u8; ffi::EVP_MAX_MD_SIZE as usize],
- len: usize,
+ pub(crate) buf: [u8; ffi::EVP_MAX_MD_SIZE as usize],
+ pub(crate) len: usize,
}
impl Clone for DigestBytes {
@@ -382,12 +404,10 @@ mod tests {
#[test]
fn test_sha256() {
- let tests = [
- (
- "616263",
- "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
- ),
- ];
+ let tests = [(
+ "616263",
+ "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
+ )];
for test in tests.iter() {
hash_test(MessageDigest::sha256(), test);
@@ -402,4 +422,12 @@ mod tests {
hash_test(MessageDigest::ripemd160(), test);
}
}
+
+ #[test]
+ fn from_nid() {
+ assert_eq!(
+ MessageDigest::from_nid(Nid::SHA256).unwrap().as_ptr(),
+ MessageDigest::sha256().as_ptr()
+ );
+ }
}