Skip to content

Level 6 · The verification with a public key

Aitor never holds a private key, never receives the source data, and never moves a model byte. He holds one thing per supplier: the public key, which each delivery repo commits as .froga/PUBKEY.txt. So he can run froga verify with no flag at all (it reads the committed pubkey) or, if he pins the key himself, --pubkey <hex>.

What froga verify does is local and cryptographic. For each present artefact it checks: the DSSE in-toto envelope (payloadType application/vnd.in-toto+json), that the keyid equals sha256(public key), that the ECDSA-P256 signature over the DSSE PAE is valid, and that the in-toto subject digest equals sha256(artifact bytes). It exits 0 iff every present artefact verifies — and a present artefact that is missing its .sig makes it fail. It makes no network calls and moves no data: purely the local filesystem over .froga/bundle.json(+.sig), reconstruct.json(+.sig), conformance/*.json(+.sig), and risk-projection/*.json(+.sig). The Rust CLI (crates/froga-cli/src/cmd/verify.rs) and the cloud TS (cloud/lib/froga/verify.ts) are designed mirrors of the same crypto contract.

Aitor clones each delivery and runs one command. Here is Supplier A — Ollomar Diagnóstica’s retina screener:

📍 reproducir retina-delivery-v1.0.0-blocked

Ollomar's retina screener — firma VÁLIDA, gate BLOCKED

git clone https://github.com/Venturalitica/vldemo-retina-delivery
cd vldemo-retina-delivery
git switch -c try retina-delivery-v1.0.0-blocked

With the repo already at the milestone (chip above), Aitor runs:

Aitor's terminal — Supplier A (Ollomar Diagnóstica, retina screener)
froga verify --repo . # public key only (committed at .froga/PUBKEY.txt) — no private key, no network, no data
Real output (froga 0.1.1) — verbatim; glossed in English in the comments
froga verify — 7 artefacto(s) contra la clave pública 042b91f8…f57703f
✓ bundle.json
✓ reconstruct.json
✓ conformance/eu_mdr_2017.json
✓ conformance/eu_pren-18228_2026.json
✓ conformance/eu_pren-18282_2026.json
✓ conformance/eu_pren-18283_2026.json
✓ conformance/iso_23894_2023.json
firma VÁLIDA (7/7)
# Gloss: "froga verify — 7 artefact(s) against public key 042b91f8…f57703f" / each ✓ = that
# artefact's signature is authentic / "firma VÁLIDA (7/7)" = SIGNATURE VALID, all 7 verify → exit code 0.
# Note the 7th-line MDR crosswalk (conformance/eu_mdr_2017.json): present and SIGNED — a cross-map, not a verdict.

exit code 0 — every one of the 7 artefacts is authentic. And yet the tender acceptance gate for this delivery is BLOCKED: its blocking control model-dr-sensitivity is RED (passed=false — recall 0.414 < 0.80, an AI Act Art. 15 accuracy shortfall). Other controls are warn (non-blocking) and pass.

Now Supplier B — EduAtlante Analytics’ education model:

📍 reproducir quickstart-delivery-v1.0.0-accepted

EduAtlante's education model — firma VÁLIDA, gate ACCEPTED

git clone https://github.com/Venturalitica/vldemo-quickstart-delivery
cd vldemo-quickstart-delivery
git switch -c try quickstart-delivery-v1.0.0-accepted

With the repo already at the milestone (chip above), Aitor runs:

Aitor's terminal — Supplier B (EduAtlante Analytics, education model)
froga verify --repo .
Real output (froga 0.1.1) — verbatim; glossed in English in the comments
froga verify — 6 artefacto(s) contra la clave pública 047751c9…930d4b1
✓ bundle.json
✓ reconstruct.json
✓ conformance/eu_pren-18228_2026.json
✓ conformance/eu_pren-18282_2026.json
✓ conformance/eu_pren-18283_2026.json
✓ conformance/iso_23894_2023.json
firma VÁLIDA (6/6)
# Gloss: "froga verify — 6 artefact(s) against public key 047751c9…930d4b1" / each ✓ authentic /
# "firma VÁLIDA (6/6)" = SIGNATURE VALID, all 6 verify → exit code 0.
# Note: 6 artefacts, NOT 7 — there is NO MDR crosswalk here (an education model, not a medical device).

exit code 0 — every one of the 6 artefacts is authentic. The tender acceptance gate for this delivery is ACCEPTED: its blocking control fairness-parity is GREEN (passed=true), and no blocking control is RED.