blob: c32b4002ee0820c48b41bfe1d4fa8c2f10cf083d [file]
// 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 = "2023";
package credentio;
import "proto/bmff_based_hash_assertion.proto";
import "proto/boxes_hash_assertion.proto";
import "proto/collection_data_hash_assertion.proto";
import "proto/data_hash_assertion.proto";
import "proto/generator_info.proto";
import "proto/ingredient_validation_result.proto";
import "proto/multi_asset_hash_assertion.proto";
option java_multiple_files = true;
// Metadata to attach to an action.
message ActionMetadata {
GeneratorInfo software_agent = 1;
string description = 2;
// Was this action performed multiple times?
bool multiple_instances = 3;
}
// See description of c2pa.created at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message CreatedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
// Optional. Indexes (within GenerateManifestStoreRequest.ingredients) of
// ingredients to associate with this action.
repeated int64 input_ingredient_indexes = 3;
}
// See description of c2pa.opened at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message OpenedAction {
ActionMetadata action_metadata = 1;
// Required. Index (within GenerateManifestStoreRequest.ingredients) of the
// ingredient to associate with this action.
int64 ingredient_index = 2;
}
// See description of c2pa.addedText at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message AddedTextAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.adjustedColor at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message AdjustedColorAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.changedSpeed at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message ChangedSpeedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.converted at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message ConvertedAction {
ActionMetadata action_metadata = 1;
}
// See description of c2pa.cropped at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message CroppedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.deleted at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message DeletedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.drawing at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message DrawingAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.dubbed at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message DubbedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.edited at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message EditedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
// Optional. Indexes (within GenerateManifestStoreRequest.ingredients) of
// ingredients to associate with this action, using an `inputTo` relationship
// (https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_relationship).
repeated int64 input_ingredient_indexes = 3;
}
// See description of c2pa.edited.metadata at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message EditedMetadataAction {
ActionMetadata action_metadata = 1;
}
// See description of c2pa.enhanced at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message EnhancedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.filtered at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message FilteredAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
// Optional. Indexes (within GenerateManifestStoreRequest.ingredients) of
// ingredients to associate with this action, using an `inputTo` relationship
// (https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_relationship).
repeated int64 input_ingredient_indexes = 3;
}
// See description of c2pa.orientation at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message OrientationAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.placed at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message PlacedAction {
ActionMetadata action_metadata = 1;
// Required. Indexes (within GenerateManifestStoreRequest.ingredients) of
// ingredients to associate with this action.
repeated int64 ingredient_indexes = 3;
reserved 2;
}
message RepackagedAction {
ActionMetadata action_metadata = 1;
}
// See description of c2pa.resized at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message ResizedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.transcoded at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message TranscodedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.trimmed at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message TrimmedAction {
ActionMetadata action_metadata = 1;
string digital_source_type = 2;
}
// See description of c2pa.unknown at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions.
message UnknownAction {
ActionMetadata action_metadata = 1;
}
// Describes an action that was taken on an asset.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions
// for more details.
message Action {
// Required.
oneof action {
AddedTextAction added_text = 2; // c2pa.addedText
AdjustedColorAction adjusted_color = 3; // c2pa.adjustedColor
ChangedSpeedAction changed_speed = 4; // c2pa.changedSpeed
ConvertedAction converted = 5; // c2pa.converted
CroppedAction cropped = 6; // c2pa.cropped
DeletedAction deleted = 7; // c2pa.deleted
DrawingAction drawing = 8; // c2pa.drawing
DubbedAction dubbed = 9; // c2pa.dubbed
EditedAction edited = 10; // c2pa.edited
EditedMetadataAction edited_metadata = 11; // c2pa.edited.metadata
EnhancedAction enhanced = 12; // c2pa.enhanced
FilteredAction filtered = 13; // c2pa.filtered
OrientationAction orientation = 14; // c2pa.orientation
PlacedAction placed = 1; // c2pa.placed
RepackagedAction repackaged = 15; // c2pa.repackaged
ResizedAction resized = 16; // c2pa.resized
TranscodedAction transcoded = 17; // c2pa.transcoded
TrimmedAction trimmed = 19; // c2pa.trimmed
UnknownAction unknown = 20; // c2pa.unknown
}
reserved 18, 21;
}
// Describes a collection of Action(s) that were taken on an asset.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions
// for more details.
message Actions {
// Required. The first action taken to create or import the asset.
oneof inception_action {
CreatedAction created = 1;
OpenedAction opened = 2;
}
// Optional. List of additional actions taken on the asset.
repeated Action actions = 3;
// If true, indicates that all actions performed are included in an actions
// assertion.
bool all_actions_included = 4;
}
// Describes an ingredient input to claim generation. Will be used to generate
// ingredient Assertions. All ingredients must be referenced by an action.
message IngredientInput {
// Optional but recommended. Metadata about the ingredient.
IngredientInputMetadata metadata = 8;
// Optional. Ingredient validation results returned by the validator.
IngredientValidationResultProto ingredient_validation_results = 6;
reserved 1, 2, 3, 4, 5, 7;
}
// Metadata about an ingredient.
message IngredientInputMetadata {
// Optional. IANA Media Type of the ingredient.
// Instead of providing a value here, it is better to provide the media type
// as a parameter to the `ValidateIngredient` call.
string media_type = 1;
// Optional. Name of the ingredient.
string title = 2;
// Optional. Unique identifier such as the value of the ingredient's
// `xmpMM:InstanceID`. If omitted, a randomly generated UUID will be provided.
string instance_id = 3;
// Optional. Additional description of the ingredient.
string description = 4;
// Optional. URI to an informational page about the ingredient or its data.
string informational_uri = 5;
}
// Describes a hard binding assertion. See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_hard_bindings
// for more details.
message HardBinding {
oneof binding {
BmffBasedHashAssertion bmff_based_hash = 1;
BoxesHashAssertion box_hash = 2;
DataHashAssertion data_hash = 3;
CollectionDataHashAssertion collection_data_hash = 5;
}
// Bindings for each part of a multi-part asset, in the order in which they
// appear in the asset.
repeated PartBinding part_bindings = 4;
}
// Describes a binding assertion for a part of a multi-part asset.
// This is a simplified structure, the generator will be responsible for
// converting this into the appropriate binding assertion for the format. See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_multi_asset_hash
// for more details.
message PartBinding {
MultiAssetPartLocation location = 1;
bool is_optional = 2;
oneof binding {
BmffBasedHashAssertion bmff_based_hash = 4;
BoxesHashAssertion box_hash = 5;
DataHashAssertion data_hash = 6;
}
reserved 3;
}
message GenerateManifestStoreOptions {
enum TimeStampingMode {
// If not specified, it behaves as TIME_STAMPING_OPTIONAL.
TIME_STAMPING_MODE_UNSPECIFIED = 0;
// Time-stamping is optional and fail-open. For instance, if the
// time-stamping service is unavailable, no timestamp will be included and a
// padding space is reserved.
TIME_STAMPING_OPTIONAL = 1;
// Time-stamping is required and fail-close. For instance, the request will
// be failed if the time-stamping service is unavailable.
TIME_STAMPING_REQUIRED = 2;
// Time-stamping is omitted and a padding space is reserved.
TIME_STAMPING_OMITTED_WITH_PADDING = 3;
}
TimeStampingMode time_stamping_mode = 2;
// Controls whether the multi-asset hash assertion should be generated.
// If unset or false, no multi-asset hash assertion will be generated.
// If true, the generator will generate a multi-asset hash assertion for
// the asset.
// Impact per format:
// - JPEG: If true, the generator will generate a multi-asset hash assertion
// for the asset when applicable (Android Motion Photo, MPF, AMP, Ultra HDR,
// ...), marking any non-JPEG parts optional.
// Relevant only for container-level generation APIs.
bool generate_multi_asset_hash = 3;
// If nonzero, generation will fail if the generated C2PA manifest store would
// exceed this size. If zero, a default limit will be used.
int64 max_manifest_store_size_bytes = 4;
// If set and greater than or equal to 0, generation will fail if embedding
// the manifest requires shifting more bytes in the asset than this limit.
// This limit is compared against the file size (in bytes) minus the offset of
// the first INSERT instruction.
// NOTE: This option is currently only supported and enforced by the BMFF/MP4
// encoder.
int64 max_bytes_to_shift = 11;
reserved 1, 5, 6, 7, 8, 9, 10;
}
// Describes a gathered assertion to be included in the manifest.
message GatheredAssertion {
// The content type of the gathered assertion.
enum ContentType {
CONTENT_TYPE_UNSPECIFIED = 0;
CONTENT_TYPE_JSON = 1;
}
// Label of the assertion within the assertion store.
string label = 1;
// Raw payload bytes of the assertion.
bytes data = 2;
// The content type of the data. Required.
ContentType content_type = 3;
}
// Describes a request to the claim generator for standard manifests.
message GenerateManifestStoreRequest {
// Optional. Unique identifier for the asset version.
// If the asset contains XMP, then the asset’s xmpMM:InstanceID should be
// used as the instanceID.
// If omitted, the claim generator will generate a new instance ID.
string instance_id = 7;
// Required for "bare metal" APIs, prohibited for "container-level" APIs
// (e.g., PngEncoder, JpegEncoder).
//
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_hard_bindings
// for more details.
HardBinding hard_binding = 6;
// Required. See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions
// for more details.
Actions actions = 4;
// Optional. Ingredient inputs to be included in the generated manifest.
// All ingredients must be referenced by an action.
repeated IngredientInput ingredients = 5;
// Optional. Gathered assertions to be included in the generated manifest.
repeated GatheredAssertion gathered_assertions = 11;
reserved 1, 2, 3, 9, 10;
// Optional. Options to configure the behavior of the generator.
GenerateManifestStoreOptions options = 8;
}
// The result of generating a C2PA manifest store.
message GenerateManifestStoreResponse {
// The generated manifest store.
bytes manifest_store = 1;
// Indicates whether the generated claim has been timestamped or not.
bool is_timestamped = 2;
reserved 3;
}
// A temporate manifest store is returned by the generator during size
// estimation, which will be used to generate the final manifest store.
message ManifestStoreTemplate {
// The expected byte size of the to-be-generated manifest store (`c2pa` JUMBF
// superbox). An asset writer should use this size to reserve space for the
// C2PA data.
//
// This size does not include format-specific wrapping such as the JPEG APP11
// segment header(s) or BMFF `uuid` superbox header.
int64 manifest_store_size = 1;
// An opaque information returned by the generator, which will be used
// subsequently to generate the final manifest store.
bytes generator_context = 2;
}
// A request to finalize a manifest store template into a complete manifest
// store.
message FinalizeManifestStoreRequest {
// Required. The manifest store template returned by the generator during size
// estimation.
ManifestStoreTemplate manifest_store_template = 1;
// Required. See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_hard_bindings
// for more details.
HardBinding hard_binding = 5;
reserved 2, 3, 4;
}
// The result of finalizing a C2PA manifest store.
message FinalizeManifestStoreResponse {
// The generated manifest store.
bytes manifest_store = 1;
// Indicates whether the generated claim has been timestamped or not.
bool is_timestamped = 2;
reserved 3;
}