#sha-256 #sha-2 #hmac #hkdf

no-std hmac-sha256

A small, self-contained SHA256, HMAC-SHA256, and HKDF-SHA256 implementation

22 releases (14 stable)

new 1.1.12 May 19, 2025
1.1.8 Dec 9, 2024
1.1.7 Jun 14, 2023
1.1.6 Nov 29, 2022
0.1.1 Apr 10, 2019

#25 in Cryptography

Download history 206326/week @ 2025-02-02 237533/week @ 2025-02-09 149639/week @ 2025-02-16 124406/week @ 2025-02-23 448753/week @ 2025-03-02 378123/week @ 2025-03-09 615752/week @ 2025-03-16 813020/week @ 2025-03-23 266963/week @ 2025-03-30 273328/week @ 2025-04-06 156455/week @ 2025-04-13 102444/week @ 2025-04-20 102575/week @ 2025-04-27 150565/week @ 2025-05-04 120435/week @ 2025-05-11 104439/week @ 2025-05-18

484,255 downloads per month
Used in 246 crates (53 directly)

ISC license

34KB
555 lines

rust-hmac-sha256

A small, self-contained SHA256, HMAC-SHA256, and HKDF-SHA256 implementation in Rust with no_std support.

Features

  • Pure Rust implementation
  • No external dependencies (unless optional features are enabled)
  • no_std compatible
  • Both one-shot and streaming APIs
  • Constant-time verification to prevent timing attacks
  • HKDF key derivation (extraction and expansion)

Optional Features

  • traits: Enable support for the Digest trait from the digest crate (both version 0.9.0 and 0.10.7)
  • opt_size: Enable size optimizations. Based on benchmarks, the .text section size is reduced by 75%, at the cost of approximately 16% performance.

Usage Examples

SHA-256

// One-shot hashing
let hash = hmac_sha256::Hash::hash(b"hello world");

// Incremental hashing
let mut hasher = hmac_sha256::Hash::new();
hasher.update(b"hello ");
hasher.update(b"world");
let hash = hasher.finalize();

// Constant-time verification
let expected = hmac_sha256::Hash::hash(b"hello world");
let mut hasher = hmac_sha256::Hash::new();
hasher.update(b"hello world");
assert!(hasher.verify(&expected));

HMAC-SHA256

// One-shot HMAC
let mac = hmac_sha256::HMAC::mac(b"message", b"key");

// Incremental HMAC
let mut hmac = hmac_sha256::HMAC::new(b"key");
hmac.update(b"message part 1");
hmac.update(b"message part 2");
let mac = hmac.finalize();

// Constant-time verification
let expected = hmac_sha256::HMAC::mac(b"message", b"key");
let mut hmac = hmac_sha256::HMAC::new(b"key");
hmac.update(b"message");
assert!(hmac.verify(&expected));

HKDF-SHA256

// Extract a pseudorandom key from input keying material
let prk = hmac_sha256::HKDF::extract(b"salt", b"input key material");

// Expand the pseudorandom key to the desired output length
let mut output = [0u8; 64];
hmac_sha256::HKDF::expand(&mut output, prk, b"application info");

Dependencies

~150KB