Nivel 6 · La verificación con clave pública
This content is not available in your language yet.
§3 — Aitor verifica con una clave pública
Sección titulada «§3 — Aitor verifica con una clave pública»Aitor nunca tiene una clave privada, nunca recibe los datos de origen y nunca mueve un byte del modelo. Tiene una sola cosa por proveedor: la clave pública, que cada repositorio de entrega compromete como .froga/PUBKEY.txt. Así que puede ejecutar froga verify sin ningún flag (lee la pubkey confirmada) o, si ancla la clave él mismo, --pubkey <hex>.
Lo que froga verify hace es local y criptográfico. Para cada artefacto presente comprueba: el sobre DSSE in-toto (payloadType application/vnd.in-toto+json), que el keyid sea igual a sha256(clave pública), que la firma ECDSA-P256 sobre el DSSE PAE sea válida, y que el subject digest in-toto sea igual a sha256(bytes del artefacto). Sale con 0 si y solo si todos los artefactos presentes verifican — y un artefacto presente al que le falta su .sig lo hace fallar. No hace ninguna llamada de red y no mueve ningún dato: puramente el sistema de ficheros local sobre .froga/bundle.json(+.sig), reconstruct.json(+.sig), conformance/*.json(+.sig) y risk-projection/*.json(+.sig). La CLI en Rust (crates/froga-cli/src/cmd/verify.rs) y el TS de la nube (cloud/lib/froga/verify.ts) son espejos diseñados del mismo contrato criptográfico.
Aitor clona cada entrega y ejecuta un comando. Aquí está el Proveedor A — el cribador de retina de Ollomar Diagnóstica:
📍 reproducir retina-delivery-v1.0.0-blocked
cribador de retina de Ollomar — firma VÁLIDA, barrera BLOQUEADA
git clone https://github.com/Venturalitica/vldemo-retina-delivery
cd vldemo-retina-delivery
git switch -c try retina-delivery-v1.0.0-blockedCon el repositorio ya situado en el hito (chip de arriba), Aitor ejecuta:
froga verify --repo . # solo clave pública (confirmada en .froga/PUBKEY.txt) — sin clave privada, sin red, sin datosfroga 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.jsonfirma VÁLIDA (7/7)# Glosa: «froga verify — 7 artefacto(s) contra la clave pública 042b91f8…f57703f» / cada ✓ = la# firma de ese artefacto es auténtica / «firma VÁLIDA (7/7)» = FIRMA VÁLIDA, los 7 verifican → código de salida 0.# Nota: la 7ª línea es el cruce documental de MDR (conformance/eu_mdr_2017.json): presente y FIRMADO — un cruce documental, no un veredicto.→ código de salida 0 — cada uno de los 7 artefactos es auténtico. Y sin embargo la barrera de aceptación del pliego para esta entrega está BLOQUEADA: su control bloqueante model-dr-sensitivity está en ROJO (passed=false — recall 0.414 < 0.80, un déficit de exactitud del Art. 15 de la Ley de IA). Otros controles son warn (no bloqueantes) y pasan.
Ahora el Proveedor B — el modelo de educación de EduAtlante Analytics:
📍 reproducir quickstart-delivery-v1.0.0-accepted
modelo de educación de EduAtlante — firma VÁLIDA, barrera ACEPTADA
git clone https://github.com/Venturalitica/vldemo-quickstart-delivery
cd vldemo-quickstart-delivery
git switch -c try quickstart-delivery-v1.0.0-acceptedCon el repositorio ya situado en el hito (chip de arriba), Aitor ejecuta:
froga verify --repo .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.jsonfirma VÁLIDA (6/6)# Glosa: «froga verify — 6 artefacto(s) contra la clave pública 047751c9…930d4b1» / cada ✓ auténtico /# «firma VÁLIDA (6/6)» = FIRMA VÁLIDA, los 6 verifican → código de salida 0.# Nota: 6 artefactos, NO 7 — aquí NO hay cruce documental de MDR (un modelo de educación, no un dispositivo médico).→ código de salida 0 — cada uno de los 6 artefactos es auténtico. La barrera de aceptación del pliego para esta entrega está ACEPTADA: su control bloqueante fairness-parity está en VERDE (passed=true), y ningún control bloqueante está en ROJO.