// 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 "google/protobuf/struct.proto";

message SoftBindingMetadataMap {
  // Additional description of the implementation or author of the binding or
  // the algorithm
  string description = 1;
  // Contact information for the implementation or author of the binding or the
  // algorithm
  string contact = 2;
  // A web page containing more details about the implementation or author of
  // the binding or the algorithm.
  string informational_url = 3 [(cbor.tags) = { name: "informationalUrl" }];

  // Additional metadata of the soft binding.
  // * tstr => any
}

message SoftBindingTimespanMap {
  // Start of the time range (as milliseconds from media start)
  int64 start = 1 [(cbor.tags) = { is_required: true, type: TYPE_UINT }];
  // End of the time range (as milliseconds from media start)
  int64 end = 2 [(cbor.tags) = { is_required: true, type: TYPE_UINT }];
}

message SoftBindingScopeMap {
  // CBOR byte string describing, in algorithm specific format,  the part of the
  // digital content over which the soft binding value has been computed"
  bytes extent = 1;
  // The time range over which the soft binding value has been computed.
  SoftBindingTimespanMap timespan = 2;
  // The region of interest over which the soft binding value has been computed.
  // RegionOfInterestMap region = 3;
}

message SoftBindingBlockMap {
  SoftBindingScopeMap scope = 1 [(cbor.tags) = { is_required: true }];
  // CBOR byte string describing, in algorithm specific format, the value of the
  // soft binding computed over this block of digital content"
  bytes value = 2 [(cbor.tags) = { is_required: true }];
}

// Schema for Soft Binding Assertion (c2pa.soft-binding)
// Matches C2PA 2.4 technical specification.
message SoftBindingAssertion {
  // A string identifying the soft binding algorithm and version of that
  // algorithm used to compute the value, taken from the C2PA soft binding
  // algorithm list. If this field is absent, the algorithm is taken from the
  // `alg_soft` value of the enclosing structure. If both are present, the field
  // in this structure is used.  If no value is present in any of these places,
  // this structure is invalid; there is no default.
  string algorithm = 1 [(cbor.tags) = { is_required: true, name: "alg" }];
  repeated SoftBindingBlockMap blocks = 2
      [(cbor.tags) = { is_required: true, disallow_empty: true }];
  // For internal use in the manifest generator -- do not set or read.
  bytes pad = 4 [(cbor.tags) = { 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 }];

  // A human-readable description of what this hash covers
  string name = 6;

  // CBOR byte string describing parameters of the soft binding algorithm.
  bytes alg_params = 7 [(cbor.tags) = { name: "alg-params" }];

  // Additional metadata of the soft binding. Useful for binding-specific
  // information.
  SoftBindingMetadataMap binding_metadata = 8
      [(cbor.tags) = { name: "bindingMetadata" }];

  // Additional information about the assertion
  // AssertionMetadataMap assertion_metadata = 9
  //     [(cbor.tags) = { name: "metadata" }];
}
