// 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.
//

#ifndef THIRD_PARTY_CREDENTIO_CRYPTO_DEFAULT_DEFAULT_CRYPTO_READ_HANDLER_H_
#define THIRD_PARTY_CREDENTIO_CRYPTO_DEFAULT_DEFAULT_CRYPTO_READ_HANDLER_H_

#include <memory>

#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "crypto/crypto_read_handler.h"

namespace credentio {

struct DefaultCryptoReadHandlerOptions {
  // The content of the PEM file containing claim signer trust anchors,
  // trusted for claim signer certs containing the `c2pa-kp-claimSigning` EKU.
  //
  // At least one of `claim_signer_trust_anchors_pem` or
  // `legacy_claim_signer_trust_anchors_pem` must be nonempty unless
  // `skip_claim_signer_trust_checks_for_test` is true.
  absl::string_view claim_signer_trust_anchors_pem;

  // The content of the PEM file containing legacy claim signer trust anchors,
  // trusted for claim signer certs containing any of the EKUs
  // `id-kp-emailProtection`, `id-kp-documentSigning`, and
  // `c2pa-kp-claimSigning`.
  absl::string_view legacy_claim_signer_trust_anchors_pem;

  // The content of the PEM file containing TSA trust anchors.
  // Required unless `skip_tsa_trust_checks` is true.
  absl::string_view tsa_trust_anchors_pem;

  // Skips claim signer trust checks.
  bool skip_claim_signer_trust_checks_for_test = false;

  // Skips timestamp trust checks.
  bool skip_tsa_trust_checks_for_test = false;

  // The trust level of the handler.
  CryptoReadHandler::TrustEnvironment trust_environment =
      CryptoReadHandler::TrustEnvironment::kUnspecified;
};

// Creates an implementation of CryptoReadHandler intended for use in
// production. It uses Tink, BoringSSL, and SimpleCmsParser.
absl::StatusOr<std::unique_ptr<CryptoReadHandler>>
CreateDefaultCryptoReadHandler(const DefaultCryptoReadHandlerOptions& options);

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_CRYPTO_DEFAULT_DEFAULT_CRYPTO_READ_HANDLER_H_
