diff --git a/src/hashsum/digest.rs b/src/hashsum/digest.rs new file mode 100644 index 000000000..e4d8356ec --- /dev/null +++ b/src/hashsum/digest.rs @@ -0,0 +1,137 @@ +extern crate crypto; +extern crate rustc_serialize; + +use crypto::md5::Md5; +use crypto::sha1::Sha1; +use crypto::sha2::{Sha224, Sha256, Sha384, Sha512}; +use crypto::sha3::Sha3; +use crypto::digest::Digest as CryptoDigest; + +pub trait Digest { + fn input(&mut self, input: &[u8]); + fn result(&mut self, out: &mut [u8]); + fn reset(&mut self); + fn output_bits(&self) -> usize; + fn output_bytes(&self) -> usize { + (self.output_bits() + 7) / 8 + } + fn result_str(&mut self) -> String { + use self::rustc_serialize::hex::ToHex; + + let mut buf: Vec = vec![0; self.output_bytes()]; + self.result(&mut buf); + buf.to_hex() + } +} + +impl Digest for Md5 { + fn input(&mut self, input: &[u8]) { + CryptoDigest::input(self, input) + } + + fn result(&mut self, out: &mut [u8]) { + CryptoDigest::result(self, out) + } + + fn reset(&mut self) { + CryptoDigest::reset(self) + } + + fn output_bits(&self) -> usize { CryptoDigest::output_bits(self) } +} + +impl Digest for Sha1 { + fn input(&mut self, input: &[u8]) { + CryptoDigest::input(self, input) + } + + fn result(&mut self, out: &mut [u8]) { + CryptoDigest::result(self, out) + } + + fn reset(&mut self) { + CryptoDigest::reset(self) + } + + fn output_bits(&self) -> usize { CryptoDigest::output_bits(self) } +} + +impl Digest for Sha224 { + fn input(&mut self, input: &[u8]) { + CryptoDigest::input(self, input) + } + + fn result(&mut self, out: &mut [u8]) { + CryptoDigest::result(self, out) + } + + fn reset(&mut self) { + CryptoDigest::reset(self) + } + + fn output_bits(&self) -> usize { CryptoDigest::output_bits(self) } +} + +impl Digest for Sha256 { + fn input(&mut self, input: &[u8]) { + CryptoDigest::input(self, input) + } + + fn result(&mut self, out: &mut [u8]) { + CryptoDigest::result(self, out) + } + + fn reset(&mut self) { + CryptoDigest::reset(self) + } + + fn output_bits(&self) -> usize { CryptoDigest::output_bits(self) } +} + +impl Digest for Sha384 { + fn input(&mut self, input: &[u8]) { + CryptoDigest::input(self, input) + } + + fn result(&mut self, out: &mut [u8]) { + CryptoDigest::result(self, out) + } + + fn reset(&mut self) { + CryptoDigest::reset(self) + } + + fn output_bits(&self) -> usize { CryptoDigest::output_bits(self) } +} + +impl Digest for Sha512 { + fn input(&mut self, input: &[u8]) { + CryptoDigest::input(self, input) + } + + fn result(&mut self, out: &mut [u8]) { + CryptoDigest::result(self, out) + } + + fn reset(&mut self) { + CryptoDigest::reset(self) + } + + fn output_bits(&self) -> usize { CryptoDigest::output_bits(self) } +} + +impl Digest for Sha3 { + fn input(&mut self, input: &[u8]) { + CryptoDigest::input(self, input) + } + + fn result(&mut self, out: &mut [u8]) { + CryptoDigest::result(self, out) + } + + fn reset(&mut self) { + CryptoDigest::reset(self) + } + + fn output_bits(&self) -> usize { CryptoDigest::output_bits(self) } +} diff --git a/src/hashsum/hashsum.rs b/src/hashsum/hashsum.rs index af47432a6..8579a2ddb 100644 --- a/src/hashsum/hashsum.rs +++ b/src/hashsum/hashsum.rs @@ -20,7 +20,9 @@ extern crate rustc_serialize as serialize; #[macro_use] extern crate uucore; -use crypto::digest::Digest; +mod digest; + +use digest::Digest; use crypto::md5::Md5; use crypto::sha1::Sha1; use crypto::sha2::{Sha224, Sha256, Sha384, Sha512};