espuni·
← Demo de verificación de edad
Prueba de edad Zero-Knowledge

Una prueba Zero-Knowledge (longfellow-zk, EU AV Blueprint Annex A §A.8 — el esquema que genera Google Wallet) demuestra age_over_18 a partir de una credencial mdoc real sin revelar la credencial, la firma del emisor ni nada más. Abajo, cómo construimos y validamos nuestro verifier en tres fases — cada una un paso más cerca de una wallet real. Todo ejecuta el verifier nativo en el servidor; cada proof es descargable para que la re-verifiques tú mismo (al final).

~360 KBpor proof <1 sverificación en servidor 1 bitrevelado
1 · ¿El verifier funciona de verdad?

La base. Nuestro verifier nativo longfellow-zk se ejecuta contra los testvectors oficiales del propio esquema: debe aceptar una proof legítima y rechazar cualquier forma de falsificación. Es la prueba de concepto de la que arrancó todo.

Proof legítima → aceptada

Una proof real (credencial eu.europa.ec.av.1, age_over_18 = true) verificada contra el circuit v7. Prueba que el verifier acepta una proof válida.

Proof manipulada → rechazada

La misma proof válida con un byte alterado en sus ~360 KB. Prueba la integridad: cualquier alteración rompe la verificación.

Replay de otra sesión → rechazada

Una proof válida presentada con el transcript de otra sesión. Prueba el binding de sesión: una proof no se puede reutilizar en otro sitio.

Menor afirmando ser adulto → rechazada

Una credencial real con age_over_18 = false intentando afirmar true. Prueba el binding del statement: no puedes demostrar lo que la credencial no dice.

2 · De testvectors a una credencial real

Se acabaron los datos enlatados. Elige una edad: un emisor de demo minta una credencial ISO 18013-5 real al momento, y la probamos y verificamos de punta a punta — el pipeline completo emisión → prueba → verificación bajo nuestro control.

Emitir → probar → verificar

Mueve el slider a cualquier edad. Un emisor de demo minta un mdoc ISO 18013-5 real al momento (claves y sesión frescas), el prover construye la proof de ~360 KB a partir de él, y el verifier comprueba el statement "mayor de 18". Con menos de 18 la proof simplemente no puede afirmar ser adulto — pruébalo.

25
3 · El flujo real de producción ✓ interop verificada con el AV app de referencia

El pipeline exacto de Relying Party sobre la Digital Credentials API (ISO 18013-7): construimos la request cifrada que un navegador entrega a la wallet, la wallet responde con una proof cifrada, y la desciframos y verificamos. Es real — verificado de punta a punta contra el AV app oficial de referencia presentando una credencial Proof-of-Age genuina (emisor "Age Verification Reference Implementation"). "Ejecutar el flujo con wallet" simula la wallet para visitantes sin teléfono; "Con tu teléfono" lo ejecuta de verdad.

Wallet ↔ RP sobre DC API

El intercambio completo: construimos la request DC API (zkRequest + una clave HPKE), la wallet responde con un zkDocuments cifrado, y lo desciframos, tomamos la clave del emisor del certificado de la credencial y verificamos la proof — transcript "dcapi", HPKE P-256/AES-128-GCM, exactamente como lo hace el AV app de referencia. El veredicto tiene tres comprobaciones: la proof verifica, su timestamp es fresco, y el Document Signer del emisor está en la AV Trusted List real de la UE (ETSI TS 119 612, con la firma pineada al operador del esquema de la CE). Elige una edad para ejecutarlo contra la wallet simulada —cuyo emisor efímero NO está en la lista a propósito, así que falla la comprobación de confianza— o usa "Con tu teléfono" para presentar desde el AV app real, cuyo emisor (DS-001) sí está en la lista y debería pasar las tres.

25

En un teléfono Android con el AV app + una credencial de edad: esto lanza una request DC API real, el app responde con una proof ZK cifrada y la verificamos. Sin slider de edad — usa la credencial que tenga la wallet. Vale cualquier wallet que hable el mismo perfil (mdoc eu.europa.ec.av.1, longfellow zk v7); con una credencial autofirmada o de test verás las dos primeras comprobaciones en verde y la de confianza en rojo — eso es que el emisor no está en la lista europea, no que tu prueba falle.

Transparencia: el verifier es real y nuestro, y el flujo "Con tu teléfono" está verificado de punta a punta contra el AV app oficial de referencia. El botón "Ejecutar el flujo con wallet" simula la wallet en el servidor para que los visitantes sin teléfono también lo vean. En cualquier caso, cada ejecución publica su evidencia abajo — descarga la proof y re-verifícala tú mismo, fuera de nuestra infraestructura.

Verifier nativo longfellow-zk (Apache-2.0, google/longfellow-zk vía el build de dyne/longfellow-zk) ejecutado en el servidor. Circuit v7, hash fijado contra la tabla kZkSpecs publicada. Demo pública con rate limit.