Thanks to visit codestin.com
Credit goes to lib.rs

#hash #message-authentication-code

no-std digest

Traits for cryptographic hash functions and message authentication codes

31 releases

Uses new Rust 2024

0.11.0-rc.5 Dec 27, 2025
0.11.0-rc.4 Nov 5, 2025
0.11.0-rc.3 Sep 29, 2025
0.11.0-rc.0 May 29, 2025
0.3.0 Nov 17, 2016

#59 in Cryptography

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

21,722,153 downloads per month
Used in 38,998 crates (976 directly)

MIT/Apache

130KB
2.5K SLoC

RustCrypto: Digest Algorithm Traits

crate Docs Apache2/MIT licensed Rust Version Project Chat Build Status

Traits which describe functionality of cryptographic hash functions, a.k.a. digest algorithms.

See RustCrypto/hashes for implementations which use this trait.

Usage

Let us demonstrate how to use crates in this repository using Sha256 as an example.

First add the sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.11"

sha2 and other crates re-export digest crate and Digest trait for convenience, so you don't have to add digest crate as an explicit dependency.

Now you can write the following code:

use sha2::{Sha256, Digest};

let mut hasher = Sha256::new();
let data = b"Hello world!";
hasher.update(data);
// `input` can be called repeatedly and is generic over `AsRef<[u8]>`
hasher.update("String data");
// Note that calling `finalize()` consumes hasher
let hash = hasher.finalize();
println!("Result: {:x}", hash);

In this example hash has type Array<u8, U32>, which is a generic alternative to [u8; 32].

Alternatively you can use chained approach, which is equivalent to the previous example:

let hash = Sha256::new()
    .chain_update(b"Hello world!")
    .chain_update("String data")
    .finalize();

println!("Result: {:x}", hash);

If the whole message is available you also can use convenience digest method:

let hash = Sha256::digest(b"my message");
println!("Result: {:x}", hash);

Generic code

You can write generic code over Digest (or other traits from digest crate) trait which will work over different hash functions:

use digest::Digest;

// Toy example, do not use it in practice!
// Instead use crates from: https://github.com/RustCrypto/password-hashing
fn hash_password<D: Digest>(password: &str, salt: &str, output: &mut [u8]) {
    let mut hasher = D::new();
    hasher.update(password.as_bytes());
    hasher.update(b"$");
    hasher.update(salt.as_bytes());
    output.copy_from_slice(hasher.finalize().as_slice())
}

let mut buf1 = [0u8; 32];
let mut buf2 = [0u8; 64];

hash_password::<sha2::Sha256>("my_password", "abcd", &mut buf1);
hash_password::<sha2::Sha512>("my_password", "abcd", &mut buf2);

If you want to use hash functions with trait objects, use digest::DynDigest trait.

License

Licensed under either of:

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0.4–0.8MB
~20K SLoC