mirror of
https://github.com/luxfi/crypto.git
synced 2026-10-30 16:59:13 +00:00
One Rust crate per algorithm, plus an `lux-crypto` umbrella that re-exports
each per-algorithm crate behind a Cargo feature.
5 working crates with verified spec vectors:
- lux-crypto-keccak (Ethereum keccak256)
- lux-crypto-secp256k1 (ecrecover precompile + batch)
- lux-crypto-sha256 (FIPS 180-4)
- lux-crypto-ripemd160 (Bitcoin/Ethereum address derivation)
- lux-crypto-blake2b (RFC 7693)
15 wired-but-NOTIMPL crates (canonical Rust binding shipped, body returns
CRYPTO_ERR_NOTIMPL today; spec-vector tests gated `#[ignore]` with FIXME):
blake3, ed25519, slhdsa, mldsa, mlkem, bls, kzg, bn254, aead, ipa,
pedersen, lamport, ntt, poly-mul, evm256.
cargo check --release --workspace --all-features OK
cargo test --release --workspace 55 pass / 0 fail / 25 ignored
cargo doc --no-deps --workspace clean
cargo publish --dry-run --no-verify OK for all 20 leaf crates
Workspace docs added at rust/{README,PUBLISHING,RUST_CRATE_STATUS}.md.
Per-crate README.md and `Cargo.toml` metadata (description, license,
repository, keywords, categories, readme) wired for crates.io publish.
Build directives normalized: link both `lib<alg>.a` (C-ABI shim) and
`lib<alg>_cpu.a` (CPU body); brand-neutral C symbols (no lux_ prefix) per
the prefix-uniform audit.
50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
// Copyright (c) 2024-2026 Lux Industries Inc.
|
|
// SPDX-License-Identifier: BSD-3-Clause-Eco
|
|
|
|
use lux_crypto_slhdsa::{keygen, sign, verify, Error, Mode};
|
|
|
|
fn roundtrip(mode: Mode) {
|
|
let mut pk = vec![0u8; mode.pk_len()];
|
|
let mut sk = vec![0u8; mode.sk_len()];
|
|
let seed = [0xA5_u8; 32];
|
|
keygen(mode, &seed, &mut pk, &mut sk).expect("keygen");
|
|
let mut sig = vec![0u8; mode.sig_len()];
|
|
let n = sign(mode, &sk, b"SLH-DSA roundtrip", &mut sig).expect("sign");
|
|
verify(mode, &pk, b"SLH-DSA roundtrip", &sig[..n]).expect("verify");
|
|
}
|
|
|
|
#[test]
|
|
#[ignore = "luxcpp slhdsa c-abi NOTIMPL — tracked at #slhdsa-c-abi-impl"]
|
|
fn sha2_128f_roundtrip() { roundtrip(Mode::Sha2_128f); }
|
|
|
|
#[test]
|
|
#[ignore = "luxcpp slhdsa c-abi NOTIMPL — tracked at #slhdsa-c-abi-impl"]
|
|
fn sha2_192f_roundtrip() { roundtrip(Mode::Sha2_192f); }
|
|
|
|
#[test]
|
|
#[ignore = "luxcpp slhdsa c-abi NOTIMPL — tracked at #slhdsa-c-abi-impl"]
|
|
fn sha2_256f_roundtrip() { roundtrip(Mode::Sha2_256f); }
|
|
|
|
#[test]
|
|
fn fips205_sizes_match() {
|
|
assert_eq!(Mode::Sha2_128f.pk_len(), 32);
|
|
assert_eq!(Mode::Sha2_128f.sk_len(), 64);
|
|
assert_eq!(Mode::Sha2_128f.sig_len(), 17088);
|
|
assert_eq!(Mode::Sha2_192f.pk_len(), 48);
|
|
assert_eq!(Mode::Sha2_256f.sig_len(), 49856);
|
|
}
|
|
|
|
#[test]
|
|
fn binding_returns_error_when_c_abi_unimpl() {
|
|
let mut pk = vec![0u8; Mode::Sha2_128f.pk_len()];
|
|
let mut sk = vec![0u8; Mode::Sha2_128f.sk_len()];
|
|
let seed = [0u8; 32];
|
|
match keygen(Mode::Sha2_128f, &seed, &mut pk, &mut sk) {
|
|
Ok(_) => {}
|
|
Err(Error::InternalError(rc)) => {
|
|
assert_eq!(rc, -5);
|
|
}
|
|
Err(other) => panic!("unexpected: {:?}", other),
|
|
}
|
|
}
|