[ ] Threat model is documented (assets, attacker capabilities, trust boundaries, failure modes)
[ ] Algorithm selection is explicit and justified (no „home-grown crypto“; avoid obsolete primitives)
[ ] Key material handling: keys/seed material are never logged, never persisted unintentionally, stored in secure containers
[ ] Randomness: cryptographic randomness comes from approved CSPRNG; no ad-hoc RNG; no time-based seeds
[ ] Nonce/IV rules are enforced by design (unique where required; never reused; preferably generated internally)
[ ] Constant-time comparisons for MACs, hashes, and secret-dependent equality checks
[ ] Side-channel posture is stated (timing/cache/power expectations) and relevant operations have mitigations
[ ] Input validation is strict and rejects malformed encodings; length checks precede allocation
[ ] Zeroization / lifecycle: secret buffers are zeroized where feasible; key objects have deterministic disposal patterns
[ ] Error behavior: crypto failures return non-revealing errors (no oracle leaks); callers cannot distinguish secret-dependent failure branches
[ ] Versioning & agility: protocol/blob formats are versioned; parameters are encoded with ciphertext/signature where required
[ ] Interoperability tests exist (golden vectors or cross-implementation tests)
[ ] Negative tests exist (tamper, replay, truncation, wrong key, wrong nonce/iv, wrong context)