Lattice — Cryptographic Bill of Materials

Target: acme-service (demo repository) · Generated: 2026-08-21T07:45:43+00:00 · Lattice v0.4.0 · 5 files scanned

Executive summary

54/100
Post-quantum readiness score. Computed as 100 × (1 − severity-weighted share of findings), weights P0=1.0, P1=0.6, P2=0.3, P3=0.1, compliant=0; findings accepted in lattice.toml are excluded. It measures the composition of the cryptography Lattice could see — it is not a probability of compromise, and it cannot account for code static analysis cannot see.
4
P0 · act now
2
P1 · migrate before quantum
4
P2 · plan migration
0
P3 · monitor
4
Compliant / informational
1 quantum-vulnerable key-establishment or asymmetric-encryption usage(s) create harvest-now-decrypt-later exposure: traffic captured today can be decrypted once a cryptographically relevant quantum computer exists. These are the P0 migration targets (ML-KEM, NIST FIPS 203).

Prioritized findings

PriorityAlgorithmLocationQuantumClassicalConfidenceRemediation
P0MD5src/auth.py:5n/abrokenhighSHA-256 or stronger (SHA-384/SHA-3 preferred long-term)
P0RSA (2048-bit)src/auth.py:6brokensecurehighML-KEM (FIPS 203) for encryption/key transport; ML-DSA (FIPS 204) for signatures
P0AES / ECBsrc/auth.py:8weakenedbroken-usagehighAES-256
P0RC4tls.conf:2n/abrokenmediumAES-256 (GCM) or ChaCha20-Poly1305
P1ECDSAsrc/Sign.java:4brokensecuremediumML-DSA (FIPS 204) or SLH-DSA (FIPS 205)
P1ECDSA (SECP256R1)src/auth.py:7brokensecurehighML-DSA (FIPS 204) or SLH-DSA (FIPS 205)
P2AES / GCMsrc/Sign.java:5weakenedsecuremediumAES-256
P2TLS-1.0tls.conf:1n/adeprecatedmediumTLS 1.2 or newer (prefer TLS 1.3)
P2TLS-1.1tls.conf:1n/adeprecatedmediumTLS 1.2 or newer (prefer TLS 1.3)
P23DEStls.conf:2weakeneddeprecatedmediumAES-256

Breakdown by detector

DetectorAssetsWorst priority
config5P0
dependency2ok
java2P1
python5P0

All findings

P0 · act now (4)

P0 MD5 high
src/auth.py:5 · detector: python
MD5 is classically broken today, independent of quantum computing; replace immediately.
Remediation: SHA-256 or stronger (SHA-384/SHA-3 preferred long-term)
def token(d): return hashlib.md5(d).hexdigest()
P0 RSA (2048-bit) high
src/auth.py:6 · detector: python
RSA asymmetric-cipher is broken by Shor's algorithm and captured ciphertext is decryptable later (harvest-now-decrypt-later).
Remediation: ML-KEM (FIPS 203) for encryption/key transport; ML-DSA (FIPS 204) for signatures
def session_key(): return rsa.generate_private_key(public_exponent=65537, key_size=2048)
P0 AES / ECB high
src/auth.py:8 · detector: python
AES in ECB mode is structurally unsafe today (identical plaintext blocks leak); switch to an AEAD mode such as GCM.
Remediation: AES-256
key size not determined from call site
def legacy(k, iv, d): return Cipher(algorithms.AES(k), modes.ECB()).encryptor().update(d)
P0 RC4 medium
tls.conf:2 · detector: config
RC4 is classically broken today, independent of quantum computing; replace immediately.
Remediation: AES-256 (GCM) or ChaCha20-Poly1305
cipher-suite configuration contains RC4
ssl_ciphers 'RC4:3DES:HIGH:!aNULL';

P1 · migrate before quantum (2)

P1 ECDSA medium
src/Sign.java:4 · detector: java
ECDSA signature is broken by Shor's algorithm; migrate before quantum capability arrives (no harvest-now-decrypt-later capture value).
Remediation: ML-DSA (FIPS 204) or SLH-DSA (FIPS 205)
Signature s() throws Exception { return Signature.getInstance("SHA256withECDSA"); }
P1 ECDSA (SECP256R1) high
src/auth.py:7 · detector: python
ECDSA signature is broken by Shor's algorithm; migrate before quantum capability arrives (no harvest-now-decrypt-later capture value).
Remediation: ML-DSA (FIPS 204) or SLH-DSA (FIPS 205)
def sign_key(): return ec.generate_private_key(ec.SECP256R1())

P2 · plan migration (4)

P2 AES / GCM medium
src/Sign.java:5 · detector: java
AES is weakened by Grover's algorithm; AES-256 restores the margin.
Remediation: AES-256
Cipher c() throws Exception { return Cipher.getInstance("AES/GCM/NoPadding"); }
P2 TLS-1.0 medium
tls.conf:1 · detector: config
TLS-1.0 is deprecated for new use; plan migration to TLS 1.2 or newer (prefer TLS 1.3).
Remediation: TLS 1.2 or newer (prefer TLS 1.3)
TLS protocol version enabled in configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
P2 TLS-1.1 medium
tls.conf:1 · detector: config
TLS-1.1 is deprecated for new use; plan migration to TLS 1.2 or newer (prefer TLS 1.3).
Remediation: TLS 1.2 or newer (prefer TLS 1.3)
TLS protocol version enabled in configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
P2 3DES medium
tls.conf:2 · detector: config
3DES is deprecated for new use; plan migration to AES-256.
Remediation: AES-256
cipher-suite configuration contains 3DES
ssl_ciphers 'RC4:3DES:HIGH:!aNULL';

Compliant / informational (4)

ok cryptography high
requirements.txt:1 · detector: dependency
declared dependency; usage not confirmed by a call site
declared dependency; usage not confirmed by a call site
cryptography==42.0.5
ok pycrypto high
requirements.txt:2 · detector: dependency
declared dependency; usage not confirmed by a call site (unmaintained since 2014; migrate to pycryptodome or cryptography)
declared dependency; usage not confirmed by a call site (unmaintained since 2014; migrate to pycryptodome or cryptography)
pycrypto==2.6.1
ok AES-256 / GCM high
src/auth.py:9 · detector: python
AES-256 is quantum-resistant and classically secure.
def seal(d): return AESGCM(AESGCM.generate_key(bit_length=256)).encrypt(b"0"*12, d, None)
ok TLS-1.2 medium
tls.conf:1 · detector: config
TLS-1.2 is quantum-resistant and classically secure.
TLS protocol version enabled in configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;