| // Copyright 2026 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| edition = "2024"; |
| |
| package credentio; |
| |
| import "cbor/tags.proto"; |
| import "proto/hashed_uri.proto"; |
| |
| // Based on `multi-asset-hash-map`: |
| // https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_general_box_hash. |
| message MultiAssetHashAssertion { |
| repeated MultiAssetPart parts = 1 |
| [(cbor.tags) = { is_required: true, disallow_empty: true }]; |
| |
| // For internal use in the manifest generator -- do not set or read. |
| bytes pad = 2 [(cbor.tags) = { is_required: true }]; |
| // For internal use in the manifest generator -- do not set or read. |
| bytes pad2 = 3; |
| } |
| |
| // Based on `locator-map`: |
| // https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_schema_and_example_6. |
| // Either the `byte_offset` and `length` of a byte range or the `bmff_box` of a |
| // BMFF box. |
| message MultiAssetPartLocation { |
| // These two fields are used to specify a window of bytes within a file. |
| int64 byte_offset = 1 [(cbor.tags) = { name: "byteOffset", type: TYPE_UINT }]; |
| int64 length = 2 [(cbor.tags) = { type: TYPE_UINT }]; |
| |
| // This field is used to specify a BMFF box. |
| string bmff_box = 3 [(cbor.tags) = { name: "bmffBox" }]; |
| } |
| |
| message MultiAssetPart { |
| // The location of the hash part. |
| MultiAssetPartLocation location = 1; |
| // The hash of the part. |
| HashedUri hash_assertion = 2 [(cbor.tags) = { name: "hashAssertion" }]; |
| // Whether the hash is optional. |
| bool is_optional = 3 [(cbor.tags) = { name: "optional" }]; |
| } |