Unverified Commit 47519394 authored by Steven Fackler's avatar Steven Fackler Committed by GitHub
Browse files

Merge pull request #1392 from crab2313/EVP_digestname

Support EVP_get_digestbyname binding
parents 74f380ec 98fb96bb
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
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<MessageDigest> {
        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()
        )
    }
}