// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#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"

namespace bssl {

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(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;

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

}  // namespace bssl

#endif  // BSSL_PKI_SIMPLE_PATH_BUILDER_DELEGATE_H_
