diff --git a/src/crypto/hash.rs b/src/crypto/hash.rs index a72b8d9f..b00dfba8 100644 --- a/src/crypto/hash.rs +++ b/src/crypto/hash.rs @@ -1,5 +1,6 @@ use libc::c_uint; use std::ptr; +use std::io; use ffi; @@ -34,6 +35,13 @@ pub struct Hasher { len: uint, } +impl io::Writer for Hasher { + fn write(&mut self, buf: &[u8]) -> io::IoResult<()> { + self.update(buf); + Ok(()) + } +} + impl Hasher { pub fn new(ht: HashType) -> Hasher { ffi::init(); @@ -112,6 +120,12 @@ mod tests { assert!(calced == hashtest.expected_output); } + pub fn hash_writer(t: super::HashType, data: &[u8]) -> Vec { + let mut h = super::Hasher::new(t); + h.write(data); + h.finalize() + } + // Test vectors from http://www.nsrl.nist.gov/testdata/ #[test] fn test_md5() { @@ -167,4 +181,11 @@ mod tests { hash_test(super::RIPEMD160, test); } } + + #[test] + fn test_writer() { + let tv = "rust-openssl".as_bytes(); + let ht = super::RIPEMD160; + assert!(hash_writer(ht, tv) == super::hash(ht, tv)); + } }