From 22f029064a31cb72c71fd43e8c17f75dfc3d9e03 Mon Sep 17 00:00:00 2001 From: Peter Farr Date: Mon, 11 Nov 2019 11:09:49 -0800 Subject: [PATCH 1/3] Added clonability for sha hash state. Useful for incremental hashing --- openssl-sys/src/sha.rs | 1 + openssl/src/sha.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/openssl-sys/src/sha.rs b/openssl-sys/src/sha.rs index a9e7b15c..2ad91f6f 100644 --- a/openssl-sys/src/sha.rs +++ b/openssl-sys/src/sha.rs @@ -5,6 +5,7 @@ pub type SHA_LONG = c_uint; pub const SHA_LBLOCK: c_int = 16; #[repr(C)] +#[derive(Clone)] pub struct SHA_CTX { pub h0: SHA_LONG, pub h1: SHA_LONG, diff --git a/openssl/src/sha.rs b/openssl/src/sha.rs index e3c4c2e8..dffadb90 100644 --- a/openssl/src/sha.rs +++ b/openssl/src/sha.rs @@ -110,6 +110,7 @@ pub fn sha512(data: &[u8]) -> [u8; 64] { /// /// SHA1 is known to be insecure - it should not be used unless required for /// compatibility with existing systems. +#[derive(Clone)] pub struct Sha1(ffi::SHA_CTX); impl Sha1 { From 8fae1115a4c60a3b51fce706da7bc0092ea8ee7f Mon Sep 17 00:00:00 2001 From: Peter Farr Date: Mon, 11 Nov 2019 16:31:47 -0800 Subject: [PATCH 2/3] Changed all sha objects to be clonable per PR review suggestion. --- openssl-sys/src/sha.rs | 2 ++ openssl/src/sha.rs | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/openssl-sys/src/sha.rs b/openssl-sys/src/sha.rs index 2ad91f6f..e8d1403f 100644 --- a/openssl-sys/src/sha.rs +++ b/openssl-sys/src/sha.rs @@ -26,6 +26,7 @@ extern "C" { } #[repr(C)] +#[derive(Clone)] pub struct SHA256_CTX { pub h: [SHA_LONG; 8], pub Nl: SHA_LONG, @@ -49,6 +50,7 @@ extern "C" { pub type SHA_LONG64 = u64; #[repr(C)] +#[derive(Clone)] pub struct SHA512_CTX { pub h: [SHA_LONG64; 8], pub Nl: SHA_LONG64, diff --git a/openssl/src/sha.rs b/openssl/src/sha.rs index dffadb90..a33a0f6c 100644 --- a/openssl/src/sha.rs +++ b/openssl/src/sha.rs @@ -146,6 +146,7 @@ impl Sha1 { } /// An object which calculates a SHA224 hash of some data. +#[derive(Clone)] pub struct Sha224(ffi::SHA256_CTX); impl Sha224 { @@ -181,6 +182,7 @@ impl Sha224 { } /// An object which calculates a SHA256 hash of some data. +#[derive(Clone)] pub struct Sha256(ffi::SHA256_CTX); impl Sha256 { @@ -216,6 +218,7 @@ impl Sha256 { } /// An object which calculates a SHA384 hash of some data. +#[derive(Clone)] pub struct Sha384(ffi::SHA512_CTX); impl Sha384 { @@ -251,6 +254,7 @@ impl Sha384 { } /// An object which calculates a SHA512 hash of some data. +#[derive(Clone)] pub struct Sha512(ffi::SHA512_CTX); impl Sha512 { From 5991f425faacca144c640f7a978883b4b939df75 Mon Sep 17 00:00:00 2001 From: Peter Farr Date: Mon, 11 Nov 2019 16:40:05 -0800 Subject: [PATCH 3/3] Added unit test to test that new cloning feature works as intended --- openssl/src/sha.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/openssl/src/sha.rs b/openssl/src/sha.rs index a33a0f6c..7f6c4067 100644 --- a/openssl/src/sha.rs +++ b/openssl/src/sha.rs @@ -313,6 +313,20 @@ mod test { assert_eq!(hex::encode(hasher.finish()), expected); } + #[test] + fn cloning_allows_incremental_hashing() { + let expected = "a9993e364706816aba3e25717850c26c9cd0d89d"; + + let mut hasher = Sha1::new(); + hasher.update(b"a"); + + let mut incr_hasher = hasher.clone(); + incr_hasher.update(b"bc"); + + assert_eq!(hex::encode(incr_hasher.finish()), expected); + assert_ne!(hex::encode(hasher.finish()), expected); + } + #[test] fn standalone_224() { let data = b"abc";