From 81511b094d0bcc4fc1948b6405be8449f2ce9fdb Mon Sep 17 00:00:00 2001 From: scouten-adobe <86495592+scouten-adobe@users.noreply.github.com> Date: Fri, 4 Sep 2026 21:18:38 +0000 Subject: [PATCH] docs(schema): update schemas to c2pa-v0.90.20 --- static/schemas/Builder.schema.json | 286 ++++++++++-------- static/schemas/ManifestDefinition.schema.json | 164 +++++++++- static/schemas/Reader.schema.json | 164 +++++++++- static/schemas/Settings.schema.json | 91 +++--- 4 files changed, 535 insertions(+), 170 deletions(-) diff --git a/static/schemas/Builder.schema.json b/static/schemas/Builder.schema.json index 2746638..4214662 100644 --- a/static/schemas/Builder.schema.json +++ b/static/schemas/Builder.schema.json @@ -53,7 +53,7 @@ "instance_id": { "description": "Instance ID from `xmpMM:InstanceID` in XMP metadata.", "type": "string", - "default": "xmp:iid:98dbe846-4080-4c8f-9eef-2e0ab90ff50b" + "default": "xmp.iid:10b5b45d-b0d2-4787-a682-20e84d8cdc91" }, "thumbnail": { "description": "An optional ResourceRef to a thumbnail image that represents the asset that was signed.\nMust be available when the manifest is signed.", @@ -174,6 +174,13 @@ "string", "null" ] + }, + "specVersion": { + "description": "The version of the specification used to produce this manifest (SemVer)", + "type": [ + "string", + "null" + ] } }, "required": [ @@ -971,6 +978,17 @@ "null" ] }, + "digital_source_type": { + "description": "One of the source types defined at \nor in this specification. Cannot be combined with `activeManifest`.", + "anyOf": [ + { + "$ref": "#/$defs/DigitalSourceType" + }, + { + "type": "null" + } + ] + }, "validation_status": { "description": "Validation status (Ingredient v1 & v2)", "type": [ @@ -1087,6 +1105,128 @@ } ] }, + "DigitalSourceType": { + "description": "Description of the source of an asset.\n\nThe digital source type must be either a value from the [IPTC Digital Source Types](https://cv.iptc.org/newscodes/digitalsourcetype) or a C2PA-specific value as given in [the C2PA Technical Specification](https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_digital_source_type).", + "anyOf": [ + { + "description": "Media whose digital content is effectively empty, such as a blank canvas or zero-length video.", + "type": "string", + "const": "http://c2pa.org/digitalsourcetype/empty" + }, + { + "description": "Data that is the result of algorithmically using a model derived from sampled content and data.\nDiffers from [IPTC Digital Source Type](http://cv.iptc.org/newscodes/digitalsourcetype/) `trainedAlgorithmicMedia` in that\nthe result isn’t a media type (e.g., image or video) but is a data format (e.g., CSV, pickle).", + "type": "string", + "const": "http://c2pa.org/digitalsourcetype/trainedAlgorithmicData" + }, + { + "description": "The media was captured from a real-life source using a digital camera or digital recording device.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture" + }, + { + "description": "The media is the result of capturing multiple frames from a real-life source using a digital camera\nor digital recording device, then automatically merging them into a single frame using digital signal\nprocessing techniques and/or non-generative AI. Includes High Dynamic Range (HDR) processing common in\nsmartphone camera apps.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/computationalCapture" + }, + { + "description": "The media was digitised from a negative on film or other transparent medium.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/negativeFilm" + }, + { + "description": "The media was digitised from a positive on a transparency or other transparent medium.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/positiveFilm" + }, + { + "description": "The media was digitised from a non-transparent medium such as a photographic print.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/print" + }, + { + "description": "Minor augmentation or correction by a human, such as a digitally-retouched photo used in a magazine.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/minorHumanEdits", + "deprecated": true + }, + { + "description": "Augmentation, correction or enhancement by one or more humans using non-generative tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/humanEdits" + }, + { + "description": "Augmentation, correction or enhancement using a Generative AI model, such as with inpainting or\noutpainting operations.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeWithTrainedAlgorithmicMedia" + }, + { + "description": "Modification or correction by algorithm without changing the main content of the media, initiated\nor configured by a human, such as sharpening or applying noise reduction.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicallyEnhanced" + }, + { + "description": "The digital image was created by computer software.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/softwareImage", + "deprecated": true + }, + { + "description": "Media created by a human using digital tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalArt", + "deprecated": true + }, + { + "description": "Media created by a human using non-generative tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCreation" + }, + { + "description": "Digital media representation of data via human programming or creativity.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/dataDrivenMedia" + }, + { + "description": "Digital media created algorithmically using an Artificial Intelligence model trained on captured\ncontent.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" + }, + { + "description": "Media created purely by an algorithm not based on any sampled training data, e.g. an image created\nby software using a mathematical formula.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicMedia" + }, + { + "description": "A capture of the contents of the screen of a computer or mobile device.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/screenCapture" + }, + { + "description": "Live recording of virtual event based on Generative AI and/or captured elements.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/virtualRecording" + }, + { + "description": "Mix or composite of several elements, any of which may or may not be generative AI.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/composite" + }, + { + "description": "Mix or composite of several elements that are all captures of real life.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeCapture" + }, + { + "description": "Mix or composite of several elements, at least one of which is Generative AI.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeSynthetic" + }, + { + "description": "An unknown digital source type.", + "type": "string" + } + ] + }, "ValidationStatus": { "description": "A `ValidationStatus` struct describes the validation status of a\nspecific part of a manifest.\n\nSee [Existing Manifests - C2PA Technical Specification](https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_existing_manifests).", "type": "object", @@ -1143,6 +1283,28 @@ "$ref": "#/$defs/IngredientDeltaValidationResult" } }, + "specVersion": { + "description": "The version of the specification against which the validation was performed (SemVer formatted string).", + "type": [ + "string", + "null" + ] + }, + "trustListUri": { + "description": "URI to the trust list that was used to validate manifests signing certificate.", + "type": [ + "string", + "null" + ] + }, + "timestampTrustListUri": { + "description": "URI to the trust list use to validate the time-stamp.", + "type": [ + "string", + "null" + ], + "writeOnly": true + }, "validationTime": { "description": "Time when the validation was performed (RFC 3339 date-time). Used only for document-level validationInfo; not serialized in validationResults (e.g. ingredient assertions).", "type": [ @@ -1279,128 +1441,6 @@ "const": "update" } ] - }, - "DigitalSourceType": { - "description": "Description of the source of an asset.\n\nThe digital source type must be either a value from the [IPTC Digital Source Types](https://cv.iptc.org/newscodes/digitalsourcetype) or a C2PA-specific value as given in [the C2PA Technical Specification](https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_digital_source_type).", - "anyOf": [ - { - "description": "Media whose digital content is effectively empty, such as a blank canvas or zero-length video.", - "type": "string", - "const": "http://c2pa.org/digitalsourcetype/empty" - }, - { - "description": "Data that is the result of algorithmically using a model derived from sampled content and data.\nDiffers from [IPTC Digital Source Type](http://cv.iptc.org/newscodes/digitalsourcetype/) `trainedAlgorithmicMedia` in that\nthe result isn’t a media type (e.g., image or video) but is a data format (e.g., CSV, pickle).", - "type": "string", - "const": "http://c2pa.org/digitalsourcetype/trainedAlgorithmicData" - }, - { - "description": "The media was captured from a real-life source using a digital camera or digital recording device.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture" - }, - { - "description": "The media is the result of capturing multiple frames from a real-life source using a digital camera\nor digital recording device, then automatically merging them into a single frame using digital signal\nprocessing techniques and/or non-generative AI. Includes High Dynamic Range (HDR) processing common in\nsmartphone camera apps.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/computationalCapture" - }, - { - "description": "The media was digitised from a negative on film or other transparent medium.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/negativeFilm" - }, - { - "description": "The media was digitised from a positive on a transparency or other transparent medium.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/positiveFilm" - }, - { - "description": "The media was digitised from a non-transparent medium such as a photographic print.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/print" - }, - { - "description": "Minor augmentation or correction by a human, such as a digitally-retouched photo used in a magazine.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/minorHumanEdits", - "deprecated": true - }, - { - "description": "Augmentation, correction or enhancement by one or more humans using non-generative tools.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/humanEdits" - }, - { - "description": "Augmentation, correction or enhancement using a Generative AI model, such as with inpainting or\noutpainting operations.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeWithTrainedAlgorithmicMedia" - }, - { - "description": "Modification or correction by algorithm without changing the main content of the media, initiated\nor configured by a human, such as sharpening or applying noise reduction.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicallyEnhanced" - }, - { - "description": "The digital image was created by computer software.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/softwareImage", - "deprecated": true - }, - { - "description": "Media created by a human using digital tools.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalArt", - "deprecated": true - }, - { - "description": "Media created by a human using non-generative tools.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCreation" - }, - { - "description": "Digital media representation of data via human programming or creativity.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/dataDrivenMedia" - }, - { - "description": "Digital media created algorithmically using an Artificial Intelligence model trained on captured\ncontent.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" - }, - { - "description": "Media created purely by an algorithm not based on any sampled training data, e.g. an image created\nby software using a mathematical formula.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicMedia" - }, - { - "description": "A capture of the contents of the screen of a computer or mobile device.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/screenCapture" - }, - { - "description": "Live recording of virtual event based on Generative AI and/or captured elements.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/virtualRecording" - }, - { - "description": "Mix or composite of several elements, any of which may or may not be generative AI.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/composite" - }, - { - "description": "Mix or composite of several elements that are all captures of real life.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeCapture" - }, - { - "description": "Mix or composite of several elements, at least one of which is Generative AI.", - "type": "string", - "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeSynthetic" - }, - { - "description": "An unknown digital source type.", - "type": "string" - } - ] } } } \ No newline at end of file diff --git a/static/schemas/ManifestDefinition.schema.json b/static/schemas/ManifestDefinition.schema.json index 26b34d4..9230854 100644 --- a/static/schemas/ManifestDefinition.schema.json +++ b/static/schemas/ManifestDefinition.schema.json @@ -53,7 +53,7 @@ "instance_id": { "description": "Instance ID from `xmpMM:InstanceID` in XMP metadata.", "type": "string", - "default": "xmp:iid:e01b72d0-1ec0-4646-9e16-bbc8b577fc92" + "default": "xmp.iid:9134c67e-ef85-4c8d-92b4-121390182d83" }, "thumbnail": { "description": "An optional ResourceRef to a thumbnail image that represents the asset that was signed.\nMust be available when the manifest is signed.", @@ -140,6 +140,13 @@ "string", "null" ] + }, + "specVersion": { + "description": "The version of the specification used to produce this manifest (SemVer)", + "type": [ + "string", + "null" + ] } }, "required": [ @@ -937,6 +944,17 @@ "null" ] }, + "digital_source_type": { + "description": "One of the source types defined at \nor in this specification. Cannot be combined with `activeManifest`.", + "anyOf": [ + { + "$ref": "#/$defs/DigitalSourceType" + }, + { + "type": "null" + } + ] + }, "validation_status": { "description": "Validation status (Ingredient v1 & v2)", "type": [ @@ -1053,6 +1071,128 @@ } ] }, + "DigitalSourceType": { + "description": "Description of the source of an asset.\n\nThe digital source type must be either a value from the [IPTC Digital Source Types](https://cv.iptc.org/newscodes/digitalsourcetype) or a C2PA-specific value as given in [the C2PA Technical Specification](https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_digital_source_type).", + "anyOf": [ + { + "description": "Media whose digital content is effectively empty, such as a blank canvas or zero-length video.", + "type": "string", + "const": "http://c2pa.org/digitalsourcetype/empty" + }, + { + "description": "Data that is the result of algorithmically using a model derived from sampled content and data.\nDiffers from [IPTC Digital Source Type](http://cv.iptc.org/newscodes/digitalsourcetype/) `trainedAlgorithmicMedia` in that\nthe result isn’t a media type (e.g., image or video) but is a data format (e.g., CSV, pickle).", + "type": "string", + "const": "http://c2pa.org/digitalsourcetype/trainedAlgorithmicData" + }, + { + "description": "The media was captured from a real-life source using a digital camera or digital recording device.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture" + }, + { + "description": "The media is the result of capturing multiple frames from a real-life source using a digital camera\nor digital recording device, then automatically merging them into a single frame using digital signal\nprocessing techniques and/or non-generative AI. Includes High Dynamic Range (HDR) processing common in\nsmartphone camera apps.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/computationalCapture" + }, + { + "description": "The media was digitised from a negative on film or other transparent medium.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/negativeFilm" + }, + { + "description": "The media was digitised from a positive on a transparency or other transparent medium.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/positiveFilm" + }, + { + "description": "The media was digitised from a non-transparent medium such as a photographic print.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/print" + }, + { + "description": "Minor augmentation or correction by a human, such as a digitally-retouched photo used in a magazine.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/minorHumanEdits", + "deprecated": true + }, + { + "description": "Augmentation, correction or enhancement by one or more humans using non-generative tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/humanEdits" + }, + { + "description": "Augmentation, correction or enhancement using a Generative AI model, such as with inpainting or\noutpainting operations.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeWithTrainedAlgorithmicMedia" + }, + { + "description": "Modification or correction by algorithm without changing the main content of the media, initiated\nor configured by a human, such as sharpening or applying noise reduction.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicallyEnhanced" + }, + { + "description": "The digital image was created by computer software.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/softwareImage", + "deprecated": true + }, + { + "description": "Media created by a human using digital tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalArt", + "deprecated": true + }, + { + "description": "Media created by a human using non-generative tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCreation" + }, + { + "description": "Digital media representation of data via human programming or creativity.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/dataDrivenMedia" + }, + { + "description": "Digital media created algorithmically using an Artificial Intelligence model trained on captured\ncontent.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" + }, + { + "description": "Media created purely by an algorithm not based on any sampled training data, e.g. an image created\nby software using a mathematical formula.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicMedia" + }, + { + "description": "A capture of the contents of the screen of a computer or mobile device.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/screenCapture" + }, + { + "description": "Live recording of virtual event based on Generative AI and/or captured elements.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/virtualRecording" + }, + { + "description": "Mix or composite of several elements, any of which may or may not be generative AI.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/composite" + }, + { + "description": "Mix or composite of several elements that are all captures of real life.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeCapture" + }, + { + "description": "Mix or composite of several elements, at least one of which is Generative AI.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeSynthetic" + }, + { + "description": "An unknown digital source type.", + "type": "string" + } + ] + }, "ValidationStatus": { "description": "A `ValidationStatus` struct describes the validation status of a\nspecific part of a manifest.\n\nSee [Existing Manifests - C2PA Technical Specification](https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_existing_manifests).", "type": "object", @@ -1109,6 +1249,28 @@ "$ref": "#/$defs/IngredientDeltaValidationResult" } }, + "specVersion": { + "description": "The version of the specification against which the validation was performed (SemVer formatted string).", + "type": [ + "string", + "null" + ] + }, + "trustListUri": { + "description": "URI to the trust list that was used to validate manifests signing certificate.", + "type": [ + "string", + "null" + ] + }, + "timestampTrustListUri": { + "description": "URI to the trust list use to validate the time-stamp.", + "type": [ + "string", + "null" + ], + "writeOnly": true + }, "validationTime": { "description": "Time when the validation was performed (RFC 3339 date-time). Used only for document-level validationInfo; not serialized in validationResults (e.g. ingredient assertions).", "type": [ diff --git a/static/schemas/Reader.schema.json b/static/schemas/Reader.schema.json index 283eb8d..1c1f587 100644 --- a/static/schemas/Reader.schema.json +++ b/static/schemas/Reader.schema.json @@ -108,7 +108,7 @@ "instance_id": { "description": "Instance ID from `xmpMM:InstanceID` in XMP metadata.", "type": "string", - "default": "xmp:iid:8ad63f18-4fde-4aa8-ad75-ae99b4b6d59d" + "default": "xmp.iid:a5849e15-022c-4a2e-b780-752970f7a04f" }, "thumbnail": { "anyOf": [ @@ -214,6 +214,13 @@ "string", "null" ] + }, + "specVersion": { + "description": "The version of the specification used to produce this manifest (SemVer)", + "type": [ + "string", + "null" + ] } }, "required": [ @@ -1011,6 +1018,17 @@ "null" ] }, + "digital_source_type": { + "description": "One of the source types defined at \nor in this specification. Cannot be combined with `activeManifest`.", + "anyOf": [ + { + "$ref": "#/$defs/DigitalSourceType" + }, + { + "type": "null" + } + ] + }, "validation_status": { "description": "Validation status (Ingredient v1 & v2)", "type": [ @@ -1127,6 +1145,128 @@ } ] }, + "DigitalSourceType": { + "description": "Description of the source of an asset.\n\nThe digital source type must be either a value from the [IPTC Digital Source Types](https://cv.iptc.org/newscodes/digitalsourcetype) or a C2PA-specific value as given in [the C2PA Technical Specification](https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_digital_source_type).", + "anyOf": [ + { + "description": "Media whose digital content is effectively empty, such as a blank canvas or zero-length video.", + "type": "string", + "const": "http://c2pa.org/digitalsourcetype/empty" + }, + { + "description": "Data that is the result of algorithmically using a model derived from sampled content and data.\nDiffers from [IPTC Digital Source Type](http://cv.iptc.org/newscodes/digitalsourcetype/) `trainedAlgorithmicMedia` in that\nthe result isn’t a media type (e.g., image or video) but is a data format (e.g., CSV, pickle).", + "type": "string", + "const": "http://c2pa.org/digitalsourcetype/trainedAlgorithmicData" + }, + { + "description": "The media was captured from a real-life source using a digital camera or digital recording device.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture" + }, + { + "description": "The media is the result of capturing multiple frames from a real-life source using a digital camera\nor digital recording device, then automatically merging them into a single frame using digital signal\nprocessing techniques and/or non-generative AI. Includes High Dynamic Range (HDR) processing common in\nsmartphone camera apps.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/computationalCapture" + }, + { + "description": "The media was digitised from a negative on film or other transparent medium.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/negativeFilm" + }, + { + "description": "The media was digitised from a positive on a transparency or other transparent medium.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/positiveFilm" + }, + { + "description": "The media was digitised from a non-transparent medium such as a photographic print.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/print" + }, + { + "description": "Minor augmentation or correction by a human, such as a digitally-retouched photo used in a magazine.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/minorHumanEdits", + "deprecated": true + }, + { + "description": "Augmentation, correction or enhancement by one or more humans using non-generative tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/humanEdits" + }, + { + "description": "Augmentation, correction or enhancement using a Generative AI model, such as with inpainting or\noutpainting operations.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeWithTrainedAlgorithmicMedia" + }, + { + "description": "Modification or correction by algorithm without changing the main content of the media, initiated\nor configured by a human, such as sharpening or applying noise reduction.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicallyEnhanced" + }, + { + "description": "The digital image was created by computer software.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/softwareImage", + "deprecated": true + }, + { + "description": "Media created by a human using digital tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalArt", + "deprecated": true + }, + { + "description": "Media created by a human using non-generative tools.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCreation" + }, + { + "description": "Digital media representation of data via human programming or creativity.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/dataDrivenMedia" + }, + { + "description": "Digital media created algorithmically using an Artificial Intelligence model trained on captured\ncontent.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" + }, + { + "description": "Media created purely by an algorithm not based on any sampled training data, e.g. an image created\nby software using a mathematical formula.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicMedia" + }, + { + "description": "A capture of the contents of the screen of a computer or mobile device.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/screenCapture" + }, + { + "description": "Live recording of virtual event based on Generative AI and/or captured elements.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/virtualRecording" + }, + { + "description": "Mix or composite of several elements, any of which may or may not be generative AI.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/composite" + }, + { + "description": "Mix or composite of several elements that are all captures of real life.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeCapture" + }, + { + "description": "Mix or composite of several elements, at least one of which is Generative AI.", + "type": "string", + "const": "http://cv.iptc.org/newscodes/digitalsourcetype/compositeSynthetic" + }, + { + "description": "An unknown digital source type.", + "type": "string" + } + ] + }, "ValidationStatus": { "description": "A `ValidationStatus` struct describes the validation status of a\nspecific part of a manifest.\n\nSee [Existing Manifests - C2PA Technical Specification](https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_existing_manifests).", "type": "object", @@ -1183,6 +1323,28 @@ "$ref": "#/$defs/IngredientDeltaValidationResult" } }, + "specVersion": { + "description": "The version of the specification against which the validation was performed (SemVer formatted string).", + "type": [ + "string", + "null" + ] + }, + "trustListUri": { + "description": "URI to the trust list that was used to validate manifests signing certificate.", + "type": [ + "string", + "null" + ] + }, + "timestampTrustListUri": { + "description": "URI to the trust list use to validate the time-stamp.", + "type": [ + "string", + "null" + ], + "writeOnly": true + }, "validationTime": { "description": "Time when the validation was performed (RFC 3339 date-time). Used only for document-level validationInfo; not serialized in validationResults (e.g. ingredient assertions).", "type": [ diff --git a/static/schemas/Settings.schema.json b/static/schemas/Settings.schema.json index 5966807..f877ceb 100644 --- a/static/schemas/Settings.schema.json +++ b/static/schemas/Settings.schema.json @@ -12,25 +12,13 @@ "default": 1 }, "trust": { - "description": "Settings for configuring the C2PA trust lists.", + "description": "Settings for configuring the trust lists (C2PA, CAWG, or TSA).", "$ref": "#/$defs/Trust", "default": { - "user_anchors": null, - "trust_anchors": null, + "anchors": null, "trust_config": null, - "allowed_list": null - } - }, - "cawg_trust": { - "description": "Settings for configuring the CAWG trust lists.", - "$ref": "#/$defs/CawgTrust", - "default": { - "verify_trust_list": true, "user_anchors": null, - "trust_anchors": null, - "trust_config": null, - "allowed_list": null, - "trusted_ica_issuers": null + "trust_anchors": null } }, "core": { @@ -98,7 +86,8 @@ "skip_existing": true, "fetch_scope": "all" }, - "bmff_hash_exclude_free_and_skip_boxes": true + "bmff_hash_exclude_free_and_skip_boxes": true, + "ignore_ingredient_errors": false } }, "signer": { @@ -133,70 +122,69 @@ }, "$defs": { "Trust": { - "description": "Settings to configure the C2PA trust list.\n\nThis configures the trust lists used when verifying C2PA manifest signers.\nCAWG identity trust is configured separately via [`CawgTrust`].", + "description": "Settings to configure the trust list.", "type": "object", "properties": { - "user_anchors": { - "description": "List of additional user-provided trust anchor root certificates as a PEM bundle.", + "anchors": { + "description": "This option contains the set of trust anchors used to validate certificates.", "type": [ - "string", + "array", "null" ], + "items": { + "$ref": "#/$defs/TrustAnchor" + }, "default": null }, - "trust_anchors": { - "description": "List of default trust anchor root certificates as a PEM bundle.\n\nNormally this option contains the official C2PA-recognized trust anchors found here:\n", + "trust_config": { + "description": "List of allowed extended key usage (EKU) object identifiers (OID) that\ncertificates must have.", "type": [ "string", "null" ], "default": null }, - "trust_config": { - "description": "List of allowed extended key usage (EKU) object identifiers (OID) that\ncertificates must have.", + "user_anchors": { "type": [ "string", "null" ], + "deprecated": true, "default": null }, - "allowed_list": { - "description": "List of explicitly allowed certificates as a PEM bundle.", + "trust_anchors": { "type": [ "string", "null" ], + "deprecated": true, "default": null } } }, - "CawgTrust": { - "description": "Settings to configure the CAWG identity trust lists.\n\nThis configures trust used when validating CAWG identity assertions. It is\nmodeled separately from the C2PA [`Trust`] because several of these settings\n(such as `verify_trust_list`) apply only to CAWG validation and have no\neffect on C2PA manifest verification.", + "TrustAnchor": { "type": "object", "properties": { - "verify_trust_list": { - "description": "Whether to verify certificates against the trust lists specified in [`CawgTrust`].\n\nThe default value is true.\n\n
\nVerifying trust is REQUIRED by the CAWG spec. This option should only be used for development or testing.\n
", - "type": "boolean", - "default": true + "trust_anchors": { + "description": "Specifies the details of a specific trust list. \n\nNormally this option contains the official C2PA-recognized trust anchors found here:\n\nor a user supplied trust list. This format is a PEM string of certificates.\nFor C2PA trust lists the TrustListKind should be ['Signer]\n\nWhen validating CAWG X.509 identity signatures.\n\nUnder the CAWG interim trust model (CAWG identity assertion spec §8.2.4.1,\nvalid for assertions issued on or before 31 March 2027 and carrying a\ntrusted time stamp), these are the CAWG-recognized trust anchors – the\nMozilla Root Store with the Email (S/MIME) trust bit enabled\n()\nand the IPTC Origin Verified News Publishers trust-anchor list\n() – not the C2PA conformance\ntrust-list. For CAWG trust the TrustListKind should be ['CAWG']", + "type": "string", + "default": "" }, - "user_anchors": { - "description": "List of additional user-provided trust anchor root certificates as a PEM\nbundle, used when validating CAWG X.509 identity signatures.\n\nThese trust lists are independent of the C2PA [`Trust`] settings and are\nconsulted only for CAWG identity validation.", + "trust_uri": { + "description": "URI identifier for the trust list. If not is present a unique identifier will be generated.", "type": [ "string", "null" ], "default": null }, - "trust_anchors": { - "description": "List of default trust anchor root certificates as a PEM bundle, used when\nvalidating CAWG X.509 identity signatures.\n\nUnder the CAWG interim trust model (CAWG identity assertion spec §8.2.4.1,\nvalid for assertions issued on or before 31 March 2027 and carrying a\ntrusted time stamp), these are the CAWG-recognized trust anchors – the\nMozilla Root Store with the Email (S/MIME) trust bit enabled\n()\nand the IPTC Origin Verified News Publishers trust-anchor list\n() – not the C2PA conformance\ntrust-list.", - "type": [ - "string", - "null" - ], - "default": null + "trust_kind": { + "description": "Kind of trust list. This is used to determine the trust purpose, default is Signer.", + "$ref": "#/$defs/TrustListKind", + "default": "manifest" }, "trust_config": { - "description": "List of allowed extended key usage (EKU) object identifiers (OID) that\nCAWG identity certificates must have.\n\nThe CAWG interim trust model (CAWG identity assertion spec §8.2.4.1)\nrequires the `id-kp-emailProtection` EKU (1.3.6.1.5.5.7.3.4) together with\none of the CA/Browser Forum S/MIME certificate-policy OIDs:\norganization-validated (2.23.140.1.5.2.2 / 2.23.140.1.5.2.3),\nsponsor-validated (2.23.140.1.5.3.2 / 2.23.140.1.5.3.3), or\nindividual-validated (2.23.140.1.5.4.2 / 2.23.140.1.5.4.3). Mailbox-validated\nand legacy certificate purposes are not accepted.", + "description": "List of allowed extended key usage (EKU) object identifiers (OID) that\ncertificates must have. This will overlay the default top level trust_config.\nIf the trust_kind is CAWG it will override the top level trust config\n\n When validating CAWG identity certificates.\n\nThe CAWG interim trust model (CAWG identity assertion spec §8.2.4.1)\nrequires the `id-kp-emailProtection` EKU (1.3.6.1.5.5.7.3.4) together with\none of the CA/Browser Forum S/MIME certificate-policy OIDs:\norganization-validated (2.23.140.1.5.2.2 / 2.23.140.1.5.2.3),\nsponsor-validated (2.23.140.1.5.3.2 / 2.23.140.1.5.3.3), or\nindividual-validated (2.23.140.1.5.4.2 / 2.23.140.1.5.4.3). Mailbox-validated\nand legacy certificate purposes are not accepted.", "type": [ "string", "null" @@ -204,7 +192,7 @@ "default": null }, "allowed_list": { - "description": "List of explicitly allowed CAWG identity certificates as a PEM bundle.\n\nUnder the CAWG interim trust model (CAWG identity assertion spec §8.2.4.1),\nthis corresponds to the IPTC Origin Verified News Publishers end-entity\ncertificate list ().", + "description": "List of explicitly allowed CAWG identity or Singing certificates as a PEM bundle.\n\nUnder the CAWG interim trust model (CAWG identity assertion spec §8.2.4.1),\nthis corresponds to the IPTC Origin Verified News Publishers end-entity\ncertificate list ().\n\nWhen used for C2PA this will not be C2PA trust list recognized or acknowledged certificates and\nshould only be used for non-C2PA conformant cases.", "type": [ "string", "null" @@ -224,6 +212,14 @@ } } }, + "TrustListKind": { + "type": "string", + "enum": [ + "manifest", + "tsa", + "cawg" + ] + }, "Core": { "description": "Settings to configure core features.\n\nThis struct is `#[non_exhaustive]`: construct it via [`Default`] (and the `with_*` builders on\n[`Settings`]) rather than a struct literal, so that future settings can be added without a\nbreaking change.", "type": "object", @@ -431,6 +427,10 @@ "bmff_hash_exclude_free_and_skip_boxes": { "description": "Whether `/free` and `/skip` boxes are excluded from the BMFF/MP4 hard-binding hash.\n\n`/free` and `/skip` are reserved/padding space that apps commonly rewrite after\nsigning (e.g. to reclaim or repurpose it), so the C2PA spec permits excluding\nthem. Set to `false` to fold their content into the hash instead, so any later\nedit to either box invalidates the hard binding like any other content change.\n\nThe default value is `true`.", "type": "boolean" + }, + "ignore_ingredient_errors": { + "description": "Whether to ignore errors encountered while loading or validating an [`Ingredient`]'s\nmanifest (e.g. invalid file format).\n\nWhen enabled, a hard error is reported as a `general.error` in the ingredient's\n[`validation_results`] instead of being returned, so the [`Ingredient`] still loads\nand callers can inspect what went wrong.\n\nThe default value is false.\n\n[`Ingredient`]: crate::Ingredient\n[`validation_results`]: crate::Ingredient::validation_results", + "type": "boolean" } }, "required": [ @@ -438,7 +438,8 @@ "actions", "prefer_box_hash", "auto_timestamp_assertion", - "bmff_hash_exclude_free_and_skip_boxes" + "bmff_hash_exclude_free_and_skip_boxes", + "ignore_ingredient_errors" ] }, "ClaimGeneratorInfoSettings": { @@ -987,7 +988,7 @@ "const": "parent" }, { - "description": "Fetch timestmaps for all manifests in the manifest store.", + "description": "Fetch timestamps for all manifests in the manifest store.", "type": "string", "const": "all" }