diff --git a/apub-core/src/digest.rs b/apub-core/src/digest.rs index 4709868..cbb6cc6 100644 --- a/apub-core/src/digest.rs +++ b/apub-core/src/digest.rs @@ -3,6 +3,8 @@ pub trait Digest { fn build() -> Self; fn digest(self, input: &[u8]) -> String; + fn update(&mut self, input: &[u8]); + fn verify(self, encoded: &str) -> bool; } pub trait DigestFactory { diff --git a/apub-openssl/src/lib.rs b/apub-openssl/src/lib.rs index e01f0b8..e6df060 100644 --- a/apub-openssl/src/lib.rs +++ b/apub-openssl/src/lib.rs @@ -51,6 +51,16 @@ impl<'a> apub_core::digest::Digest for OpenSslDigest { openssl::base64::encode_block(&bytes) } + + fn update(&mut self, input: &[u8]) { + self.digest.update(input); + } + + fn verify(self, encoded: &str) -> bool { + let bytes = self.digest.finish(); + + openssl::base64::encode_block(&bytes) == encoded + } } impl apub_core::signature::Sign for OpenSslSigner { diff --git a/apub-rustcrypto/src/lib.rs b/apub-rustcrypto/src/lib.rs index 0ba5196..d97496f 100644 --- a/apub-rustcrypto/src/lib.rs +++ b/apub-rustcrypto/src/lib.rs @@ -60,6 +60,16 @@ impl apub_core::digest::Digest for Sha256Digest { base64::encode(&bytes) } + + fn update(&mut self, input: &[u8]) { + self.digest.update(input); + } + + fn verify(self, encoded: &str) -> bool { + let bytes = self.digest.finalize(); + + base64::encode(&bytes) == encoded + } } impl apub_core::signature::Sign for RsaSigner {