Aller au contenu

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

  1. 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.
  2. 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.
  3. 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.
  4. 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
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.c2pa

Ce 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 :

Ce qu’un manifeste doit contenir pour que nous le signions
VérificationEn détail
Chaque assertion que liste le claim figure dans le manifeste, avec l’empreinte que le claim lui attribueet le manifeste n’en contient aucune qu’il ne liste pas
Uniquement les assertions que porte un marquageles 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 IAc2pa.created ou c2pa.opened avec trainedAlgorithmicMedia ou compositeWithTrainedAlgorithmicMedia : nous ne signons que des fichiers créés par l’IA
Un filigrane va avec son actionc2pa.watermarked.bound et une liaison souple TrustMark, les deux ou aucune
Notre générateurle 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’assertion c2pa.hash.data du 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.
Les Content Credentials que votre fichier portait déjà voyagent avec le manifeste en tant qu’ingrédients, avec les vignettes que leur signataire y a éventuellement placées. Retirez-les s’ils ne doivent pas nous parvenir.

Erreurs

Erreurs de POST /v1/sign
StatutCodeQuand
400invalid_requestPas 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é.
401missing_api_key, invalid_api_key, api_key_revokedVoir Authentification.
402quota_exceededLes marquages du mois sont épuisés.
403insufficient_scope, ip_not_allowedLa clé n’a pas la portée sign, ou l’adresse ne figure pas sur la liste d’IP autorisées.
413payload_too_largeLe magasin dépasse 1 Mo.
415unsupported_media_typeLe corps n’est pas envoyé en application/c2pa.
429rate_limitedTrop d’appels cette minute ; réessayez après le nombre de secondes indiqué dans Retry-After.
502mark_failedLa signature n’a pas pu être créée et vérifiée. Rien n’est décompté.
503marker_unavailable, tsa_unavailableLe 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.