# Credenciales verificables (JWT VC)

TrustOriginality emite **W3C Verifiable Credentials** como JWT firmados con ES256, construidos sobre la estructura de datos existente `trustoriginality-attestation/1.0` y las mismas claves de firma.

**Estado:** emisor no cualificado (QEAA / QTSP es un paso separado de la hoja de ruta).

> Las salidas VC son **documentación de apoyo a la decisión**; no son QEAA, servicios de confianza cualificados eIDAS, certificación gubernamental ni prueba única ante un tribunal sin una revisión cualificada.

## Descubrimiento

| Recurso | URL |
|---------|-----|
| Metadatos del emisor | `GET /.well-known/trustoriginality-credential-issuer.json` |
| Esquema de contenido | `GET /.well-known/vc-schemas/content-authenticity.json` |
| Esquema de análisis | `GET /.well-known/vc-schemas/analysis-report.json` |
| Claves de attestation heredadas | `GET /.well-known/trustoriginality-attestation.json` |

## Tipos de credential

| Tipo | `vct` | Datos de origen |
|------|-------|-----------------|
| `TrustOriginalityContentAuthenticityCredential` | `https://trustoriginality.ai/credentials/v1/content-authenticity` | Registro de provenance |
| `TrustOriginalityAnalysisReportCredential` | `https://trustoriginality.ai/credentials/v1/analysis-report` | Actividad de análisis |

Identificador de formato: `trustoriginality-jwt-vc/1.0`

## Emisión (autenticada, solo propietario del recurso)

La emisión requiere `AnalyzeAccess` (sesión del panel o API key). El usuario autenticado debe ser propietario del registro de provenance o de la ejecución de análisis subyacente.

```bash
# Autenticidad del contenido (hash SHA-256 registrado, solo propietario)
curl -sk "https://panel.trustoriginality.ai/api/credentials/content/{sha256}.jwt" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Informe de análisis (solo propietario)
curl -sk "https://panel.trustoriginality.ai/api/credentials/analysis/{runId}.jwt" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

Los usuarios del panel también pueden descargar VC de análisis desde **Activity Log** (`Download VC`).

Respuesta:

```json
{
  "format": "trustoriginality-jwt-vc/1.0",
  "jwt": "eyJhbGciOiJFUzI1NiIs...",
  "credentialType": "TrustOriginalityContentAuthenticityCredential",
  "subject": "https://panel.trustoriginality.ai/verify/content/{hash}",
  "issuedAt": "2026-06-16T12:00:00Z",
  "expiresAt": "2027-06-16T12:00:00Z",
  "jti": "vc-...",
  "verifyUrl": "https://panel.trustoriginality.ai/api/credentials/verify",
  "legacyAttestationUrl": "https://panel.trustoriginality.ai/api/attestation/content/{hash}.json",
  "nonQualifiedDisclaimer": "..."
}
```

Cada emisión se registra en `Tbl_VerifiableCredentials` (registro de auditoría con `jti`).

## Verificación (pública)

Cualquiera puede verificar un JWT sin autenticación:

```bash
curl -sk -X POST https://panel.trustoriginality.ai/api/credentials/verify \
  -H "Content-Type: application/json" \
  -d '{"jwt":"eyJhbGciOiJFUzI1NiIs..."}'
```

Devuelve validez de firma, expiración, tipo de credential, subject y estado de revocación.

## Revocación (autenticada, propietario emisor)

Revoque una credential emitida previamente mediante `jti` (de la respuesta de emisión o del payload JWT):

```bash
curl -sk -X POST https://panel.trustoriginality.ai/api/credentials/revoke \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jti":"vc-...","reason":"key rotation"}'
```

Las credentials revocadas fallan la verificación con `revoked: true`.

## Configuración

```json
{
  "Credentials": {
    "IssuerBaseUrl": "https://panel.trustoriginality.ai",
    "TtlDays": 365,
    "IssuerDisplayName": "TrustOriginality.ai",
    "LegalEntityName": "Soluzyn OÜ"
  }
}
```

`IssuerBaseUrl` se usa como claim canónico `iss` en los JWT (puede sobrescribirse en `appsettings.Development.json` para pruebas locales, por ejemplo `https://localhost:7270`).

Utiliza la misma clave ECDSA-P256 que las attestation (`Attestation:PrivateKeyPem` o `keys/attestation-signing.pem`).

## Nota legal

Consulte `legal/ACCEPTABLE-USE-POLICY.md` §5 y la AUP pública en `/docs/regulatory/acceptable-use-policy.md`.

## Hoja de ruta (aún no implementado)

- SD-JWT selective disclosure (`_sd` claims)
- OID4VCI issuance protocol + credential offer
- OID4VP presentation exchange
- W3C Status List 2021 (lista de revocación por lotes)
- QEAA / servicio de confianza cualificado (eIDAS 2)

## Código

| Componente | Ruta |
|------------|------|
| Emisor/verificador JWT VC | `TrustOriginality_Global/Credentials/JwtVerifiableCredentialIssuer.cs` |
| Servicio VC | `TrustOriginality_ai_dashboard/Services/VerifiableCredentialService.cs` |
| Rutas API | `TrustOriginality_ai_dashboard/Program.cs` |
| Auditoría de emisión / revocación | `TrustOriginality_ai_db/Scripts/CreateTbl_VerifiableCredentials.sql` |
