gmcrypto-simd
Internal SIMD backend for gmcrypto-core.
Not a crate you should depend on directly.
What you probably want instead
If you are here because you searched for SM4, the crate you want is
gmcrypto-core, with the SIMD backend switched on by feature:
[]
= { = "1.11", = ["sm4-bitsliced-simd"] }
That pulls this crate in automatically. sm4-aead does too, for GHASH.
Nothing in the SM4 or GHASH API is exposed here in a form intended for
outside callers.
What this crate is
The packed-bitsliced SM4 S-box and the GHASH multiply, written against architecture intrinsics:
x86_64 |
aarch64 |
elsewhere | |
|---|---|---|---|
| SM4 S-box | AVX2, 8 / 32 bytes per call, runtime-detected with scalar fallback | NEON, 16 bytes per call, compile-time baseline | scalar bitsliced |
| GHASH multiply | CLMUL, runtime-detected | PMULL64, runtime-detected | constant-time software |
It exists for exactly one reason: core::arch intrinsics are unsafe fn,
and #[target_feature(enable = "…")] is the only stable-Rust mechanism on
MSRV 1.85 that combines runtime CPU dispatch with intrinsic calls. Putting
that here keeps gmcrypto-core at unsafe_code = "forbid" — every unsafe
block in this crate carries a // SAFETY: comment naming its architectural
or runtime-detect precondition. Same posture as the gmcrypto-c FFI shim.
Stability
rlib-only. No cdylib, no staticlib, no C ABI, no raw pointers across the crate boundary.gmcrypto-cis the project's only C ABI.- Every public item is
#[doc(hidden)]and outside SemVer. Entry points may change or disappear in any release without a major bump. The supported surfaces are thegmcrypto-coreRust API and thegmcrypto-cC ABI. - Lockstep-versioned with its siblings:
gmcrypto-corepins this crate at an exact=1.11.2, and all three crates publish together. Mixing versions is not a supported configuration.
Correctness is not taken on trust from the intrinsics: lane-equivalence tests
cross-check both the scalar and the SIMD paths against an inline copy of the
GB/T 32907-2016 §6.2 S-box table, and gmcrypto-core asserts the bitsliced
output is byte-identical to its default linear-scan S-box.
Licence
Dual-licensed under Apache-2.0 or MIT, at your option — same as the rest of the workspace. See the repository for the threat model, security posture, and the full SDK.