Same algorithms (FIPS 202: SHA3-224/256/384/512, SHAKE128/256; SP 800-185: cSHAKE128/256),
[u8; N]outputs replaceOutput<D>, and the SHAKE/cSHAKE reader chain usessqueeze(&mut out).
Verified against sha3 = "0.12.0" and the rscrypto 0.6.4 line.
Evidence: tests/sha3_official_vectors.rs, tests/sha3_differential.rs, tests/shake128_differential.rs, tests/shake256_differential.rs, tests/cshake256_nist_vectors.rs, and tests/cshake256_differential.rs.
Before (sha3 0.12.x) |
After (rscrypto 0.6.4) |
|
|---|---|---|
| Cargo dep | sha3 = "0.12" |
rscrypto = { version = "0.6.4", features = ["sha3"] } |
| Import | use sha3::{Sha3_256, Digest}; |
use rscrypto::{Sha3_256, Digest}; |
| Call | Sha3_256::digest(data) |
Sha3_256::digest(data) |
# Before
[dependencies]
sha3 = "0.12"# After
[dependencies]
rscrypto = { version = "0.6.4", features = ["sha3"] }sha3 type |
rscrypto type | Output |
|---|---|---|
sha3::Sha3_224 |
rscrypto::Sha3_224 |
[u8; 28] |
sha3::Sha3_256 |
rscrypto::Sha3_256 |
[u8; 32] |
sha3::Sha3_384 |
rscrypto::Sha3_384 |
[u8; 48] |
sha3::Sha3_512 |
rscrypto::Sha3_512 |
[u8; 64] |
sha3::Shake128 |
rscrypto::Shake128 |
XOF (variable) |
sha3::Shake256 |
rscrypto::Shake256 |
XOF (variable) |
sha3::CShake128 |
rscrypto::Cshake128 |
XOF (variable, customizable) |
sha3::CShake256 |
rscrypto::Cshake256 |
XOF (variable, customizable) |
sha3::Keccak* (the original Keccak padding, distinct from FIPS 202) is not currently mapped.
// Before
use sha3::{Digest, Sha3_256};
let out = Sha3_256::digest(b"123456789"); // Output<Sha3_256>// After
use rscrypto::{Digest, Sha3_256};
let out: [u8; 32] = Sha3_256::digest(b"123456789");// Before
use sha3::{Digest, Sha3_256};
let mut hasher = Sha3_256::new();
hasher.update(b"foo");
hasher.update(b"bar");
let out = hasher.finalize(); // consumes hasher// After
use rscrypto::{Digest, Sha3_256};
let mut hasher = Sha3_256::new();
hasher.update(b"foo");
hasher.update(b"bar");
let out = hasher.finalize(); // borrows &self// Before
use sha3::Shake128;
use sha3::digest::{ExtendableOutput, Update, XofReader};
let mut hasher = Shake128::default();
hasher.update(b"data");
let mut reader = hasher.finalize_xof();
let mut out = [0u8; 64];
reader.read(&mut out);// After
use rscrypto::{Shake128, Xof};
let mut hasher = Shake128::new();
hasher.update(b"data");
let mut reader = hasher.finalize_xof();
let mut out = [0u8; 64];
reader.squeeze(&mut out);Three changes:
| RustCrypto | rscrypto |
|---|---|
Shake128::default() |
Shake128::new() |
XofReader::read(&mut out) |
Xof::squeeze(&mut out) |
imports ExtendableOutput, Update, XofReader separately |
one trait Xof |
The one-shot form is Shake128::xof(data): returns the reader directly, no new/update/finalize_xof chain.
sha3 exposes CShake128 / CShake256. rscrypto ships Cshake128 / Cshake256 (SP 800-185).
// After
use rscrypto::{Cshake256, Xof};
let mut reader = Cshake256::xof(b"function-name", b"customization-string", b"data");
let mut out = [0u8; 64];
reader.squeeze(&mut out);Use Cshake128 the same way when your protocol specifies the 128-bit security-level variant.
- Trait consolidation. RustCrypto SHAKE requires three trait imports (
ExtendableOutput,Update,XofReader). rscrypto'sXoftrait carries all the methods you need; combine withDigestif you also callupdate()on the sponge type. finalizeconsumes vs. borrows. Same assha2: RustCrypto consumes, rscrypto borrows. Drop.clone()calls.Output<D>→[u8; N]. Same assha2: drop.as_slice()/.as_ref()and use the array directly.Mactrait via KMAC. RustCrypto ships a separatekmaccrate. rscrypto'sKmac128/Kmac256live underrscrypto::authbehindfeatures = ["kmac"](which impliessha3). See thesha3-kmacmigration guide.no_std. Both crates supportno_std. rscrypto adds runtime SIMD detection whenstdis enabled, plus a portable kernel always available.