La signature du mode local
POST https://api.kennmarq.com/v1/sign
En mode local, le filigrane et les Content Credentials sont créés sur votre machine, et le fichier ne la quitte jamais. Seul son manifeste nous parvient, pour être signé avec notre clé et horodaté par notre serveur. Le SDK Python et les nœuds ComfyUI font tout cela pour vous ; cette page s’adresse à qui veut le construire soi-même.
Fonctionnement
- Créez le manifeste et intégrez-le avec la bibliothèque C2PA (c2pa-python 0.38.1), signé avec une chaîne de certificats jetable que vous créez à cet effet. C2PA vérifie chaque signature par rapport à son certificat : la bibliothèque ne peut donc pas signer avec une clé qu’elle ne détient pas.
- Envoyez-nous le magasin de manifestes qu’elle a intégré : environ 13 Ko de claim et d’assertions, jamais de pixels. Désactivez les vignettes.
- Nous le vérifions (voir ci-dessous), signons le même claim avec notre clé, horodatons la signature et vous renvoyons le magasin, de même taille, avec notre signature à la place de la signature jetable.
- Remettez-le dans votre fichier, à la place de l’ancien. La liaison forte du fichier exclut le manifeste : elle reste donc valide. Lisez ensuite le fichier avec nos certificats racines (GET /v1/certificate) avant de l’utiliser : il doit apparaître comme Trusted, avec un horodatage validé.
curl https://api.kennmarq.com/v1/sign \
-H "Authorization: Bearer $KENNMARQ_API_KEY" \
-H "Content-Type: application/c2pa" \
--data-binary @manifest.c2pa -D - -o signed.c2paCe que nous signons, et ce que nous ne signons pas
Nous ne signons que ce que porterait l’un de nos marquages en mode cloud, pour que notre signature ne puisse pas être apposée à d’autres claims :
| Vérification | En détail |
|---|---|
| Chaque assertion que liste le claim figure dans le manifeste, avec l’empreinte que le claim lui attribue | et le manifeste n’en contient aucune qu’il ne liste pas |
| Uniquement les assertions que porte un marquage | les actions, la liaison forte (hard binding), la liaison souple (soft binding) du filigrane, le générateur, les ingrédients : pas de vignette, qui contiendrait des pixels |
| Un type de source IA | c2pa.created ou c2pa.opened avec trainedAlgorithmicMedia ou compositeWithTrainedAlgorithmicMedia : nous ne signons que des fichiers créés par l’IA |
| Un filigrane va avec son action | c2pa.watermarked.bound et une liaison souple TrustMark, les deux ou aucune |
| Notre générateur | le claim désigne Kennmarq.com comme générateur, et son algorithme de hachage est SHA-256 |
Chaque manifeste n’est signé qu’une fois : créez-en un nouveau pour chaque fichier.
Réponse
200, application/c2pa : le magasin signé, avec X-Mark-Id, X-Watermark-Id (quand le manifeste comporte un filigrane), X-Log-Index, X-Marks-Used, X-Marks-Limit et X-Request-Id. Chaque signature compte un marquage.
- La signature est inscrite dans notre journal de transparence sous la forme d’une entrée
c2pa.local_signature. Nous ne voyons jamais votre fichier : l’entrée contient donc sa liaison forte (l’empreinte de l’assertionc2pa.hash.datadu manifeste) au lieu de son SHA-256. - Avec un filigrane, le magasin signé est conservé comme Content Credentials durables du fichier, sans empreinte de fichier : une copie dont les métadonnées ont été supprimées y mène toujours.
Erreurs
| Statut | Code | Quand |
|---|---|---|
| 400 | invalid_request | Pas un magasin de manifestes C2PA, un manifeste déjà signé, ou un manifeste que nous refusons de signer ; le message indique quelle vérification a échoué. |
| 401 | missing_api_key, invalid_api_key, api_key_revoked | Voir Authentification. |
| 402 | quota_exceeded | Les marquages du mois sont épuisés. |
| 403 | insufficient_scope, ip_not_allowed | La clé n’a pas la portée sign, ou l’adresse ne figure pas sur la liste d’IP autorisées. |
| 413 | payload_too_large | Le magasin dépasse 1 Mo. |
| 415 | unsupported_media_type | Le corps n’est pas envoyé en application/c2pa. |
| 429 | rate_limited | Trop d’appels cette minute ; réessayez après le nombre de secondes indiqué dans Retry-After. |
| 502 | mark_failed | La signature n’a pas pu être créée et vérifiée. Rien n’est décompté. |
| 503 | marker_unavailable, tsa_unavailable | Le service de signature ou le serveur d’horodatage est momentanément indisponible. Rien n’est décompté ; réessayez. |
Les corps d’erreur suivent le format commun.