# Identifiants vérifiables (JWT VC)

TrustOriginality émet des **W3C Verifiable Credentials** sous forme de JWT signés ES256, construits sur la structure de données existante `trustoriginality-attestation/1.0` et les mêmes clés de signature.

**Statut :** émetteur non qualifié (QEAA / QTSP constitue une étape distincte de la feuille de route).

> Les sorties VC sont une **documentation d'aide à la décision** ; elles ne constituent ni QEAA, ni service de confiance eIDAS qualifié, ni certification gouvernementale, ni preuve unique devant un tribunal sans revue qualifiée.

## Découverte

| Ressource | URL |
|-----------|-----|
| Métadonnées de l'émetteur | `GET /.well-known/trustoriginality-credential-issuer.json` |
| Schéma contenu | `GET /.well-known/vc-schemas/content-authenticity.json` |
| Schéma analyse | `GET /.well-known/vc-schemas/analysis-report.json` |
| Clés d'attestation historiques | `GET /.well-known/trustoriginality-attestation.json` |

## Types de credential

| Type | `vct` | Données source |
|------|-------|----------------|
| `TrustOriginalityContentAuthenticityCredential` | `https://trustoriginality.ai/credentials/v1/content-authenticity` | Registre de provenance |
| `TrustOriginalityAnalysisReportCredential` | `https://trustoriginality.ai/credentials/v1/analysis-report` | Activité d'analyse |

Identifiant de format : `trustoriginality-jwt-vc/1.0`

## Émission (authentifiée – propriétaire de la ressource uniquement)

L'émission nécessite `AnalyzeAccess` (session panel ou clé API). L'utilisateur authentifié doit être propriétaire de l'enregistrement de provenance ou du run d'analyse sous-jacent.

```bash
# Authenticité du contenu (hachage SHA-256 enregistré, propriétaire uniquement)
curl -sk "https://panel.trustoriginality.ai/api/credentials/content/{sha256}.jwt" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Rapport d’analyse (propriétaire uniquement)
curl -sk "https://panel.trustoriginality.ai/api/credentials/analysis/{runId}.jwt" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

Les utilisateurs du panel peuvent également télécharger les VC d'analyse depuis **Activity Log** (`Download VC`).

Réponse :

```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": "..."
}
```

Chaque émission est enregistrée dans `Tbl_VerifiableCredentials` (journal d'audit avec `jti`).

## Vérification (publique)

N'importe qui peut vérifier un JWT sans authentification :

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

La réponse renvoie la validité de la signature, l'expiration, le type de credential, le subject et l'état de révocation.

## Révocation (authentifiée – propriétaire émetteur)

Révoquez une credential précédemment émise via `jti` (depuis la réponse d'émission ou le 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"}'
```

Les credentials révoquées échouent à la vérification avec `revoked: true`.

## Configuration

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

`IssuerBaseUrl` est utilisé comme claim canonique `iss` dans les JWT (modifiable dans `appsettings.Development.json` pour les tests locaux, par ex. `https://localhost:7270`).

Le système utilise la même clé ECDSA-P256 que les attestations (`Attestation:PrivateKeyPem` ou `keys/attestation-signing.pem`).

## Note juridique

Voir `legal/ACCEPTABLE-USE-POLICY.md` §5 et l'AUP publique à `/docs/regulatory/acceptable-use-policy.md`.

## Feuille de route (pas encore implémenté)

- SD-JWT selective disclosure (`_sd` claims)
- OID4VCI issuance protocol + credential offer
- OID4VP presentation exchange
- W3C Status List 2021 (liste de révocation groupée)
- QEAA / service de confiance qualifié (eIDAS 2)

## Code

| Composant | Chemin |
|-----------|--------|
| Émetteur/vérificateur JWT VC | `TrustOriginality_Global/Credentials/JwtVerifiableCredentialIssuer.cs` |
| Service VC | `TrustOriginality_ai_dashboard/Services/VerifiableCredentialService.cs` |
| Routes API | `TrustOriginality_ai_dashboard/Program.cs` |
| Audit d'émission / révocation | `TrustOriginality_ai_db/Scripts/CreateTbl_VerifiableCredentials.sql` |
