Crypto Library Misuse (CWE-323, CWE-330, CWE-208)
What this checks
Cryptographic primitives are correct only when their preconditions are met. Not
"weak algorithm picked" — that's cryptographic-failures. These are "right
primitive, wrong wiring": nonce reused, per-signature random reused, comparison
branches on secret bits, exception type leaks which decryption failure happened.
Each pattern below has produced a real CVE (Sony PS3 ECDSA k-reuse, Marvin RSA timing).
Vulnerable patterns
- AEAD nonce reuse: an AEAD encrypt call where the nonce is fixed, zeroed, or
a wrapping counter. A single reused nonce lets an attacker XOR two ciphertexts
and recover both plaintexts.
- ECDSA/DSA k reuse or weak randomness: signing with a predictable or repeated
per-signature random value. Two signatures with the same k recover the private
key by linear algebra.
- Length-extension on bare hashes: using
hash(secret || msg) as a MAC. SHA-2
length-extension lets an attacker forge a valid tag over an extended message.
- Padding oracle via exception distinguishability: distinct exception types
for "ciphertext too short" versus "padding invalid". Bleichenbacher and Manger
attacks need exactly that one bit per query.
- Branching on secret material: a conditional whose branch depends on a key
bit or MAC byte produces a measurable timing difference. Includes early-exit
byte comparison on MAC or signature verification.
- Static IV for CBC: encrypting two plaintexts with the same IV reveals their
common prefix.
- ECB used for structured data: identical plaintext blocks produce identical
ciphertext blocks, leaking structure.
Fix immediately
Flag the vulnerable call site and explain the risk. Then suggest a fix that
establishes these properties:
- Every AEAD encrypt uses a fresh nonce drawn from a CSPRNG, or a managed
monotonic counter with an overflow guard. The nonce is stored or transmitted
alongside the ciphertext.
- ECDSA/DSA signing uses deterministic k (RFC 6979) or a library that
guarantees a fresh per-signature random — the caller never supplies k.
- MACs use a MAC primitive (HMAC, Poly1305, KMAC), not a bare hash of
secret || msg. HMAC's two-pass construction defeats length-extension.
- Comparisons over MACs, signatures, or hashes use a constant-time primitive
documented for that purpose — never plain equality or early-exit byte comparison.
- All decryption-failure paths raise a single exception type at the boundary,
collapsing padding, length, and authentication failures into one indistinguishable
error.
- No branch inside a crypto routine depends on a secret bit. Use bitwise
selection or library primitives that document constant-time behavior.
- CBC uses a fresh random IV per message; ECB is not used for structured data.
Prefer an AEAD mode over CBC+MAC when the platform offers one.
Translate these principles to the audited file's language and crypto library. Use
the documented high-level API (AEAD wrapper, signing context, HMAC primitive,
constant-time-compare helper) — do not assemble these guarantees by hand.
Verification
After rewriting, confirm:
References
1---2name: crypto-library-misuse3description: Detects library-internal cryptographic correctness bugs that pattern matchers and crypto-failures skills miss — AEAD nonce reuse, ECDSA k-value reuse, length-extension on bare hashes, padding-oracle exception distinguishability, and branching on secret material. Use when writing code that calls a crypto primitive directly (AEAD encrypt/decrypt, ECDSA/DSA sign, raw hash, RSA decrypt). Distinct from cryptographic-failures, which covers application-layer choices like MD5 for passwords; this skill is about how primitives are wired up.4---56# Crypto Library Misuse (CWE-323, CWE-330, CWE-208)78## What this checks910Cryptographic primitives are correct only when their preconditions are met. Not11"weak algorithm picked" — that's `cryptographic-failures`. These are "right12primitive, wrong wiring": nonce reused, per-signature random reused, comparison13branches on secret bits, exception type leaks which decryption failure happened.14Each pattern below has produced a real CVE (Sony PS3 ECDSA k-reuse, Marvin RSA timing).1516## Vulnerable patterns1718- **AEAD nonce reuse**: an AEAD encrypt call where the nonce is fixed, zeroed, or19 a wrapping counter. A single reused nonce lets an attacker XOR two ciphertexts20 and recover both plaintexts.21- **ECDSA/DSA k reuse or weak randomness**: signing with a predictable or repeated22 per-signature random value. Two signatures with the same k recover the private23 key by linear algebra.24- **Length-extension on bare hashes**: using `hash(secret || msg)` as a MAC. SHA-225 length-extension lets an attacker forge a valid tag over an extended message.26- **Padding oracle via exception distinguishability**: distinct exception types27 for "ciphertext too short" versus "padding invalid". Bleichenbacher and Manger28 attacks need exactly that one bit per query.29- **Branching on secret material**: a conditional whose branch depends on a key30 bit or MAC byte produces a measurable timing difference. Includes early-exit31 byte comparison on MAC or signature verification.32- **Static IV for CBC**: encrypting two plaintexts with the same IV reveals their33 common prefix.34- **ECB used for structured data**: identical plaintext blocks produce identical35 ciphertext blocks, leaking structure.3637## Fix immediately3839Flag the vulnerable call site and explain the risk. Then suggest a fix that40establishes these properties:41421. **Every AEAD encrypt uses a fresh nonce drawn from a CSPRNG**, or a managed43 monotonic counter with an overflow guard. The nonce is stored or transmitted44 alongside the ciphertext.452. **ECDSA/DSA signing uses deterministic k (RFC 6979)** or a library that46 guarantees a fresh per-signature random — the caller never supplies k.473. **MACs use a MAC primitive (HMAC, Poly1305, KMAC), not a bare hash of48 `secret || msg`.** HMAC's two-pass construction defeats length-extension.494. **Comparisons over MACs, signatures, or hashes use a constant-time primitive**50 documented for that purpose — never plain equality or early-exit byte comparison.515. **All decryption-failure paths raise a single exception type at the boundary**,52 collapsing padding, length, and authentication failures into one indistinguishable53 error.546. **No branch inside a crypto routine depends on a secret bit.** Use bitwise55 selection or library primitives that document constant-time behavior.567. **CBC uses a fresh random IV per message; ECB is not used for structured data.**57 Prefer an AEAD mode over CBC+MAC when the platform offers one.5859Translate these principles to the audited file's language and crypto library. Use60the documented high-level API (AEAD wrapper, signing context, HMAC primitive,61constant-time-compare helper) — do not assemble these guarantees by hand.6263## Verification6465After rewriting, confirm:6667- [ ] Every AEAD encrypt site uses a fresh CSPRNG nonce or a managed monotonic counter with overflow check68- [ ] No signing call passes a caller-supplied k unless the API documents deterministic k (RFC 6979)69- [ ] No MAC is implemented as `hash(secret || msg)`; HMAC or a MAC primitive is used70- [ ] All MAC, signature, and hash comparisons use a constant-time primitive — never plain equality71- [ ] All decryption failures raise the same exception type at the boundary72- [ ] No branch in the crypto routine depends on a secret bit7374## References7576- CWE-323 ([Reusing a Nonce, Key Pair in Encryption](https://cwe.mitre.org/data/definitions/323.html))77- CWE-330 ([Use of Insufficiently Random Values](https://cwe.mitre.org/data/definitions/330.html))78- CWE-208 ([Observable Timing Discrepancy](https://cwe.mitre.org/data/definitions/208.html))79- CWE-326 ([Inadequate Encryption Strength](https://cwe.mitre.org/data/definitions/326.html))