@origin-detect/cli
v0.1.1
Published
Verificación de procedencia C2PA por lotes desde la terminal
Maintainers
Readme
@origin-detect/cli
Verificación de procedencia de contenido por lotes, desde la terminal.
pnpm dlx @origin-detect/cli verify ./fotosSIN C2PA CA-reencodeado.jpg
NO CONFIADO CA.jpg firma valida, firmante no reconocido: C2PA Test Signing Cert
INVALIDO E-sig-CA.jpg claimSignature.mismatch
SIN C2PA IMG_0003.jpg Adobe Lightroom 5.3 (Macintosh)
INDEFINIDO cloudx.jpg manifest remoto no consultado: https://cai-manifests.adobe.com/…
TEXTO notas.txt 4 caracteres invisibles (U+200B, U+202F) — heuristica, no prueba nada
6 archivos: 2 SIN C2PA · 1 NO CONFIADO · 1 INVALIDO · 1 INDEFINIDO · 1 TEXTO[!IMPORTANT] Esto no es un detector de contenido generado por IA. No adivina. Lee Qué no hace antes de usarlo para tomar una decisión editorial.
Instalación
pnpm add -D @origin-detect/cli # en un proyecto
pnpm dlx @origin-detect/cli … # sin instalarRequiere Node 22 o superior. exiftool viene incluido: no hay que instalarlo en el sistema.
Los cinco estados
La mayor parte del valor está aquí. Las herramientas de consumo colapsan la procedencia en un tick verde, y eso oculta justo el caso que le interesa a quien verifica.
| Estado | Significado |
|---|---|
| CONFIABLE | Firma válida y firmante en la lista de confianza del C2PA. |
| NO CONFIADO | Firma criptográficamente válida, pero el firmante no está en ninguna lista reconocida. Cualquiera puede firmar: esto no prueba el origen, y tampoco es sospechoso por sí mismo. |
| INVALIDO | Hay manifest y la validación falla: firma que no cuadra, contenido alterado tras firmar. |
| SIN C2PA | No hay procedencia. No dice nada del origen: la mayoría del contenido del mundo está aquí. |
| INDEFINIDO | No se pudo determinar, con el motivo. Nunca se reporta como SIN C2PA. |
Los códigos crudos de validación van siempre en la salida --json, sin interpretar, para que puedas comprobar el razonamiento.
Un detalle que cuesta ver: el estado depende de la lista de confianza, y esa lista es una foto de un momento. Todas las CAs del C2PA se crearon a partir de mayo de 2025, así que un archivo firmado antes de que la CA de su producto entrara en la lista sale NO CONFIADO por mucho que su firma sea impecable. Cada informe registra el SHA-256 de la lista usada, precisamente para poder explicar eso después.
Opciones
--json informes completos en JSON
--csv una fila por archivo, para hoja de cálculo
--fail-on=<umbral> invalid | untrusted | indeterminate | absent | never
--anchors <fichero> anchors propios en PEM en vez de la lista oficial
--fetch-remote consultar manifests alojados en una URL
--no-metadata no extraer metadatosCódigos de salida
0 ningún archivo alcanzó el umbral · 1 al menos uno lo alcanzó · 2 error de ejecución.
Por defecto solo falla INVALIDO: SIN C2PA es el estado de casi todo el contenido que existe, y hacerlo fallar dejaría la herramienta inservible en CI. --fail-on=absent es el otro extremo: exige que todo sea de confianza.
# en un pipeline de ingesta
origin-detect verify ./entrantes --fail-on=untrustedSobre --fetch-remote
Desactivado por defecto a propósito. Consultar un manifest remoto revela a un tercero que estás verificando un archivo concreto; con material sin publicar eso es una fuga de información, no solo un riesgo técnico. Sin el flag, esos archivos salen como INDEFINIDO con la URL, para que decidas tú. Lo mismo con OCSP, que contactaría con la CA del firmante.
Archivos de texto
Un .txt, .md o .json no puede llevar C2PA, así que no se juzga su procedencia ni cuenta para el umbral. Se informa solo de caracteres Unicode invisibles, que rompen diffs, compiladores y buscadores — razón suficiente para saberlo — y que no prueban generación por IA.
Qué no hace
Escrito antes que el resto, a propósito.
- No detecta SynthID. El patrón y el modelo detector de Google no son públicos, no hay especificación abierta y no está licenciado a terceros. Ninguna herramienta de terceros puede hacerlo, incluidas las que lo anuncian.
- No detecta texto generado por IA. No hay clasificador. Los estudios de 2026 sitúan a esas herramientas entre el 61 % y el 69 % de acierto, con un rendimiento cercano a cero en texto híbrido, y sus falsos positivos ya han hecho daño a personas reales.
- No atribuye proveedor cuando no hay C2PA. Con manifest, el generador viene escrito. Sin manifest no existe señal que permita atribuirlo, y aquí no se inventa ninguna.
- No hay puntuación de riesgo agregada. Un
0.73compuesto con pesos arbitrarios aparenta una precisión que no existe. - No modifica nada. Solo lectura sobre los archivos que analiza.
- No sube nada a ningún sitio. Todo ocurre en tu máquina; la única salida de red posible es
--fetch-remote, y hay que pedirla.
Formatos
image/jpeg, image/png, image/webp para procedencia. .txt, .md, .json para la heurística de texto.
TIFF queda fuera adrede: c2pa-rs sabe leerlo, pero no hemos medido su comportamiento lo suficiente para publicar un veredicto. Ampliar la lista exige un fixture nuevo con su veredicto comprobado.
Licencia
MIT © Adrián Campos Vargas — origin-detect.com
