Security policy

Reporting a vulnerability

Please do not open a public issue for a suspected vulnerability. Use the repository's Security → Report a vulnerability private advisory form, or email the maintainer at ville@vesilehto.fi. Include the affected revision, a reproducer if possible, and your assessment of impact. Receipt should be acknowledged within seven days.

Audit status

Not independently audited. No release should be described as audited unless the audit and the exact audited revision are linked from this file. Passing test vectors, differential tests and tool-based constant-time checks is evidence of correctness, not a security review.

What is verified and what is tested

curve448 has two implementations of the same algorithms: the pure OCaml default, curve448.ocaml (lib/ocaml/), and the optional curve448.c (lib/c/). See docs/design.md.

Side-channel boundary

Both implementations are written to avoid branches and memory access that depend on secret data (private scalars, seeds, nonce prefixes and nonces). Every scalar multiplication, including those in verification, uses the same constant-time algorithms; verification branches only on public validity checks (lengths, point encodings, S < L). See docs/design.md.

This has been checked, not proven:

OCaml gives no constant-time guarantees for its compiler, runtime or garbage collector. The OCaml backend relies on ocamlopt compiling integer arithmetic, shifts and masks to the corresponding machine instructions, on allocation and garbage collection happening at points fixed by the code rather than by data, and on not calling runtime primitives that inspect the contents of arrays holding secrets. The C backend's OCaml layer does not branch on secrets.

Secret material

Protocol-relevant behaviour

Platform requirements