// 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/assertion.proto";
import "proto/generator_info.proto";
import "proto/hashed_uri.proto";
import "proto/signature_info.proto";
import "proto/validation_status.proto";

import option "google/protobuf/cpp_features.proto";

option java_outer_classname = "ManifestOuterClass";
option features.(pb.cpp).string_type = STRING;

// Represents a verifiable unit containing a set of assertions and a claim
// about an asset together with a claim signature.
message Manifest {
  // Results of validating this manifest.
  ValidationStatusSet validation = 15;

  // Whether the manifest is an update manifest.
  bool is_update_manifest = 5;

  // Label of the manifest, unique within the containing manifest store.
  string label = 1;

  // Container holding all the assertion references about the asset.
  Claim claim = 2;

  // A set of assertions associated with the asset, which are referenced by
  // the claim in this manifest. These assertions constitute the "assertion
  // store" described in
  // https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_assertion_store.
  repeated Assertion assertions = 3;

  reserved 4;
}

// Contains all the assertion and redacted assertion references about an asset
// at a given time.
message Claim {
  // Uniquely identifies a specific version of an asset
  string instance_id = 13 [(cbor.tags) = { name: "instanceID" }];

  // Information about the claim generator.
  GeneratorInfo claim_generator_info = 1;

  // A set of references to the assertions about when, where, and how the asset
  // was originated or transformed.
  //
  // The reference is specified as a JUMBF URI reference. See
  // https://www.iso.org/standard/84635.html for more details about JUMBF
  // standard.
  repeated HashedUri created_assertions = 7;
  repeated HashedUri gathered_assertions = 8;

  // A set of references to the assertions that were subject to redaction.
  //
  // Redaction is a process where an assertion of an asset-embedded manifest is
  // removed from that asset's manifest when this asset is used as an
  // ingredient. See
  // https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_redaction_of_assertions
  // for more details about the redaction process.
  //
  // The reference is specified as a JUMBF URI reference. See
  // https://www.iso.org/standard/84635.html for more details about JUMBF
  // standard.
  repeated string redacted_assertions = 4;

  // Information about the claim signature.
  SignatureInfo signature_info = 5 [(cbor.tags) = { mode: MODE_SKIP }];

  // Only used by the generator; the validator shouldn't populate this field.
  string signature = 11;

  // Default hash algorithm.
  string default_algorithm = 10 [(cbor.tags) = { name: "alg" }];

  // Label of the claim box.
  string label = 12;

  reserved 2, 3, 6, 9;
}
