Design-level security
for the AI era.

An applied cryptography practice. We audit at the layer above implementation — protocol architecture, primitive selection, threat modeling, formal verification — where AI bug-finders cannot help and humans still must.

verifpal · simple.vp
Attack found
attacker[active]
 
principal Alice[
  knows public c0
  generates a
  ga = G^a
]
Alice Bob: ga
 
principal Bob[
  knows public c0
  generates m1, b
  gb = G^b
  gab = ga^b
  e1 = AEAD_ENC(gab, m1, c0)
]
Bob Alice: gb, e1
protocol diagram 2 actors · 2 messages
alice bob ga gb, e1
queries — security goals
confidentiality? m1 ATTACK FOUND
authentication? Bob → Alice: e1 ATTACK FOUND

Our practice areas

From the audit floor

Bug classes we keep finding. Anonymized; representative; the kind of thing AI bug-finders catch after we have already shipped a fix.

Bug class · Cryptographic implementation
r = ntt_inv(c)
// no r < q check

Missing modulus check, NTT inverse

Found in 3 audits 5 codebases
Bug class · Side channels
if (secret_bit) {
  ec_double(P)// timing
}

Constant-time leak in ECC point doubling

Found in 2 audits Wallet · VPN
Bug class · Protocol composition
nonce counter++
// race: two senders,
// same n → ENC reuse

AEAD nonce reuse under concurrent state

Found in 4 audits 2 messengers
Bug class · PQ rounding
q_half = (q + 1) >> 1
// ⌊⌋ used, ⌈⌉ needed

Incorrect rounding in lattice solver

Found in 2 audits ML-KEM impls
Bug class · Validation
K = a · peer_pk
// missing:
// peer_pk 𝒢′

Public key not validated to correct subgroup

Found in 3 audits 2 wallets
Bug class · Parsing
len = read_u32(buf)
read(buf, len)
// len is hostile

Unchecked length field in TLV parser

Found in 5 audits 3 protocols
№ 12 — Conformance testing

Crucible.
Bug classes,
encoded as tests.

129 tests across 12 categories, each tagged with the bug class, the FIPS spec section, and the audit it came from. Wire any ML-KEM or ML-DSA implementation up over stdin/stdout. Pass or fail in seconds.

129tests
12categories
15implementations tested
5languages supported
View on GitHub →
crucible · ml-kem-768.run
Running
tests passed
127 / 129
98.4% pass 2 fail
key generation12/12
encapsulation14/14
decapsulation11/11
NTT bounds7/8
rejection sampling9/9
serialization14/14
decompression5/6
hash domain sep8/8
parameter hygiene11/11

From the lab

Recent writing All posts →
2026.05.08 · Software

hpke-ng: Faster, Smaller, Harder HPKE for Rust

Across 44 head-to-head benchmarks against hpke-rs, hpke-ng wins on 16 and ties the rest, ships a 30% smaller binary, 36% less project code, and a type system that catches four classes of bug at compile time.

Read →
2026.05.06 · Research

Announcing the Post-Quantum Migration Playbook

A 52-page practitioner guide for engineers and architects working on post-quantum migration, alongside an interactive scorecard and TLS scanner at pq-migration.symbolic.software.

Read →
2026.04.20 · Software

Verifpal 0.51.0: Sharper Semantics for Passwords, Assertions, and AEAD

Verifpal 0.51.0 tightens the analysis engine's treatment of password-qualified values, checked ASSERT? assertions, and AEAD associated data, all on the back of excellent bug reports from the community.

Read →
CEDARCRYPT 2026 · PAPHOS, CYPRUS

Summer school for applied cryptographers.

65 DAYS
UNTIL JULY 13

The conference

4 days Paphos, Cyprus AUB Mediterraneo
ASummer school — workshops on PQC, secure messaging, formal verification3 days
BResearch conference — peer-reviewed talks1 day
CFP closes April 10, 2026submission
Student scholarshipsPQShield + Zama
View full program at cedarcrypt.org →
Trusted by