Md5

Struct Md5 

Source
pub struct Md5 { /* private fields */ }
Available on crate feature allow-non-fips only.
Expand description

The Md5 hasher.

§Security Warning

MD5 should be considered cryptographically broken and unsuitable for further use. Collision attacks against MD5 are both practical and trivial, and theoretical attacks against MD5 have been found.

§Example

use wolf_crypto::hash::Md5;

let mut hasher = Md5::new().unwrap();

let input = b"hello world";
assert!(hasher.try_update(input.as_slice()).is_ok());

let finalized = hasher.try_finalize().unwrap();
assert_ne!(finalized.as_slice(), input.as_slice());
assert_eq!(finalized.len(), 16);

Implementations§

Source§

impl Md5

Source

pub fn new() -> Result<Self, Unspecified>

§Security Warning

MD5 should be considered cryptographically broken and unsuitable for further use. Collision attacks against MD5 are both practical and trivial, and theoretical attacks against MD5 have been found.

Create a new Md5 instance.

§Errors

If the underlying initialization function fails (wc_InitMd5)

§Example
use wolf_crypto::hash::Md5;

let mut hasher = Md5::new().unwrap();

let input = b"hello world";
assert!(hasher.try_update(input.as_slice()).is_ok());

let finalized = hasher.try_finalize().unwrap();
assert_ne!(finalized.as_slice(), input.as_slice());
assert_eq!(finalized.len(), 16);
Source

pub unsafe fn update_unchecked(&mut self, data: &[u8]) -> Res

Update the underlying wc_Md5 instance, without performing any safety checks.

§Safety

The length of data is casted to a 32 bit unsigned integer without checking for overflows. While it is incredibly unlikely that this overflow will ever take place, it is not impossible. Thus this function is marked unsafe.

§Arguments
  • data - The slice to update the underlying hasher state with.
§Returns

This function returns the result of the operation.

§Example
use wolf_crypto::hash::Md5;

let mut hasher = Md5::new().unwrap();

let input = b"hello world";
// SAFETY: The length of `hello world` is 11, which
// cannot overflow even an 8 bit integer.
let res = unsafe {
    hasher.update_unchecked(input.as_slice())
};
assert!(res.is_ok());

let finalized = hasher.try_finalize().unwrap();
assert_ne!(finalized.as_slice(), input.as_slice());
assert_eq!(finalized.len(), 16);
Source

pub fn try_update(&mut self, data: &[u8]) -> Res

Update the underlying wc_Md5 instance.

§Arguments
  • data - The slice to update the underlying hasher state with.
§Returns

This function returns the result of the operation.

§Errors
  • If the length of data cannot be safely casted to a u32.
  • If the underlying wc_Md5Update function fails.
§Example
use wolf_crypto::hash::Md5;

let mut hasher = Md5::new().unwrap();

let input = b"hello world";
assert!(hasher.try_update(input.as_slice()).is_ok());

let finalized = hasher.try_finalize().unwrap();
assert_ne!(finalized.as_slice(), input.as_slice());
assert_eq!(finalized.len(), 16);

Note: if the size of the data is known at compile time, see update_sized for a slight optimization as the safety checks are done at compilation time.

Source

pub fn update_sized<const C: usize>(&mut self, data: &[u8; C]) -> Res

Update the underlying wc_Md5 instance, with the safety checks performed at compilation time.

§Arguments
  • data - The slice to update the underlying hasher state with.
§Returns

This function returns the result of the operation.

§Errors
  • If the length of data cannot be safely casted to a u32.
  • If the underlying wc_Md5Update function fails.
§Example
use wolf_crypto::hash::Md5;

let mut hasher = Md5::new().unwrap();

let input = b"hello world";
assert!(hasher.update_sized(input).is_ok());

let finalized = hasher.try_finalize().unwrap();
assert_ne!(finalized.as_slice(), input.as_slice());
assert_eq!(finalized.len(), 16);

Note: if the size of the data is not known at compile time, see try_update for more flexibility.

Source

pub fn update(&mut self, data: &[u8])

Available on crate feature can-panic only.

Update the underlying wc_Md5, panicking under any failure.

§Arguments
  • data - The slice to update the underlying hasher state with.
§Panics
  • If the length of data cannot be safely casted to a u32.
  • If the underlying wc_Md5Update function fails.

If a panic under any failure is not acceptable for your use case, which generally is true, please consider using try_update.

§Example
use wolf_crypto::hash::Md5;

let mut hasher = Md5::new().unwrap();

let input = b"hello world";
hasher.update(input.as_slice());

let finalized = hasher.try_finalize().unwrap();
assert_ne!(finalized.as_slice(), input.as_slice());
assert_eq!(finalized.len(), 16);
Source

pub unsafe fn finalize_unchecked(&mut self, output: &mut [u8]) -> Res

Calls the wc_Md5Final function, finalizing the hashing of data and resetting the underlying wc_Md5 instance’s state, without performing any safety checks.

§Safety

The size of the output argument must have a size of at least 16 (the size of the digest).

§Arguments
  • output - The buffer to store the output digest in.
§Returns

This function returns the result of the operation.

§Example
use wolf_crypto::hash::Md5;
let mut hasher = Md5::new().unwrap();

// Use the hasher ...

let mut output = [0u8; 16];
// SAFETY: The size of the output is exactly 
// the size of the digest.
let res = unsafe {
    hasher.finalize_unchecked(output.as_mut_slice())
};
assert!(res.is_ok());
Source

pub fn finalize_into(&mut self, output: &mut [u8]) -> Res

Calls the wc_Md5Final function, finalizing the hashing of data and resetting the underlying wc_Md5 instance’s state.

§Arguments
  • output - The buffer to store the output digest in.
§Errors
  • If the size of output is less than the digest size (16).
  • If the underlying finalize function fails.
§Example
use wolf_crypto::hash::Md5;
let mut hasher = Md5::new().unwrap();

// Use the hasher ...

let mut output = [0u8; 16];
let res = hasher.finalize_into(output.as_mut_slice());
assert!(res.is_ok());

Note: if the size of the output slice is known at compile time, see finalize_into_sized for a slight optimization as the safety checks are done at compilation time. There is also finalize_into_exact if this size is exactly 16 bytes, moving all checks to the type system.

Source

pub fn finalize_into_sized<const C: usize>( &mut self, output: &mut [u8; C], ) -> Res

Calls the wc_Md5Final function, finalizing the hashing of data and resetting the underlying wc_Md5 instance’s state, with the safety checks performed at compilation time.

§Arguments
  • output - The buffer to store the output digest in.
§Errors
  • If the size of output is less than the digest size (16).
  • If the underlying finalize function fails.
§Example
use wolf_crypto::hash::Md5;
let mut hasher = Md5::new().unwrap();

// Use the hasher ...

let mut output = [0u8; 16];
let res = hasher.finalize_into_sized(&mut output);
assert!(res.is_ok());

Note: If the size of the output buffer is not known at compilation time see finalize_into for greater flexibility. There is also finalize_into_exact if this size is exactly 16 bytes, moving all checks to the type system.

Source

pub fn finalize_into_exact(&mut self, output: &mut [u8; 16]) -> Res

Calls the wc_Md5Final function, finalizing the hashing of data and resetting the underlying wc_Md5 instance’s state, with the safety checks moved to the type system.

§Arguments
  • output - The buffer to store the output digest in.
§Errors

If the underlying finalize function fails.

§Example
use wolf_crypto::hash::Md5;
let mut hasher = Md5::new().unwrap();

// Use the hasher ...

let mut output = [0u8; 16];
let res = hasher.finalize_into_exact(&mut output);
assert!(res.is_ok());

Note: If the size of the output buffer is not known at compilation time see finalize_into for greater flexibility. If the size is known at compilation time, but not exactly 16 bytes, see finalize_into_sized.

Source

pub fn try_finalize(&mut self) -> Result<[u8; 16], Unspecified>

Calls the wc_Md5Final function, finalizing the hashing of data and resetting the underlying wc_Md5 instance’s state.

§Returns

On success, this returns the output digest.

§Errors

If the underlying finalize function fails.

§Example
use wolf_crypto::hash::Md5;
let mut hasher = Md5::new().unwrap();

// Use the hasher ...

let res = hasher.try_finalize().unwrap();
assert_ne!(res.as_slice(), input.as_slice());
Source

pub fn finalize(&mut self) -> [u8; 16]

Available on crate feature can-panic only.

Calls the wc_Md5Final function, finalizing the hashing of data and resetting the underlying wc_Md5 instance’s state.

§Returns

On success, this returns the output digest.

§Panics

If the underlying finalize function fails. If panicking is not acceptable for your use case, which generally is true, see try_finalize.

§Example
use wolf_crypto::hash::Md5;
let mut hasher = Md5::new().unwrap();

// Use the hasher ...

let res = hasher.try_finalize().unwrap();
assert_ne!(res.as_slice(), input.as_slice());

Trait Implementations§

Source§

impl Clone for Md5

Source§

fn clone(&self) -> Self

Copy the state of the hash (calls the wc_Md5Copy function)

§Returns

A distinct new instance of Md5, with the same state as the hasher that was cloned.

§Example
use wolf_crypto::hash::Md5;
let mut hasher = Md5::new().unwrap();

assert!(hasher.update_sized(b"hello world").is_ok());

let mut cloned = hasher.clone();
assert_eq!(
    cloned.try_finalize().unwrap(),
    hasher.try_finalize().unwrap(),
    "The two hashers should have the same output"
);
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Drop for Md5

Source§

fn drop(&mut self)

Calls the wc_Md5Free function, cleaning up after itself.

Source§

impl Hash for Md5

Source§

fn write_alg_name(f: &mut Formatter<'_>) -> Result

Writes “Md5” to f.

Source§

type Digest = [u8; 16]

Represents the output digest of the hash function.
Source§

type KeyLen = U16

The associated key length for this hashing function. Read more
Source§

impl Send for Md5

Source§

impl Sync for Md5

Auto Trait Implementations§

§

impl Freeze for Md5

§

impl RefUnwindSafe for Md5

§

impl Unpin for Md5

§

impl UnwindSafe for Md5

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.