Skip to content

Commit d6dfbd2

Browse files
committed
allow conversion from MessageDigest to Md
This eases porting from legacy const EVP_MD to dynamic EVP_MD, especially in codebases that need to support boringssl/libressl in addition to OpenSSL 3
1 parent 30179f6 commit d6dfbd2

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

openssl/src/md.rs

+6
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ pub struct Md(Inner);
7676
unsafe impl Sync for Md {}
7777
unsafe impl Send for Md {}
7878

79+
impl From<crate::hash::MessageDigest> for Md {
80+
fn from(value: crate::hash::MessageDigest) -> Self {
81+
unsafe { Md::from_ptr(value.as_ptr() as *mut _) }
82+
}
83+
}
84+
7985
impl Md {
8086
/// Returns the `Md` corresponding to an [`Nid`].
8187
#[corresponds(EVP_get_digestbynid)]

openssl/src/md_ctx.rs

+18
Original file line numberDiff line numberDiff line change
@@ -549,4 +549,22 @@ mod test {
549549
// Validate result of digest of "World"
550550
assert_eq!(reset_result, world_expected);
551551
}
552+
553+
#[test]
554+
fn from_message_digest() {
555+
let messagedigest = crate::hash::MessageDigest::from_name("sha256").unwrap();
556+
let md = Md::from(messagedigest);
557+
let mut ctx = MdCtx::new().unwrap();
558+
ctx.digest_init(&md).unwrap();
559+
ctx.digest_update(b"test").unwrap();
560+
let mut digest = [0; 32];
561+
ctx.digest_final(digest.as_mut_slice()).unwrap();
562+
// It is safe to call EVP_MD_free on const EVP_MDs from MessageDigest, but
563+
// let's test it anyway before we use the original const EVP_MD in a hasher
564+
drop(md);
565+
let mut h = crate::hash::Hasher::new(messagedigest).unwrap();
566+
h.update(b"test").unwrap();
567+
let output = h.finish().unwrap();
568+
assert_eq!(digest, *output);
569+
}
552570
}

0 commit comments

Comments
 (0)