// Copyright 2017 The Chromium Authors
//
// 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 BSSL_PKI_SIMPLE_PATH_BUILDER_DELEGATE_H_
#define BSSL_PKI_SIMPLE_PATH_BUILDER_DELEGATE_H_

#include <stddef.h>

#include <openssl/base.h>
#include <openssl/pki/signature_verify_cache.h>

#include "path_builder.h"
#include "signature_algorithm.h"

BSSL_NAMESPACE_BEGIN

class CertErrors;

// SimplePathBuilderDelegate is an implementation of CertPathBuilderDelegate
// that uses some default policies:
//
//   * RSA public keys must be >= `min_rsa_modulus_length_bits`.
//   * Signature algorithm can be RSA PKCS#1, RSASSA-PSS or ECDSA
//   * Digest algorithm can be SHA256, SHA348 or SHA512.
//       * If the `digest_policy` was set to kAllowSha1, then SHA1 is
//         additionally accepted.
//   * EC named curve can be P-256, P-384, P-521.
class OPENSSL_EXPORT SimplePathBuilderDelegate
    : public CertPathBuilderDelegate {
 public:
  enum class DigestPolicy {
    // Accepts digests of SHA256, SHA348 or SHA512
    kStrong,

    // Accepts everything that kStrong does, plus SHA1.
    kWeakAllowSha1,

    kMaxValue = kWeakAllowSha1
  };

  // Error emitted when a public key is rejected because it is an RSA key with a
  // modulus size that is too small.
  static const CertErrorId kRsaModulusTooSmall;

  SimplePathBuilderDelegate(size_t min_rsa_modulus_length_bits,
                            DigestPolicy digest_policy);

  // Accepts RSA PKCS#1, RSASSA-PSS or ECDA using any of the SHA* digests
  // (including SHA1).
  bool IsSignatureAlgorithmAcceptable(SignatureAlgorithm signature_algorithm,
                                      CertErrors *errors) override;

  // Requires RSA keys be >= `min_rsa_modulus_length_bits_`.
  bool IsPublicKeyAcceptable(const EVP_PKEY *public_key,
                             CertErrors *errors) override;

  // No-op implementation.
  void CheckPathAfterVerification(const CertPathBuilder &path_builder,
                                  CertPathBuilderResultPath *path) override;

  // No-op implementation.
  bool IsDeadlineExpired() override;

  // No-op implementation.
  SignatureVerifyCache *GetVerifyCache() override;

  // No-op implementation.
  bool IsDebugLogEnabled() override;

  // No-op implementation.
  void DebugLog(std::string_view msg) override;

  // No-op implementation.
  bool AcceptPreCertificates() override;

  // No-op implementation.
  std::optional<MTCCosigner> GetMTCCosigner(
      Span<const uint8_t> cosigner_id) override;

  // No-op implementation (does not require any valid additional cosigners).
  bool IsCosignatureVerificationResultAcceptable(
      const MTCAnchor *mtc_anchor,
      std::vector<std::vector<uint8_t>> valid_additional_cosigners) override;

 private:
  const size_t min_rsa_modulus_length_bits_;
  const DigestPolicy digest_policy_;
};

BSSL_NAMESPACE_END

#endif  // BSSL_PKI_SIMPLE_PATH_BUILDER_DELEGATE_H_
