#ifndef CHROME_BROWSER_ASH_CERTIFICATE_PROVIDER_TEST_CERTIFICATE_PROVIDER_EXTENSION_H_
#define CHROME_BROWSER_ASH_CERTIFICATE_PROVIDER_TEST_CERTIFICATE_PROVIDER_EXTENSION_H_
#include <memory>
#include <optional>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/values.h"
#include "crypto/keypair.h"
#include "extensions/common/extension_id.h"
#include "extensions/test/extension_test_message_listener.h"
#include "net/cert/x509_certificate.h"
namespace base {
class FilePath;
}
namespace content {
class BrowserContext;
}
namespace ash {
class TestCertificateProviderExtension final {
public:
static extensions::ExtensionId extension_id();
static base::FilePath GetExtensionSourcePath();
static base::FilePath GetExtensionPemPath();
static scoped_refptr<net::X509Certificate> GetCertificate();
static std::string GetCertificateSpki();
explicit TestCertificateProviderExtension(
content::BrowserContext* browser_context);
TestCertificateProviderExtension(const TestCertificateProviderExtension&) =
delete;
TestCertificateProviderExtension& operator=(
const TestCertificateProviderExtension&) = delete;
~TestCertificateProviderExtension();
void TriggerSetCertificates();
int certificate_request_count() const { return certificate_request_count_; }
void set_require_pin(const std::string& pin) { required_pin_ = pin; }
void set_remaining_pin_attempts(int remaining_pin_attempts) {
remaining_pin_attempts_ = remaining_pin_attempts;
}
void set_should_provide_certificates(bool should_provide_certificates) {
should_provide_certificates_ = should_provide_certificates;
}
void set_should_fail_sign_digest_requests(
bool should_fail_sign_digest_requests) {
should_fail_sign_digest_requests_ = should_fail_sign_digest_requests;
}
private:
using ReplyToJsCallback =
base::OnceCallback<void(const base::Value& response)>;
void HandleMessage(const std::string& message);
void HandleCertificatesRequest(ReplyToJsCallback callback);
void HandleSignatureRequest(const base::Value& sign_request,
const base::Value& pin_status,
const base::Value& pin,
ReplyToJsCallback callback);
const raw_ptr<content::BrowserContext> browser_context_;
const scoped_refptr<net::X509Certificate> certificate_;
crypto::keypair::PrivateKey private_key_;
int certificate_request_count_ = 0;
std::optional<std::string> required_pin_;
int remaining_pin_attempts_ = -1;
bool should_provide_certificates_ = true;
bool should_fail_sign_digest_requests_ = false;
ExtensionTestMessageListener message_listener_;
};
}
#endif