What we have proved

Each proof repository states every property as a C spec, pins the upstream commit and lists every change made to the code. One command, qp verify, checks a proof again. Each spec has a page with its text, exactly as it is in the repository, and its theorem.

  • zlib 1.3.2, the core library

    zlib da607da7

    What is proved

    Ten properties a user of zlib relies on: compression and decompression are deterministic, decompression does not consume what follows the stream, a round trip gives back exactly the data, too little output space gives Z_BUF_ERROR and the start of the data, the compressed size and the memory of both directions stay within stated bounds, and decompression is memory-safe on any input. The gz* file API and infback.c are not covered.

    Forty-five short specs and 17 longer ones from the first proof. crc32 is proved for its byte-at-a-time loop, not the braided loop of a default x86-64 build.

    Specs
    62
    Bugs found
    Bugs found
    Status
    Proved
    The ten properties
  • WireGuard in Linux

    Linux 551c722f

    What is proved

    Nineteen short specs: the handshake’s keys agree and its secrets are erased, stale, replayed and failed messages change nothing, the replay window accepts each nonce once, and the AEADs give back what they encrypted.

    Nineteen longer specs from the first proof: the handshake in noise.c and cookie.c does what a model of WireGuard’s handshake does, from any state; receive.c’s handshake checks let only messages of the exact type and length through; BLAKE2s, Poly1305 and the two ChaCha20-Poly1305 AEADs compute what reference implementations of RFC 7693, RFC 8439 and the XChaCha draft compute. Four of them put these pieces together the way the data path does, and that glue is assumed or copied, not verified.

    Specs
    38
    Status
    Proved
    The 38 specs
  • OpenSSL’s punycode decoder

    OpenSSL 3.6.5 c8bd5a57

    What is proved

    crypto/punycode.c, the code of CVE-2022-3602 and CVE-2022-3786. Both functions accept any input and give only documented results, decoding follows RFC 3492, the reported sizes are exact, and OpenSSL decodes what an RFC 3492 encoder writes for any sequence of up to 3855 Unicode code points.

    Specs
    19
    Status
    Proved
    The 19 specs
  • zstd’s decoder

    zstd 01b7154f

    What is proved

    Twenty-five short specs: on any bytes the decoder stays within its buffers, frames of Raw and RLE blocks decode to exactly their content, invalid and truncated frames are refused, and the memory held stays within zstd’s own estimates. Nineteen longer specs draw compliant frames, compressed blocks and dictionaries included, within stated bounds.

    Specs
    44
    Bugs found
    Bugs found
    Status
    Proved
    The 44 specs

To check any of them, see Check a proof. What a proved property does and does not say is in What a proof means.