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

// Utilities for testing crypto code.
#ifndef THIRD_PARTY_CREDENTIO_TESTING_CRYPTO_TESTING_H_
#define THIRD_PARTY_CREDENTIO_TESTING_CRYPTO_TESTING_H_

#include <cstddef>
#include <string>

#include "absl/time/time.h"
#include "openssl/base.h"
#include "openssl/x509.h"

namespace credentio {

struct TestCertificateOptions {
  std::string subject_common_name;
  std::string issuer_common_name;
  absl::Time not_before = absl::FromUnixSeconds(1);
  absl::Time not_after = absl::FromUnixSeconds(86400L * 365 * 100);
  EVP_PKEY* signing_key = nullptr;
  EVP_PKEY* private_key = nullptr;
};

// Generates an X.509 certificate based on `options`.
bssl::UniquePtr<X509> CreateTestCertificate(
    const TestCertificateOptions& options);

bssl::UniquePtr<EVP_PKEY> CreateTestEcKey(int nid);

bssl::UniquePtr<EVP_PKEY> CreateTestRsaKey(size_t num_bits);

bssl::UniquePtr<EVP_PKEY> CreateTestEdKey();

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_TESTING_CRYPTO_TESTING_H_
