From b82e0d32ce6bca2f2fb64ce078d400a1aab0d7c9 Mon Sep 17 00:00:00 2001 From: Gareth Smith Date: Fri, 20 Sep 2013 00:05:27 +0100 Subject: [PATCH] Add a new Digest.result_bytes convenience function. --- src/libextra/crypto/cryptoutil.rs | 5 ++++- src/libextra/crypto/digest.rs | 27 +++++++++++++-------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/libextra/crypto/cryptoutil.rs b/src/libextra/crypto/cryptoutil.rs index 9516517d9f7..71faadca302 100644 --- a/src/libextra/crypto/cryptoutil.rs +++ b/src/libextra/crypto/cryptoutil.rs @@ -353,6 +353,7 @@ mod test { use cryptoutil::{add_bytes_to_bits, add_bytes_to_bits_tuple}; use digest::Digest; + use hex::FromHex; /// Feed 1,000,000 'a's into the digest with varying input sizes and check that the result is /// correct. @@ -373,8 +374,10 @@ mod test { } let result_str = digest.result_str(); + let result_bytes = digest.result_bytes(); - assert!(expected == result_str); + assert_eq!(expected, result_str.as_slice()); + assert_eq!(expected.from_hex().unwrap(), result_bytes); } // A normal addition - no overflow occurs diff --git a/src/libextra/crypto/digest.rs b/src/libextra/crypto/digest.rs index d2d6b540cff..85c256c47a3 100644 --- a/src/libextra/crypto/digest.rs +++ b/src/libextra/crypto/digest.rs @@ -10,6 +10,8 @@ use std::vec; +use hex::ToHex; + /** * The Digest trait specifies an interface common to digest functions, such as SHA-1 and the SHA-2 @@ -56,25 +58,22 @@ pub trait Digest { self.input(input.as_bytes()); } + /** + * Convenience function that retrieves the result of a digest as a + * newly allocated vec of bytes. + */ + fn result_bytes(&mut self) -> ~[u8] { + let mut buf = vec::from_elem((self.output_bits()+7)/8, 0u8); + self.result(buf); + buf + } + /** * Convenience function that retrieves the result of a digest as a * ~str in hexadecimal format. */ fn result_str(&mut self) -> ~str { - let mut buf = vec::from_elem((self.output_bits()+7)/8, 0u8); - self.result(buf); - return to_hex(buf); + self.result_bytes().to_hex() } } -fn to_hex(rr: &[u8]) -> ~str { - let mut s = ~""; - for b in rr.iter() { - let hex = (*b as uint).to_str_radix(16u); - if hex.len() == 1 { - s.push_char('0'); - } - s.push_str(hex); - } - return s; -}