claim_text: mlkem-native is a secure, fast, and portable C90[^C90] implementation of ML-KEM[^FIPS203].

kind: standards-conformance

reason: ML-KEM by NIST's own vectors (5/5, counterfactual 0/5), but the sources do not compile under `-std=c90 -Wpedantic -Werror`: `'long long' is an extension when C99 mode is not enabled [-Werror,-Wlong-long]` -- C90 with a C99 extension every current compiler accepts, which is a fair reading of the sentence and a precise one of the code

target: pq-code-package/mlkem-native

verdict: PARTIAL


claim_text: It is a fork of the ML-KEM reference implementation[^REF].

kind: provenance

reason: no shared git history with pq-crystals/kyber (no merge base), so `fork` is a lineage statement git cannot confirm; 5 of 11 reference source file names recur in mlkem/src (fips202.c, indcpa.c, kem.c, poly.c, verify.c)


kind: ci-status

reason: the badge reports a passing build for a branch that exists

verdict: REPRODUCED


claim_text: All C code in mlkem/src/* and mlkem/src/fips202/* is proved memory-safe (no memory overflow) and type-safe (no integer overflow) using CBMC[^CBMC]. All AArch64 and x86_64 assembly is proved to be functionally correct, memory-safe, and of secret-independent timing (constant-time), using HOL-Light[^HOL-Light].

kind: assurance

reason: proof artefacts are present at the pinned commit (191 CBMC proof directories, 54 HOL Light proof files) and were NOT re-run here (cbmc is on this host, hol-light is not; re-running 191 CBMC harnesses is a bounded next step, not done in this pass). Presence of a proof is not a proof; the sentence's own SOUNDNESS.md caveat applies


claim_text: # Build and run tests [...] make build [...] make test

kind: build

reason: `make build` and `make test` both exit 0 on macOS arm64 (56.7 s), beyond the Ubuntu the sentence names


claim_text: mlkem-native is tested against all official ACVP ML-KEM test vectors[^ACVP] and the Wycheproof[^wycheproof] ML-KEM test vectors.

reason: the target's own ACVP client and Wycheproof client both exit 0 at the pinned commit (6 ACVP vector files present after the run)


claim_text: libOQS of the Open Quantum Safe project since 0.13.0 (as the default ML-KEM implementation)

kind: adoption

reason: liboqs 0.13.0's and 0.16.0's ML-KEM CMake lists both build from mlkem-native source directories and the ML-KEM-768 option defaults ON in 0.16.0 (read from the release tarballs, sha256 recorded)


claim_text: The target controls every public-registry package name that carries its own name.

kind: supply-chain

reason: 2 of 2 packages carrying the target's name across 2 registries are published by someone else: mlkem@npm, mlkem@pypi

verdict: REFUTED


claim_text: No third-party patent reads on the target's algorithm.

kind: freedom-to-operate

reason: 2 of 3 patent endpoints are blind without a credential -- including 1 that answers HTTP 200 with a payload that is not the documented media type -- and the only endpoint that returns data is undocumented, so a freedom-to-operate opinion cannot rest on it. ABSENCE OF EVIDENCE IS RECORDED HERE, NOT ABSENCE

verdict: UNVERIFIABLE


claim_text: No committed notebook output in the target disagrees with re-execution.

kind: evidence-integrity

reason: 1259 files scanned at the pinned commit and the target contains no notebooks, so no committed output can disagree with re-execution


claim_text: Published datasets substantiate or contradict the target's claims.

reason: datasets exist and were not all examined


claim_text: This repository contains the official reference implementation of the Dilithium signature scheme

reason: the artefact at the pinned commit runs: the target's own 10000-iteration self test exits 0, and the repository is `pq-crystals/dilithium` -- the organisation Dilithium is published under. THE WORD `official` IS NOT ITSELF TESTABLE from here; what is established is provenance-by-ownership plus a working artefact

target: pq-crystals/dilithium


claim_text: Dilithium is standardized as FIPS 204.

reason: NIST's own ML-DSA-65 keyGen vectors reproduce byte-for-byte through the target's `crypto_sign_keypair` on 5/5 cases with the seed pinned; reverting the single FIPS 204 domain-separation line in the target's own source takes that to 0/5; the README identifies the code as FIPS 204 and it is


reason: the badge's data source answers 404 for this repository on both travis-ci.com and travis-ci.org, the branch the badge is pinned to is not in the remote's refs, and GitHub Actions reports zero runs. NOTE THE SCOPE: travis-ci.org was decommissioned in 2021, so its 404 is a statement about the service as much as about this repository. What is established is that NO CI RESULT IS DISCOVERABLE from the two systems the badge and the host offer -- not that none ever ran

verdict: UNSUPPORTED


kind: coverage

reason: the coverage record exists but is over a year old


claim_text: To compile the test programs on Linux or macOS, go to the `ref/` or `avx2/` directory and run [...] make [...] This produces the executables [...] test/test_dilithium$ALG test/test_vectors$ALG [...] where `$ALG` ranges over the parameter sets 2, 3, and 5.

reason: the documented command exits 0 and produces all 6 named executables (only `ref/` was built; the sentence also names `avx2/`, which is x86-only and was not attempted on this host)


claim_text: `test_dilithium$ALG` tests 10000 times to generate keys, sign a random message of 59 bytes and verify the produced signature. [...] The program will abort with an error message and return -1 if there was an error. Otherwise it will output the key and signature sizes and return 0.

kind: self-test

reason: exit code 0 and the key and signature sizes printed: publickey=1952, secretkey=4032, signature=3309


claim_text: `test_vectors$ALG` performs further tests of internal functions and prints deterministically generated test vectors for several intermediate values that occur in the Dilithium algorithms. [...] This program is meant to help to ensure compatibility of independent implementations.

kind: determinism

reason: two independent runs produced byte-identical, NON-EMPTY output


claim_text: All implementations can be compiled into shared libraries by running [...] make shared [...] this produces the libraries [...] libpqcrystals_dilithium$ALG_ref.so

reason: `make shared` produced 0 of 4 named libraries on macOS: the link fails on an unresolved `_randombytes` (the shared target omits randombytes.c, which a Linux .so tolerates and a macOS dylib does not). SCOPE: refuted on one of the two operating systems the README's build section names; not attempted on Linux


claim_text: By default our code implements Dilithium's hedged signing mode. To change this to the deterministic signing mode, undefine the `DILITHIUM_RANDOMIZED_SIGNING` preprocessor macro at compilation

kind: configuration

reason: config.h defines DILITHIUM_RANDOMIZED_SIGNING and two signatures of one message under one key differ while both verify: the default is hedged, as stated


reason: 4 of 4 packages carrying the target's name across 2 registries are published by someone else: dilithium-crystals@npm, dilithium-py@pypi, dilithium@npm, pqc-dilithium@npm


reason: 95 files scanned at the pinned commit and the target contains no notebooks, so no committed output can disagree with re-execution


reason: 3 keyword searches of ONE dataset index (Hugging Face) answered and none returned a dataset. THAT IS NOT A UNIVERSAL NEGATIVE and the first revision of this sentence stated one: published data bearing on this target certainly exists -- NIST's own ACVP vectors, which the regulatory connector fetched three rows above. What is measured is that the index most likely to hold community datasets holds none under these keywords


claim_text: This repository contains the official reference implementation of the Kyber key encapsulation mechanism

reason: the artefact at the pinned commit runs: the target's own 1000-iteration self test exits 0, and the repository is `pq-crystals/kyber` -- the organisation Kyber is published under. THE WORD `official` IS NOT ITSELF TESTABLE from here and neither measurement establishes it; what is established is provenance-by-ownership plus a working artefact

target: pq-crystals/kyber


claim_text: Kyber has been selected for standardization in round 3 of the NIST PQC standardization project.

reason: AS A STATEMENT ABOUT THE ALGORITHM'S HISTORY THIS SENTENCE IS TRUE AND IS NOT WHAT IS TESTED HERE. What is tested is the sentence READ AS AN IDENTIFICATION of the code in this repository, which is the only thing on the front page that says which Kyber this is -- and read that way it is refuted. NIST's own ML-KEM-768 keyGen vectors reproduce byte-for-byte through the target's `crypto_kem_keypair_derand` on 5/5 cases, so the code is FIPS 203; reverting the single FIPS 203 domain-separation line in the target's own source takes that to 0/5. The README never says FIPS 203 of this code


kind: quality-evidence


reason: the coverage number is published for a branch the repository does not have; the underlying record is 2001 days old, and querying the branch that does exist returns that same stale record rather than an answer about it


claim_text: To compile the test and benchmarking programs on Linux or macOS, go to the `ref/` or `avx2/` directory and run make [...] This produces the executables test/test_kyber$ALG test/test_vectors$ALG test/test_speed$ALG where `$ALG` ranges over the parameter sets 512, 768, 1024.

kind: reproducibility

reason: the documented command fails on one of the two operating systems the sentence names, producing 0 of 9 named executables; deviating from it by removing exactly one option, `-z noexecstack`, from the target's own CFLAGS yields 6, and test_speed1024, test_speed512, test_speed768 remain unbuildable for an independent reason. Only `ref/` was built; the sentence also names `avx2/`, which was not attempted


claim_text: `test_kyber$ALG` tests 1000 times to generate keys, encapsulate a random key and correctly decapsulate it again. [...] The program will abort with an error message and return 1 if there was an error. Otherwise it will output the key and ciphertext sizes and return 0.

kind: functional

reason: exit code 0 and all three sizes printed: ciphertext=1088, publickey=1184, secretkey=2400


claim_text: `test_vectors$ALG` generates 10000 sets of test vectors containing keys, ciphertexts and shared secrets [...] The required random bytes are deterministic and come from SHAKE128 on empty input.

reason: two independent runs produced byte-identical, NON-EMPTY output (10000 vector sets)


claim_text: We no longer actively maintain this software, at least not to the extent that would be necessary to recommend it for production use.

kind: disclosure

reason: 4 commits in the last 365 days, 0 releases, 30 open issues and no hosted CI workflow: the disclosure is borne out

verdict: CORROBORATED


claim_text: The target controls every public-registry package name that carries its own name.

reason: 6 of 6 packages carrying the target's name across 2 registries are published by someone else: kyber-crystals@npm, kyber-py@pypi, kyber@npm, kyber@pypi, pqc-kyber@npm, pykyber@pypi


claim_text: No third-party patent reads on the target's algorithm.

reason: 2 of 3 patent endpoints are blind without a credential -- including 1 that answers HTTP 200 with a payload that is not the documented media type -- and the only endpoint that returns data is undocumented, so a freedom-to-operate opinion cannot rest on it. ABSENCE OF EVIDENCE IS RECORDED HERE, NOT ABSENCE


claim_text: No committed notebook output in the target disagrees with re-execution.

reason: 100 files scanned at the pinned commit and the target contains no notebooks, so no committed output can disagree with re-execution


claim_text: Published datasets substantiate or contradict the target's claims.