Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

RustCrypto: Hashes

Project Chatdependency statusApache2/MIT licensed

Collection of cryptographic hash functions written in pure Rust.

All algorithms reside in separate crates and are implemented using traits from digest crate. Additionally all crates do not require the standard library (i.e. no_std capable) and can be easily used for bare-metal or WebAssembly programming.

Supported Algorithms

Note: For new applications, or where compatibility with other existing standards is not a primary concern, we strongly recommend to use either BLAKE2, SHA-2 or SHA-3.

AlgorithmCrateCrates.ioDocumentationMSRVSecurity
Ascon hashascon‑hashcrates.ioDocumentationMSRV 1.71💚
BelT hashbelt‑hashcrates.ioDocumentationMSRV 1.71💚
BLAKE2blake2crates.ioDocumentationMSRV 1.71💚
FSBfsbcrates.ioDocumentationMSRV 1.71💚
GOST R 34.11-94gost94crates.ioDocumentationMSRV 1.71💛
Grøstl (Groestl)groestlcrates.ioDocumentationMSRV 1.71💚
JHjhcrates.ioDocumentationMSRV 1.71💚
KangarooTwelvek12crates.ioDocumentationMSRV 1.71💚
MD2md2crates.ioDocumentationMSRV 1.71💔
MD4md4crates.ioDocumentationMSRV 1.71💔
MD5md5crates.ioDocumentationMSRV 1.72💔
RIPEMDripemdcrates.ioDocumentationMSRV 1.71💚
SHA-1sha1crates.ioDocumentationMSRV 1.72💔
SHA-1 Checkedsha1-checkedcrates.ioDocumentationMSRV 1.72💛
SHA-2sha2crates.ioDocumentationMSRV 1.72💚
SHA-3 (Keccak)sha3crates.ioDocumentationMSRV 1.71💚
SHABALshabalcrates.ioDocumentationMSRV 1.71💚
Skeinskeincrates.ioDocumentationMSRV 1.71💚
SM3 (OSCCA GM/T 0004-2012)sm3crates.ioDocumentationMSRV 1.71💚
Streebog (GOST R 34.11-2012)streebogcrates.ioDocumentationMSRV 1.71💛
Tigertigercrates.ioDocumentationMSRV 1.74💚
Whirlpoolwhirlpoolcrates.ioDocumentationMSRV 1.71💚

NOTE: the blake3 crate implements the digest traits used by the rest of the hashes in this repository, but is maintained by the BLAKE3 team.

Security Level Legend

The following describes the security level ratings associated with each hash function (i.e. algorithms, not the specific implementation):

HeartDescription
💚No known successful attacks
💛Theoretical break: security lower than claimed
💔Attack demonstrated in practice: avoid if at all possible

See the Security page on Wikipedia for more information.

Crate Names

Whenever possible crates are published under the same name as the crate folder. Owners of md5declined to participate in this project. This crate does not implement the digest traits, so it is not interoperable with the RustCrypto ecosystem. This is why we publish our MD5 implementation as md-5 and mark it with the ❗ mark. Note that the library itself is named as md5, i.e. inside use statements you should use md5, not md_5.

The SHA-1 implementation was previously published as sha-1, but migrated to sha1 since v0.10.0. sha-1 will continue to receive v0.10.x patch updates, but will be deprecated after sha1 v0.11 release.

Minimum Supported Rust Version (MSRV) Policy

MSRV bumps are considered breaking changes and will be performed only with minor version bump.

Examples

Let us demonstrate how to use crates in this repository using SHA-2 as an example.

First add sha2 crate to your Cargo.toml:

[dependencies]
sha2 = "0.10"

Note that all crates in this repository have an enabled by default std feature. So if you plan to use the crate in no_std environments, don't forget to disable it:

[dependencies]
sha2 = { version = "0.10", default-features = false }

sha2 and the other hash implementation crates re-export the digest crate and the Digest trait for convenience, so you don't have to include it in your Cargo.toml it as an explicit dependency.

Now you can write the following code:

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

In this example hash has type GenericArray<u8, U32>, which is a generic alternative to [u8; 32] defined in the generic-array crate. If you need to serialize hash value into string, you can use crates like base16ct and base64ct:

use base64ct::{Base64,Encoding};let base64_hash = Base64::encode_string(&hash);println!("Base64-encoded hash: {}", base64_hash);let hex_hash = base16ct::lower::encode_string(&hash);println!("Hex-encoded hash: {}", hex_hash);

Instead of calling update, you also can use a chained approach:

use sha2::{Sha256,Digest};let hash = Sha256::new().chain_update(b"Hello world!").chain_update("String data").finalize();

If a complete message is available, then you can use the convenience Digest::digest method:

use sha2::{Sha256,Digest};let hash = Sha256::digest(b"my message");

Hashing Readable Objects

If you want to hash data from a type which implements the Read trait, you can rely on implementation of the Write trait (requires enabled-by-default std feature):

use sha2::{Sha256,Digest};use std::{fs, io};letmut file = fs::File::open(&path)?;letmut hasher = Sha256::new();let n = io::copy(&mut file,&mut hasher)?;let hash = hasher.finalize();

Hash-based Message Authentication Code (HMAC)

If you want to calculate Hash-based Message Authentication Code (HMAC), you can use the generic implementation from hmac crate, which is a part of the RustCrypto/MACs repository.

Generic Code

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

use sha2::{Sha256,Sha512,Digest};// Toy example, do not use it in practice!// Instead use crates from: https://github.com/RustCrypto/password-hashingfnhash_password<D:Digest>(password:&str,salt:&str,output:&mut[u8]){letmut hasher = D::new();
hasher.update(password.as_bytes());
hasher.update(b"$");
hasher.update(salt.as_bytes());
output.copy_from_slice(&hasher.finalize())}letmut buf1 = [0u8;32];hash_password::<Sha256>("my_password","abcd",&mut buf1);letmut buf2 = [0u8;64];hash_password::<Sha512>("my_password","abcd",&mut buf2);

If you want to use hash functions with trait objects, you can use the DynDigest trait:

use digest::DynDigest;// Dynamic hash functionfnuse_hasher(hasher:&mutdynDynDigest,data:&[u8]) -> Box<[u8]>{
hasher.update(data);
hasher.finalize_reset()}// You can use something like this when parsing user input, CLI arguments, etc.// DynDigest needs to be boxed here, since function return should be sized.fnselect_hasher(s:&str) -> Box<dynDynDigest>{match s {"md5" => Box::new(md5::Md5::default()),"sha1" => Box::new(sha1::Sha1::default()),"sha224" => Box::new(sha2::Sha224::default()),"sha256" => Box::new(sha2::Sha256::default()),"sha384" => Box::new(sha2::Sha384::default()),"sha512" => Box::new(sha2::Sha512::default()),
_ => unimplemented!("unsupported digest: {}", s),}}letmut hasher1 = select_hasher("md5");letmut hasher2 = select_hasher("sha512");// the `&mut *hasher` is to DerefMut the value out of the Box// this is equivalent to `DerefMut::deref_mut(&mut hasher)`// can be reused due to `finalize_reset()`let hash1_1 = use_hasher(&mut*hasher1,b"foo");let hash1_2 = use_hasher(&mut*hasher1,b"bar");let hash2_1 = use_hasher(&mut*hasher2,b"foo");

License

All crates in this repository are 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.

About

Collection of cryptographic hash functions written in pure Rust

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages