diff --git a/docs/manifest/json-ref/crjson-ref.mdx b/docs/manifest/json-ref/crjson-ref.mdx new file mode 100644 index 00000000..4abc57f5 --- /dev/null +++ b/docs/manifest/json-ref/crjson-ref.mdx @@ -0,0 +1,13 @@ +--- +id: crjson-schema +title: CrJSON reference +hide_table_of_contents: true +--- + +:::note +This is a beta release of this reference. It is a work in progress and may have issues or errors. +::: + +import SchemaReference from '@site/src/components/SchemaReference'; + + diff --git a/docs/manifest/json-ref/index.md b/docs/manifest/json-ref/index.md index f7f46fec..24b0befb 100644 --- a/docs/manifest/json-ref/index.md +++ b/docs/manifest/json-ref/index.md @@ -16,6 +16,7 @@ The JSON manifest is an abstract translation layer that's easier to understand t - [Builder](builder-ref.mdx) - Use to add a signed manifest to an asset. - [ManifestDefinition](manifest-def.mdx) - Use to define a manifest (a collection of ingredients and assertions) that can be added to a manifest store, signed, and embedded into a file. - [Settings](settings-ref.mdx) - Use to define all aspects of code for working with Content Credentials. +- [CrJSON](crjson-ref.mdx) - Content Credential JSON document format for representing C2PA manifests as JSON (excludes asset_info, content, and metadata). diff --git a/remote-docs.json b/remote-docs.json index c53b8500..9ee985ef 100644 --- a/remote-docs.json +++ b/remote-docs.json @@ -474,6 +474,13 @@ "dest": "static/sb-alg-list.json" }, + { "_comment": "CrJSON schema (static JSON, hand-authored fixture)" }, + { + "repo": "contentauth/c2pa-rs", + "path": "sdk/tests/fixtures/schemas/crJSON-schema.json", + "dest": "static/schemas/crJSON-schema.json" + }, + { "_comment": "Durable Content Credentials - TrustMark watermarking" }, { "repo": "adobe/trustmark", diff --git a/sidebars.js b/sidebars.js index db58db58..44430f29 100644 --- a/sidebars.js +++ b/sidebars.js @@ -225,6 +225,11 @@ const sidebars = { id: 'manifest/json-ref/settings-schema', label: 'Settings', }, + { + type: 'doc', + id: 'manifest/json-ref/crjson-schema', + label: 'CrJSON', + }, ], }, { diff --git a/src/components/SchemaReference.js b/src/components/SchemaReference.js index 726c3aeb..3388da7a 100644 --- a/src/components/SchemaReference.js +++ b/src/components/SchemaReference.js @@ -21,8 +21,7 @@ function formatType(cellSchema) { // $ref if (cellSchema.$ref) { - const ref = cellSchema.$ref; - const name = ref.startsWith('#/$defs/') ? ref.replace('#/$defs/', '') : ref; + const name = refToDefName(cellSchema.$ref) || cellSchema.$ref; return `${name}`; } @@ -464,10 +463,7 @@ function UnionOptionsTable({ options, contextName }) { if (Array.isArray(opt.type)) return opt.type.map(capitalizeType).join(' or '); if (opt.$ref) { - const name = opt.$ref.startsWith('#/$defs/') - ? opt.$ref.replace('#/$defs/', '') - : opt.$ref; - return name; + return refToDefName(opt.$ref) || opt.$ref; } return 'N/A'; }; diff --git a/static/schemas/crJSON-schema.json b/static/schemas/crJSON-schema.json new file mode 100644 index 00000000..21514115 --- /dev/null +++ b/static/schemas/crJSON-schema.json @@ -0,0 +1,1698 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://c2pa.org/crjson/crJSON-schema.json", + "title": "Content Credential JSON (CrJSON) Document Schema", + "description": "JSON Schema for Content Credential JSON (CrJSON) documents. CrJSON does not include asset_info, content, or metadata.", + "type": "object", + "required": ["@context", "manifests", "jsonGenerator"], + "properties": { + "@context": { + "description": "JSON-LD context defining namespaces and vocabularies", + "oneOf": [ + { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "minItems": 1 + }, + { + "type": "object", + "properties": { + "@vocab": { + "type": "string", + "format": "uri" + } + }, + "additionalProperties": { + "type": "string" + } + } + ] + }, + "manifests": { + "description": "Array of C2PA manifests embedded in the asset", + "type": "array", + "items": { + "$ref": "#/definitions/manifest" + } + }, + "jsonGenerator": { + "description": "Information about the tool used to generate this JSON", + "$ref": "#/definitions/jsonGenerator" + } + }, + "additionalProperties": true, + "definitions": { + "jsonGenerator": { + "type": "object", + "description": "Information about the claim generator (generator-info fields); name/version align with claim.cddl generator-info-map;", + "properties": { + "name": { + "type": "string", + "description": "Name of the software" + }, + "version": { + "type": "string", + "description": "Version of the software (SemVer 2.0: major.minor.patch with optional pre-release and build)", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + } + }, + "required": ["name", "version"], + "additionalProperties": true + }, + "manifest": { + "type": "object", + "description": "CrJSON manifest wrapper containing label, assertions, claim or claim.v2, signature, and validationResults. Claim content: claim.cddl claim-map or claim-map-v2.", + "required": ["label", "assertions", "signature", "validationResults"], + "oneOf": [ + { + "required": ["claim"] + }, + { + "required": ["claim.v2"] + } + ], + "properties": { + "label": { + "type": "string", + "description": "Manifest label or URN identifier" + }, + "assertions": { + "type": "object", + "description": "Assertions contained within the manifest, keyed by the assertion's label", + "additionalProperties": true + }, + "claim": { + "$ref": "#/definitions/claimV1", + "description": "Claim map (v1) per C2PA CDDL claim-map; alternative to claim.v2. A manifest SHALL contain either claim or claim.v2." + }, + "claim.v2": { + "$ref": "#/definitions/claim", + "description": "Normalized claim (v2) per C2PA CDDL claim-map-v2; alternative to claim. A manifest SHALL contain either claim or claim.v2." + }, + "signature": { + "$ref": "#/definitions/signature" + }, + "validationResults": { + "$ref": "#/definitions/manifestValidationResults", + "description": "Validation status codes for this manifest (success, informational, failure) and when validation was performed" + }, + "ingredientDeltas": { + "type": "array", + "description": "Validation deltas for this manifest's ingredient assertions. Present when ingredients are C2PA assets.", + "items": { + "$ref": "#/definitions/ingredientDeltaValidationResult" + } + } + }, + "additionalProperties": false + }, + "claimV1": { + "type": "object", + "description": "Claim map (v1). CDDL: claim.cddl claim-map. Alternative to claim.v2; each manifest may contain either claim or claim.v2.", + "required": [ + "claim_generator", + "claim_generator_info", + "signature", + "assertions", + "dc:format", + "instanceID" + ], + "properties": { + "claim_generator": { + "type": "string", + "description": "User-Agent string for the claim generator that created the claim (RFC 7231 ยง5.5.3)" + }, + "claim_generator_info": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/softwareAgent" + }, + "description": "Detailed information about the claim generator (one or more generator-info maps)" + }, + "signature": { + "type": "string", + "description": "JUMBF URI reference to the signature of this claim" + }, + "assertions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/hashedUriMap" + }, + "description": "Hashed URI references to assertions in this claim" + }, + "dc:format": { + "type": "string", + "description": "Media type of the asset" + }, + "instanceID": { + "type": "string", + "description": "Uniquely identifies a specific version of an asset" + }, + "dc:title": { + "type": "string", + "description": "Name of the asset (Dublin Core)" + }, + "redacted_assertions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "JUMBF URI references to redacted ingredient manifest assertions" + }, + "alg": { + "type": "string", + "description": "Cryptographic hash algorithm for data hash assertions in this claim (C2PA data hash algorithm identifier registry)" + }, + "alg_soft": { + "type": "string", + "description": "Algorithm for soft binding assertions in this claim (C2PA soft binding algorithm identifier registry)" + }, + "metadata": { + "$ref": "#/definitions/assertionMetadataMap" + } + }, + "additionalProperties": false + }, + "hashedUriMap": { + "type": "object", + "description": "Hashed URI reference (url and hash). CDDL: hashed-uri.cddl $hashed-uri-map.", + "required": ["url", "hash"], + "properties": { + "url": { + "type": "string", + "description": "JUMBF URI reference" + }, + "hash": { + "type": "string", + "description": "Hash value (Base64-encoded with b64' prefix)" + }, + "alg": { + "type": "string", + "description": "Hash algorithm identifier; if absent, taken from enclosing structure" + } + }, + "additionalProperties": false + }, + "assertionMetadataMap": { + "type": "object", + "description": "Additional information about an assertion. CDDL: assertion-metadata-common.cddl $assertion-metadata-map.", + "properties": { + "dateTime": { + "type": "string", + "format": "date-time", + "description": "RFC 3339 date-time when the assertion was created/generated (tdate)" + }, + "reviewRatings": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/ratingMap" + }, + "description": "Ratings given to the assertion" + }, + "reference": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI reference to another assertion that this review is about" + }, + "dataSource": { + "$ref": "#/definitions/sourceMap", + "description": "Description of the source of the assertion data" + }, + "localizations": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/localizationDataEntry" + }, + "description": "Localizations for strings in the assertion" + }, + "regionOfInterest": { + "$ref": "#/definitions/regionMap", + "description": "Region of the asset where this assertion is relevant ($region-map)" + } + }, + "additionalProperties": true + }, + "sourceMap": { + "type": "object", + "description": "Source of assertion data. CDDL: assertion-metadata-common.cddl source-map.", + "required": ["type"], + "properties": { + "type": { + "type": "string", + "description": "Source type; $source-type", + "enum": [ + "signer", + "claimGenerator.REE", + "claimGenerator.TEE", + "localProvider.REE", + "localProvider.TEE", + "remoteProvider.1stParty", + "remoteProvider.3rdParty", + "humanEntry", + "humanEntry.anonymous", + "humanEntry.identified" + ] + }, + "details": { + "type": "string", + "description": "Human-readable details about the source, e.g. URL of the remote server" + } + }, + "additionalProperties": false + }, + "ratingMap": { + "type": "object", + "description": "Rating of an assertion item. CDDL: assertion-metadata-common.cddl rating-map.", + "required": ["value"], + "properties": { + "value": { + "type": "integer", + "minimum": 1, + "maximum": 5, + "description": "Rating from 1 (worst) to 5 (best)" + }, + "code": { + "type": "string", + "description": "Label-formatted reason for the rating; $review-code", + "enum": [ + "actions.unknownActionsPerformed", + "actions.missing", + "actions.possiblyMissing", + "depthMap.sceneMismatch", + "ingredient.modified", + "ingredient.possiblyModified", + "thumbnail.primaryMismatch", + "stds.iptc.location.inaccurate", + "stds.schema-org.CreativeWork.misattributed", + "stds.schema-org.CreativeWork.missingAttribution" + ] + }, + "explanation": { + "type": "string", + "description": "Human-readable explanation for the rating" + } + }, + "additionalProperties": false + }, + "localizationDataEntry": { + "type": "object", + "description": "Localization dictionary (language keys to string). CDDL: assertion-metadata-common.cddl $localization-data-entry.", + "additionalProperties": { + "type": "string" + } + }, + "claim": { + "type": "object", + "description": "Claim (v2). CDDL: claim.cddl claim-map-v2.", + "required": [ + "instanceID", + "claim_generator_info", + "signature", + "created_assertions" + ], + "properties": { + "instanceID": { + "type": "string", + "description": "Uniquely identifies a specific version of an asset" + }, + "claim_generator_info": { + "$ref": "#/definitions/softwareAgent", + "description": "The claim generator of this claim (single generator-info map)" + }, + "signature": { + "type": "string", + "description": "JUMBF URI reference to the signature of this claim" + }, + "created_assertions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/hashedUriMap" + }, + "description": "Hashed URI references to created assertions" + }, + "gathered_assertions": { + "type": "array", + "items": { + "$ref": "#/definitions/hashedUriMap" + }, + "description": "Hashed URI references to gathered assertions" + }, + "dc:title": { + "type": "string", + "description": "Name of the asset (Dublin Core)" + }, + "redacted_assertions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "JUMBF URI references to the assertions of ingredient manifests being redacted" + }, + "alg": { + "type": "string", + "description": "Cryptographic hash algorithm for data hash assertions in this claim (C2PA data hash algorithm identifier registry)" + }, + "alg_soft": { + "type": "string", + "description": "Algorithm for soft binding assertions in this claim (C2PA soft binding algorithm identifier registry)" + }, + "specVersion": { + "type": "string", + "description": "The version of the specification used to produce this claim (SemVer)" + }, + "metadata": { + "$ref": "#/definitions/assertionMetadataMap", + "description": "Additional information about the assertion (DEPRECATED)" + } + }, + "additionalProperties": false + }, + "assertions": { + "type": "object", + "description": "Container of assertion objects keyed by assertion label. Each key (e.g. c2pa.hash.data, c2pa.actions) corresponds to a C2PA assertion type; see definitions and INTERNAL/cddl for data-hash, boxes-hash, actions, ingredient, etc.", + "properties": { + "c2pa.hash.data": { + "$ref": "#/definitions/hashDataAssertion" + }, + "c2pa.hash.bmff.v2": { + "$ref": "#/definitions/hashBmffAssertion" + }, + "c2pa.hash.boxes": { + "$ref": "#/definitions/hashBoxesAssertion" + }, + "c2pa.hash.multi-asset": { + "$ref": "#/definitions/hashMultiAssetAssertion" + }, + "c2pa.actions": { + "$ref": "#/definitions/actionsAssertionV1" + }, + "c2pa.actions.v2": { + "$ref": "#/definitions/actionsAssertionV2" + }, + "c2pa.ingredient": { + "$ref": "#/definitions/ingredientAssertionV1" + }, + "c2pa.ingredient.v2": { + "$ref": "#/definitions/ingredientAssertionV2" + }, + "c2pa.ingredient.v3": { + "$ref": "#/definitions/ingredientAssertionV3" + }, + "c2pa.thumbnail.claim.jpeg": { + "$ref": "#/definitions/thumbnailAssertion" + }, + "c2pa.thumbnail.ingredient.jpeg": { + "$ref": "#/definitions/thumbnailAssertion" + }, + "c2pa.soft-binding": { + "$ref": "#/definitions/softBindingAssertion" + } + }, + "patternProperties": { + "^c2pa\\.thumbnail\\.ingredient": { + "$ref": "#/definitions/thumbnailAssertion" + }, + "^c2pa\\.hash\\.(data|bmff\\.v2|boxes)\\.part(__[0-9]+)?$": { + "description": "Part hash assertion: standard hard binding assertion with .part and optional multiple instance identifier (e.g. c2pa.hash.data.part, c2pa.hash.data.part__2). Byte offsets in the assertion are relative to the part.", + "oneOf": [ + { + "$ref": "#/definitions/hashDataAssertion" + }, + { + "$ref": "#/definitions/hashBmffAssertion" + }, + { + "$ref": "#/definitions/hashBoxesAssertion" + } + ] + } + }, + "additionalProperties": true + }, + "hashDataAssertion": { + "type": "object", + "description": "Data hash assertion (c2pa.hash.data). CDDL: data-hash.cddl data-hash-map, EXCLUSION_RANGE-map.", + "properties": { + "alg": { + "type": "string", + "description": "Hash algorithm" + }, + "hash": { + "type": "string", + "description": "Base64-encoded hash value with b64' prefix" + }, + "pad": { + "type": "string", + "description": "Padding bytes" + }, + "pad2": { + "type": "string", + "description": "Secondary padding bytes" + }, + "name": { + "type": "string", + "description": "Name of the hashed data" + }, + "exclusions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "start": { + "type": "integer", + "description": "Starting byte position of exclusion" + }, + "length": { + "type": "integer", + "description": "Length of exclusion in bytes" + } + }, + "required": ["start", "length"] + } + } + }, + "required": ["hash", "pad"], + "additionalProperties": false + }, + "hashBoxesAssertion": { + "type": "object", + "description": "Boxes hash assertion (c2pa.hash.boxes). CDDL: boxes-hash.cddl box-map.", + "required": ["boxes"], + "properties": { + "boxes": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/boxHashMap" + }, + "description": "Array of box-hash-map entries" + }, + "alg": { + "type": "string", + "description": "Cryptographic hash algorithm (C2PA hash algorithm identifier). If absent, taken from enclosing structure." + } + }, + "additionalProperties": false + }, + "boxHashMap": { + "type": "object", + "description": "Single box hash entry. CDDL: boxes-hash.cddl box-hash-map.", + "required": ["names", "hash"], + "properties": { + "names": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1, + "maxLength": 10, + "description": "Box identifier in order of appearance (e.g. APP0, IHDR); box-name" + }, + "description": "Box identifiers in order of appearance" + }, + "alg": { + "type": "string", + "description": "Hash algorithm for this box; if absent, from enclosing structure" + }, + "hash": { + "type": "string", + "description": "Hash value (byte string; in JSON typically Base64-encoded with b64' prefix)" + }, + "excluded": { + "type": "boolean", + "description": "If true, a validator can ignore this box (and associated hash) during validation" + }, + "exclusions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/boxExclusionsMap" + }, + "description": "Hash exclusion ranges; ranges have monotonically increasing start values and do not overlap" + }, + "pad": { + "type": "string", + "description": "Zero-filled byte string used for filling up space (typically Base64-encoded with b64' prefix in JSON)" + }, + "pad2": { + "type": "string", + "description": "Zero-filled byte string used for filling up space (typically Base64-encoded with b64' prefix in JSON)" + } + }, + "additionalProperties": false + }, + "boxExclusionsMap": { + "type": "object", + "description": "Exclusion range for a box. CDDL: boxes-hash.cddl box-exclusions-map.", + "required": ["start", "length"], + "properties": { + "start": { + "type": "integer", + "minimum": 0, + "description": "Starting byte offset from the start of the box (uint)" + }, + "length": { + "type": "integer", + "minimum": 0, + "description": "Number of bytes of data to exclude (uint)" + }, + "boxIndex": { + "type": "integer", + "description": "0-based index into the names array in the box-hash-map; can be omitted if the number of boxes is one" + } + }, + "additionalProperties": false + }, + "hashMultiAssetAssertion": { + "type": "object", + "description": "Multi-asset hash assertion (c2pa.hash.multi-asset). CDDL: multi-asset-hash.cddl multi-asset-hash-map.", + "required": ["parts"], + "properties": { + "parts": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/partHashMap" + }, + "description": "Array of hashes for individual parts of the multi-part file" + } + }, + "additionalProperties": false + }, + "partHashMap": { + "type": "object", + "description": "Part hash entry. CDDL: multi-asset-hash.cddl part-hash-map.", + "required": ["location", "hashAssertion"], + "properties": { + "location": { + "$ref": "#/definitions/locatorMap", + "description": "Location of the part within the file (byte range or BMFF box path)" + }, + "hashAssertion": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI to the hash assertion for the part (e.g. c2pa.hash.data.part, c2pa.hash.data.part__2). Byte offsets in that assertion are relative to the part." + }, + "optional": { + "type": "boolean", + "description": "If true, the part is optional and can be discarded" + } + }, + "additionalProperties": false + }, + "locatorMap": { + "type": "object", + "description": "Location of a part (byte range or BMFF box path). CDDL: multi-asset-hash.cddl locator-map.", + "oneOf": [ + { + "required": ["byteOffset", "length"], + "properties": { + "byteOffset": { + "type": "integer", + "minimum": 0, + "description": "Byte offset of the part within the file (uint)" + }, + "length": { + "type": "integer", + "minimum": 0, + "description": "Length of the part in bytes (uint)" + } + }, + "additionalProperties": false + }, + { + "required": ["bmffBox"], + "properties": { + "bmffBox": { + "type": "string", + "description": "XPath to the BMFF box of the part" + } + }, + "additionalProperties": false + } + ] + }, + "softBindingAssertion": { + "type": "object", + "description": "Soft binding assertion (c2pa.soft-binding). CDDL: soft-binding.cddl soft-binding-map.", + "required": ["alg", "blocks"], + "properties": { + "alg": { + "type": "string", + "description": "Soft binding algorithm and version from C2PA soft binding algorithm list. If absent, taken from enclosing alg_soft." + }, + "blocks": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/softBindingBlockMap" + }, + "description": "One or more soft bindings across some or all of the asset's content" + }, + "pad": { + "type": "string", + "description": "Zero-filled byte string for filling space (typically Base64 in JSON)" + }, + "pad2": { + "type": "string", + "description": "Zero-filled byte string for filling space (typically Base64 in JSON)" + }, + "name": { + "type": "string", + "description": "Human-readable description of what this hash covers" + }, + "alg-params": { + "type": "string", + "description": "CBOR byte string (e.g. Base64 in JSON) describing parameters of the soft binding algorithm" + }, + "bindingMetadata": { + "$ref": "#/definitions/softBindingMetadataMap", + "description": "Additional metadata of the soft binding" + }, + "url": { + "type": "string", + "format": "uri", + "description": "Unused and deprecated" + } + }, + "additionalProperties": false + }, + "softBindingBlockMap": { + "type": "object", + "description": "Single soft binding block. CDDL: soft-binding.cddl soft-binding-block-map.", + "required": ["scope", "value"], + "properties": { + "scope": { + "$ref": "#/definitions/softBindingScopeMap", + "description": "Scope of the digital content over which the soft binding is computed" + }, + "value": { + "type": "string", + "description": "CBOR byte string (e.g. Base64 in JSON), in algorithm-specific format, for the soft binding value over this block" + } + }, + "additionalProperties": false + }, + "softBindingScopeMap": { + "type": "object", + "description": "Scope of content for a soft binding block. CDDL: soft-binding.cddl soft-binding-scope-map.", + "properties": { + "extent": { + "type": "string", + "description": "Deprecated. CBOR byte string (e.g. Base64) describing the part of content over which the binding was computed" + }, + "timespan": { + "$ref": "#/definitions/softBindingTimespanMap", + "description": "Time range over which the soft binding value has been computed" + }, + "region": { + "$ref": "#/definitions/regionMap", + "description": "Region of interest (region-map)" + } + }, + "additionalProperties": false + }, + "softBindingTimespanMap": { + "type": "object", + "description": "Time range for soft binding. CDDL: soft-binding.cddl soft-binding-timespan-map.", + "required": ["start", "end"], + "properties": { + "start": { + "type": "integer", + "minimum": 0, + "description": "Start of the time range in milliseconds from media start (uint)" + }, + "end": { + "type": "integer", + "minimum": 0, + "description": "End of the time range in milliseconds from media start (uint)" + } + }, + "additionalProperties": false + }, + "softBindingMetadataMap": { + "type": "object", + "description": "Additional metadata for soft binding. CDDL: soft-binding.cddl soft-binding-metadata-map.", + "properties": { + "description": { + "type": "string", + "description": "Additional description of the implementation or author of the binding or algorithm" + }, + "contact": { + "type": "string", + "description": "Contact information for the implementation or author of the binding or algorithm" + }, + "informationalUrl": { + "type": "string", + "description": "Web page with more details about the implementation or author of the binding or algorithm" + } + }, + "additionalProperties": true + }, + "actionsAssertionV1": { + "type": "object", + "description": "Actions assertion (v1) (c2pa.actions). CDDL: actions.cddl actions-map.", + "properties": { + "actions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/actionItemV1" + }, + "description": "List of actions (action-items-map)" + }, + "metadata": { + "$ref": "#/definitions/assertionMetadataMap" + } + }, + "required": ["actions"], + "additionalProperties": false + }, + "actionItemV1": { + "type": "object", + "description": "Single action (v1). CDDL: actions.cddl action-items-map.", + "properties": { + "action": { + "type": "string", + "description": "Action type (e.g., c2pa.created, c2pa.edited, c2pa.converted); $action-choice" + }, + "when": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the action occurred (tdate)" + }, + "softwareAgent": { + "type": "string", + "description": "The software agent that performed the action" + }, + "changed": { + "type": "string", + "description": "Semicolon-delimited list of parts of the resource that were changed since the previous event history" + }, + "instanceID": { + "type": "string", + "description": "xmpMM:InstanceID for the modified (output) resource (buuid)" + }, + "parameters": { + "$ref": "#/definitions/parametersMapV1", + "description": "Additional parameters of the action" + }, + "digitalSourceType": { + "type": "string", + "description": "One of the defined source types at https://cv.iptc.org/newscodes/digitalsourcetype/" + } + }, + "required": ["action"], + "additionalProperties": false + }, + "parametersMapV1": { + "type": "object", + "description": "Action parameters (v1). CDDL: actions.cddl parameters-map.", + "properties": { + "ingredient": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI to the ingredient assertion this action acts on" + }, + "description": { + "type": "string", + "description": "Additional description of the action" + } + }, + "additionalProperties": true + }, + "actionsAssertionV2": { + "type": "object", + "description": "Actions assertion (v2) (c2pa.actions.v2). CDDL: actions.cddl actions-map-v2.", + "properties": { + "actions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/actionItemV2" + }, + "description": "List of actions (action-item-map-v2)" + }, + "templates": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/actionTemplateV2" + }, + "description": "List of templates for the actions" + }, + "softwareAgents": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/softwareAgent" + }, + "description": "List of software/hardware that performed the actions (generator-info maps)" + }, + "metadata": { + "$ref": "#/definitions/assertionMetadataMap" + }, + "allActionsIncluded": { + "type": "boolean", + "description": "If true, indicates that all actions performed are included in this assertion" + } + }, + "required": ["actions"], + "additionalProperties": false + }, + "actionItemV2": { + "type": "object", + "description": "Single action (v2). CDDL: actions.cddl action-item-map-v2.", + "properties": { + "action": { + "type": "string", + "description": "Action type; $action-choice" + }, + "softwareAgent": { + "$ref": "#/definitions/softwareAgent", + "description": "Description of the software/hardware that did the action (generator-info map)" + }, + "softwareAgentIndex": { + "type": "integer", + "description": "0-based index into the softwareAgents array in the actions assertion" + }, + "description": { + "type": "string", + "description": "Additional description of the action, important for custom actions" + }, + "digitalSourceType": { + "type": "string", + "description": "One of the defined source types at https://cv.iptc.org/newscodes/digitalsourcetype/" + }, + "when": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the action occurred (tdate)" + }, + "changes": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/regionMap" + }, + "description": "Regions of interest of the resource that were changed" + }, + "related": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/actionItemV2" + }, + "description": "List of related actions" + }, + "reason": { + "type": "string", + "description": "Reason the action was performed (required when action is c2pa.redacted); $action-reason" + }, + "parameters": { + "$ref": "#/definitions/parametersMapV2", + "description": "Additional parameters of the action" + } + }, + "required": ["action"], + "additionalProperties": false + }, + "actionTemplateV2": { + "type": "object", + "description": "Action template (v2). CDDL: actions.cddl action-template-map-v2.", + "properties": { + "action": { + "type": "string", + "description": "Action type or \"*\" for templates; $action-choice / \"*\"" + }, + "softwareAgent": { + "$ref": "#/definitions/softwareAgent", + "description": "Description of the software/hardware (generator-info map)" + }, + "softwareAgentIndex": { + "type": "integer", + "description": "0-based index into the softwareAgents array" + }, + "description": { + "type": "string", + "description": "Additional description of the action" + }, + "digitalSourceType": { + "type": "string", + "description": "Digital source type URI" + }, + "icon": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI reference to an embedded data assertion" + }, + "templateParameters": { + "type": "object", + "description": "Additional parameters of the template (parameters-common-map-v2)", + "additionalProperties": true + } + }, + "required": ["action"], + "additionalProperties": false + }, + "regionMap": { + "type": "object", + "description": "Region of interest. CDDL: regions-of-interest.cddl region-map.", + "additionalProperties": true + }, + "parametersMapV2": { + "type": "object", + "description": "Action parameters (v2). CDDL: actions.cddl parameters-map-v2.", + "properties": { + "redacted": { + "type": "string", + "description": "JUMBF URI to the redacted assertion (required when action is c2pa.redacted)" + }, + "ingredients": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/hashedUriMap" + }, + "description": "List of hashed JUMBF URIs to ingredient (v2 or v3) assertion(s) this action acts on" + }, + "sourceLanguage": { + "type": "string", + "description": "BCP-47 code of the source language for c2pa.translated" + }, + "targetLanguage": { + "type": "string", + "description": "BCP-47 code of the target language for c2pa.translated" + }, + "multipleInstances": { + "type": "boolean", + "description": "Whether this action was performed multiple times" + } + }, + "additionalProperties": true + }, + "softwareAgent": { + "type": "object", + "description": "Generator/software agent info. CDDL: claim.cddl generator-info-map.", + "properties": { + "name": { + "type": "string", + "description": "Name of the software" + }, + "version": { + "type": "string", + "description": "Version of the software" + }, + "icon": { + "$ref": "#/definitions/hashedUriMap", + "description": "Icon representing the software/hardware" + }, + "operating_system": { + "type": "string", + "description": "Operating system the software runs on" + } + }, + "required": ["name"], + "additionalProperties": true + }, + "certificateInfo": { + "type": "object", + "description": "Certificate details (serial number, issuer, subject, validity). CrJSON decoding of signing certificate; no CDDL rule in INTERNAL/cddl.", + "properties": { + "serialNumber": { + "type": "string", + "description": "Certificate serial number" + }, + "issuer": { + "$ref": "#/definitions/distinguishedName" + }, + "subject": { + "$ref": "#/definitions/distinguishedName" + }, + "validity": { + "type": "object", + "properties": { + "notBefore": { + "type": "string", + "format": "date-time" + }, + "notAfter": { + "type": "string", + "format": "date-time" + } + } + } + }, + "required": ["serialNumber", "issuer", "subject", "validity"], + "additionalProperties": true + }, + "signature": { + "type": "object", + "description": "Decoded claim signature (algorithm, certificate, optional timestamp). CrJSON decoding of Claim Signature box; no CDDL rule in INTERNAL/cddl.", + "properties": { + "algorithm": { + "type": "string", + "description": "Algorithm used for signing (e.g., SHA256withECDSA)" + }, + "certificateInfo": { + "$ref": "#/definitions/certificateInfo" + }, + "timeStampInfo": { + "type": "object", + "description": "Timestamp information (e.g. from TSA), when present", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Time at which the time-stamp was created; RFC 3339 format" + }, + "certificateInfo": { + "$ref": "#/definitions/certificateInfo" + } + }, + "required": ["timestamp", "certificateInfo"] + } + }, + "required": ["algorithm", "certificateInfo"], + "additionalProperties": false + }, + "distinguishedName": { + "type": "object", + "description": "X.509 Distinguished Name components. Used in signature/certificate decoding; no CDDL rule in INTERNAL/cddl.", + "properties": { + "C": { + "type": "string", + "description": "Country" + }, + "ST": { + "type": "string", + "description": "State or province" + }, + "L": { + "type": "string", + "description": "Locality" + }, + "O": { + "type": "string", + "description": "Organization" + }, + "OU": { + "type": "string", + "description": "Organizational unit" + }, + "CN": { + "type": "string", + "description": "Common name" + }, + "E": { + "type": "string", + "description": "Email address" + }, + "2.5.4.97": { + "type": "string", + "description": "Organization identifier OID" + } + }, + "additionalProperties": false + }, + "manifestValidationResults": { + "type": "object", + "description": "Per-manifest validation status codes and validation time. Used in each manifest's validationResults.", + "properties": { + "success": { + "type": "array", + "items": { + "$ref": "#/definitions/validationStatusEntry" + } + }, + "informational": { + "type": "array", + "items": { + "$ref": "#/definitions/validationStatusEntry" + } + }, + "failure": { + "type": "array", + "items": { + "$ref": "#/definitions/validationStatusEntry" + } + }, + "specVersion": { + "type": "string", + "description": "The version of the specification against which the validation was performed (SemVer formatted string)", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + }, + "validationTime": { + "type": "string", + "format": "date-time", + "description": "Time when the validation was performed; RFC 3339 format" + } + }, + "required": [ + "success", + "informational", + "failure", + "specVersion", + "validationTime" + ], + "additionalProperties": false + }, + "ingredientAssertionV1": { + "type": "object", + "description": "Ingredient assertion (v1) (c2pa.ingredient). CDDL: ingredient.cddl ingredient-map.", + "required": ["dc:title", "dc:format", "instanceID", "relationship"], + "properties": { + "dc:title": { + "type": "string", + "description": "Name of the ingredient (Dublin Core)" + }, + "dc:format": { + "type": "string", + "description": "Media type of the ingredient (format-string)" + }, + "documentID": { + "type": "string", + "description": "Value of the ingredient's xmpMM:DocumentID" + }, + "instanceID": { + "type": "string", + "description": "Unique identifier, e.g. value of the ingredient's xmpMM:InstanceID" + }, + "relationship": { + "type": "string", + "description": "Relationship of this ingredient to the asset; $relation-choice (parentOf, componentOf, inputTo)" + }, + "c2pa_manifest": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI reference to the C2PA Manifest of the ingredient" + }, + "thumbnail": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI reference to an ingredient thumbnail" + }, + "validationStatus": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "description": "Status map per C2PA CDDL $status-map", + "additionalProperties": true + }, + "description": "Validation status of the ingredient" + }, + "metadata": { + "$ref": "#/definitions/assertionMetadataMap" + } + }, + "additionalProperties": false + }, + "ingredientAssertionV2": { + "type": "object", + "description": "Ingredient assertion (v2) (c2pa.ingredient.v2). CDDL: ingredient.cddl ingredient-map-v2.", + "required": ["dc:title", "dc:format", "relationship"], + "properties": { + "dc:title": { + "type": "string", + "description": "Name of the ingredient (Dublin Core)" + }, + "dc:format": { + "type": "string", + "description": "Media type of the ingredient (format-string)" + }, + "relationship": { + "type": "string", + "description": "Relationship of this ingredient to the asset; $relation-choice" + }, + "documentID": { + "type": "string", + "description": "Value of the ingredient's xmpMM:DocumentID" + }, + "instanceID": { + "type": "string", + "description": "Unique identifier, e.g. value of the ingredient's xmpMM:InstanceID" + }, + "data": { + "description": "Hashed URI to embedded data assertion or hashed_ext_uri to external data", + "oneOf": [ + { + "$ref": "#/definitions/hashedUriMap" + }, + { + "$ref": "#/definitions/hashedExtUriMap" + } + ] + }, + "data_types": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "description": "Asset type per C2PA CDDL $asset-type-map", + "additionalProperties": true + }, + "description": "Additional information about the data's type" + }, + "c2pa_manifest": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI reference to the C2PA Manifest of the ingredient" + }, + "thumbnail": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI reference to a thumbnail in an embedded data assertion" + }, + "validationStatus": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "description": "Status map per C2PA CDDL $status-map", + "additionalProperties": true + }, + "description": "Validation status of the ingredient" + }, + "description": { + "type": "string", + "description": "Additional description of the ingredient" + }, + "informational_URI": { + "type": "string", + "description": "URI to an informational page about the ingredient or its data" + }, + "metadata": { + "$ref": "#/definitions/assertionMetadataMap" + } + }, + "additionalProperties": false + }, + "ingredientAssertionV3": { + "type": "object", + "description": "Ingredient assertion (v3) (c2pa.ingredient.v3). CDDL: ingredient.cddl ingredient-map-v3. When the ingredient is a C2PA asset, activeManifest and validationResults are both required (validation is performed to determine the active manifest).", + "required": ["relationship"], + "dependentRequired": { + "activeManifest": ["validationResults"], + "validationResults": ["activeManifest"] + }, + "properties": { + "dc:title": { + "type": "string", + "description": "Name of the ingredient (Dublin Core)" + }, + "dc:format": { + "type": "string", + "description": "Media type of the ingredient (format-string)" + }, + "relationship": { + "type": "string", + "description": "Relationship of this ingredient to the asset; $relation-choice" + }, + "validationResults": { + "$ref": "#/definitions/validationResults", + "description": "Results from the claim generator performing full validation on the ingredient asset ($validation-results-map)" + }, + "instanceID": { + "type": "string", + "description": "Unique identifier, e.g. value of the ingredient's xmpMM:InstanceID" + }, + "data": { + "description": "Hashed URI to embedded data assertion or hashed_ext_uri to external data", + "oneOf": [ + { + "$ref": "#/definitions/hashedUriMap" + }, + { + "$ref": "#/definitions/hashedExtUriMap" + } + ] + }, + "dataTypes": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "description": "Asset type per C2PA CDDL $asset-type-map", + "additionalProperties": true + }, + "description": "Additional information about the data's type (v3 camelCase)" + }, + "activeManifest": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI to the box corresponding to the active manifest of the ingredient" + }, + "claimSignature": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI to the Claim Signature box in the C2PA Manifest of the ingredient" + }, + "thumbnail": { + "$ref": "#/definitions/hashedUriMap", + "description": "Hashed URI reference to a thumbnail in an embedded data assertion" + }, + "description": { + "type": "string", + "description": "Additional description of the ingredient" + }, + "informationalURI": { + "type": "string", + "description": "URI to an informational page about the ingredient or its data (v3 camelCase)" + }, + "softBindingsMatched": { + "type": "boolean", + "description": "Whether soft bindings were matched" + }, + "softBindingAlgorithmsMatched": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + }, + "description": "Array of algorithm names used for discovering the active manifest" + }, + "metadata": { + "$ref": "#/definitions/assertionMetadataMap" + } + }, + "additionalProperties": false + }, + "hashedExtUriMap": { + "type": "object", + "description": "Reference to an external URL and its hash. CDDL: hashed-ext-uri.cddl $hashed-ext-uri-map. Used in ingredient v2/v3 data field.", + "properties": { + "url": { + "type": "string", + "description": "HTTP/HTTPS URI reference to external data", + "format": "uri" + }, + "alg": { + "type": "string", + "description": "String identifying the cryptographic hash algorithm used to compute the hash on this URI's data, taken from the C2PA hash algorithm identifier list." + }, + "hash": { + "type": "string", + "description": "Base64-encoded with b64' prefix hash value of the external data" + }, + "dc:format": { + "type": "string", + "description": "IANA media type of the data (optional)" + }, + "size": { + "type": "integer", + "description": "Number of bytes of data (optional)" + }, + "data_types": { + "type": "array", + "description": "Additional information about the data's type (optional)", + "items": { + "type": "object", + "additionalProperties": true + } + } + }, + "required": ["url", "alg", "hash"], + "additionalProperties": false + }, + "thumbnailAssertion": { + "type": "object", + "description": "Thumbnail assertion (e.g. c2pa.thumbnail.claim.jpeg, c2pa.thumbnail.ingredient.jpeg). No CDDL in INTERNAL/cddl; structure is CrJSON/schema-defined.", + "properties": { + "thumbnailType": { + "type": "integer", + "description": "Thumbnail type (0=claim, 1=ingredient)" + }, + "mimeType": { + "type": "string", + "description": "MIME type of thumbnail" + } + }, + "additionalProperties": false + }, + "bmffExclusionsMap": { + "type": "object", + "description": "Exclusion entry for BMFF hash. CDDL: bmff-hash.cddl exclusions-map.", + "required": ["xpath"], + "properties": { + "xpath": { + "type": "string", + "description": "Location of box(es) to exclude (XPath from root node)" + }, + "length": { + "type": "integer", + "minimum": 0, + "description": "Length that a leafmost box must have to be excluded" + }, + "data": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/bmffDataMap" + }, + "description": "Data at relative byte offset that must match for box to be excluded" + }, + "subset": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/bmffSubsetMap" + }, + "description": "Portion of the excluded box that is excluded from the hash" + }, + "version": { + "type": "integer", + "description": "Version that must be set in a leafmost FullBox for the box to be excluded" + }, + "flags": { + "type": "string", + "description": "24-bit flags (3-byte byte string, e.g. Base64-encoded with b64' prefix in JSON). Only for FullBox when version is specified." + }, + "exact": { + "type": "boolean", + "description": "If true, flags must be an exact match (default true). Only for FullBox when flags is specified." + } + }, + "additionalProperties": false + }, + "bmffDataMap": { + "type": "object", + "description": "CDDL: bmff-hash.cddl data-map.", + "required": ["offset", "value"], + "properties": { + "offset": { + "type": "integer", + "minimum": 0, + "description": "Relative byte offset in the leafmost box" + }, + "value": { + "type": "string", + "description": "Byte string (e.g. Base64 in JSON) that must match at the offset" + } + }, + "additionalProperties": false + }, + "bmffSubsetMap": { + "type": "object", + "description": "CDDL: bmff-hash.cddl subset-map.", + "required": ["offset", "length"], + "properties": { + "offset": { + "type": "integer", + "minimum": 0, + "description": "Relative byte offset within the excluded box" + }, + "length": { + "type": "integer", + "minimum": 0, + "description": "Number of bytes in this subset" + } + }, + "additionalProperties": false + }, + "bmffMerkleMap": { + "type": "object", + "description": "Merkle tree row for mdat verification. CDDL: bmff-hash.cddl merkle-map.", + "required": ["uniqueId", "localId", "count", "hashes"], + "properties": { + "uniqueId": { + "type": "integer", + "description": "1-based unique id to determine which Merkle tree validates a given mdat box" + }, + "localId": { + "type": "integer", + "description": "Local id indicating Merkle tree" + }, + "count": { + "type": "integer", + "description": "Number of leaf nodes in the Merkle tree (null nodes not included)" + }, + "alg": { + "type": "string", + "description": "Hash algorithm for this Merkle tree; if absent, from enclosing structure" + }, + "initHash": { + "type": "string", + "description": "Hash of init segment or bytes before first moof (fragmented MP4); absent for non-fragmented" + }, + "hashes": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + }, + "description": "Ordered array representing a single row of the Merkle tree (e.g. Base64 in JSON)" + }, + "fixedBlockSize": { + "type": "integer", + "minimum": 0, + "description": "Size in bytes of a leaf node (non-fragmented MP4, piecewise mdat validation)" + }, + "variableBlockSizes": { + "type": "array", + "minItems": 1, + "items": { + "type": "integer", + "minimum": 0 + }, + "description": "Size in bytes of each leaf node (non-fragmented MP4); length equals count" + } + }, + "additionalProperties": false + }, + "hashBmffAssertion": { + "type": "object", + "description": "BMFF hash assertion (c2pa.hash.bmff.v2). CDDL: bmff-hash.cddl bmff-hash-map, exclusions-map, merkle-map.", + "required": ["exclusions"], + "properties": { + "exclusions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/bmffExclusionsMap" + }, + "description": "Box(es) to exclude from the hash" + }, + "alg": { + "type": "string", + "description": "Hash algorithm; if absent, from enclosing structure (C2PA hash algorithm identifier list)" + }, + "hash": { + "type": "string", + "description": "Hash of BMFF/segment excluding exclusions (e.g. Base64 in JSON)" + }, + "merkle": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/bmffMerkleMap" + }, + "description": "Merkle tree rows for verification of mdat box(es) or fragment files" + }, + "name": { + "type": "string", + "description": "Human-readable description of what this hash covers" + }, + "url": { + "type": "string", + "format": "uri", + "description": "Unused and deprecated" + }, + "sequenceNumber": { + "type": "integer", + "minimum": 0, + "description": "In a live video workflow, the monotonically increasing sequence number for each segment" + } + }, + "additionalProperties": false + }, + "validationResults": { + "type": "object", + "description": "Validation results (active manifest and optional ingredient deltas). CDDL: validation-results.cddl validation-results-map. Used in ingredient assertions (e.g. c2pa.ingredient.v3).", + "properties": { + "activeManifest": { + "$ref": "#/definitions/statusCodes", + "description": "Validation status codes for the active manifest. Present when ingredient is a C2PA asset." + }, + "ingredientDeltas": { + "type": "array", + "description": "Validation deltas per ingredient assertion. Present when the ingredient is a C2PA asset.", + "items": { + "$ref": "#/definitions/ingredientDeltaValidationResult" + } + }, + "specVersion": { + "type": "string", + "description": "The version of the specification against which the validation was performed (SemVer formatted string)", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + }, + "trustListUri": { + "type": "string", + "format": "uri", + "description": "URI to the trust list that was used to validate certificates" + } + }, + "required": ["activeManifest"], + "additionalProperties": false + }, + "statusCodes": { + "type": "object", + "description": "Success, informational, and failure validation status codes. CDDL: validation-results.cddl status-codes-map.", + "properties": { + "success": { + "type": "array", + "items": { + "$ref": "#/definitions/validationStatusEntry" + } + }, + "informational": { + "type": "array", + "items": { + "$ref": "#/definitions/validationStatusEntry" + } + }, + "failure": { + "type": "array", + "items": { + "$ref": "#/definitions/validationStatusEntry" + } + } + }, + "required": ["success", "informational", "failure"], + "additionalProperties": false + }, + "validationStatusEntry": { + "type": "object", + "description": "Single validation status (code, optional url and explanation). CDDL: validation-results.cddl status-map.", + "properties": { + "code": { + "type": "string", + "description": "Validation status code" + }, + "url": { + "type": "string", + "description": "JUMBF URI where status applies" + }, + "explanation": { + "type": "string", + "description": "Human-readable explanation" + } + }, + "required": ["code"], + "additionalProperties": false + }, + "ingredientDeltaValidationResult": { + "type": "object", + "description": "Validation deltas for one ingredient's manifest. CDDL: validation-results.cddl ingredient-delta-validation-result-map.", + "properties": { + "ingredientAssertionURI": { + "type": "string", + "description": "JUMBF URI to the ingredient assertion" + }, + "validationDeltas": { + "$ref": "#/definitions/statusCodes" + } + }, + "required": ["ingredientAssertionURI", "validationDeltas"], + "additionalProperties": false + } + } +}