// 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 "cbor/tags.proto";

// The data structure used to store the cryptographic hash of some or all of the
// asset's data and additional information required to compute the hash.
// Based on `data-hash-map`:
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_data_hash.
message DataHashAssertion {
  repeated DataRange exclusions = 1;
  // A string identifying the cryptographic hash algorithm used to compute the
  // hash in this assertion.
  string alg = 2;
  bytes hash = 3 [(cbor.tags) = { is_required: true }];
  // A human-readable description of what this hash covers.
  string name = 6;

  // For internal use in the manifest generator -- do not set or read.
  bytes pad = 4 [(cbor.tags) = { is_required: true, mode: MODE_WRITE_ONLY }];
  // For internal use in the manifest generator -- do not set or read.
  bytes pad2 = 5 [(cbor.tags) = { mode: MODE_WRITE_ONLY }];
}

message DataRange {
  // Starting byte of the range.
  int64 start = 1 [(cbor.tags) = { is_required: true }];
  // Number of bytes of data.
  int64 length = 2 [(cbor.tags) = { is_required: true }];
}
