|
3 jaren geleden | |
---|---|---|
.. | ||
src | 3 jaren geleden | |
.cargo-checksum.json | 3 jaren geleden | |
CHANGELOG.md | 3 jaren geleden | |
Cargo.toml | 3 jaren geleden | |
LICENSE-APACHE | 3 jaren geleden | |
LICENSE-MIT | 3 jaren geleden | |
README.md | 3 jaren geleden |
Traits which describe functionality of cryptographic hash functions, a.k.a. digest algorithms.
See RustCrypto/hashes for implementations which use this trait.
Rust 1.41 or higher.
Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump.
Let us demonstrate how to use crates in this repository using BLAKE2b as an example.
First add blake2
crate to your Cargo.toml
:
[dependencies]
blake2 = "0.8"
blake2
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 blake2::{Blake2b, Digest};
let mut hasher = Blake2b::new();
let data = b"Hello world!";
hasher.input(data);
// `input` can be called repeatedly and is generic over `AsRef<[u8]>`
hasher.input("String data");
// Note that calling `finalize()` consumes hasher
let hash = hasher.finalize();
println!("Result: {:x}", hash);
In this example hash
has type GenericArray<u8, U64>
, which is a generic
alternative to [u8; 64]
.
Alternatively you can use chained approach, which is equivalent to the previous example:
let hash = Blake2b::new()
.chain(b"Hello world!")
.chain("String data")
.finalize();
println!("Result: {:x}", hash);
If the whole message is available you also can use convinience digest
method:
let hash = Blake2b::digest(b"my message");
println!("Result: {:x}", hash);
Read
-able objectsIf you want to hash data from Read
trait (e.g. from file) you can rely on
implementation of Write
trait (requires enabled-by-default std
feature):
use blake2::{Blake2b, Digest};
use std::{fs, io};
let mut file = fs::File::open(&path)?;
let mut hasher = Blake2b::new();
let n = io::copy(&mut file, &mut hasher)?;
let hash = hasher.finalize();
println!("Path: {}", path);
println!("Bytes processed: {}", n);
println!("Hash value: {:x}", hash);
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.input(password.as_bytes());
hasher.input(b"$");
hasher.input(salt.as_bytes());
output.copy_from_slice(hasher.finalize().as_slice())
}
use blake2::Blake2b;
use sha2::Sha256;
hash_password::<Blake2b>("my_password", "abcd", &mut buf);
hash_password::<Sha256>("my_password", "abcd", &mut buf);
If you want to use hash functions with trait objects, use digest::DynDigest
trait.
Licensed under either of:
at your option.
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.