// 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_TESTING_PEM_H_
#define THIRD_PARTY_CREDENTIO_TESTING_PEM_H_

#include <memory>
#include <string>
#include <variant>

#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "tink/public_key_sign.h"
#include "tink/signature/ecdsa_parameters.h"
#include "tink/signature/ed25519_parameters.h"
#include "tink/signature/rsa_ssa_pss_parameters.h"

namespace credentio {

// Loads a TEST private key from an unencrypted PEM string, with explicit key
// parameters.
absl::StatusOr<std::unique_ptr<crypto::tink::PublicKeySign>> LoadTestKeyFromPem(
    absl::string_view pem,
    const std::variant<crypto::tink::EcdsaParameters,
                       crypto::tink::Ed25519Parameters,
                       crypto::tink::RsaSsaPssParameters>& key_params);

// Returns a single DER-encoded OCSP response loaded from a PEM string with tag
// "OCSP RESPONSE". Returns an error if multiple blocks are present.
absl::StatusOr<std::string> LoadOcspResponseFromPem(absl::string_view pem);

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_TESTING_PEM_H_
