blob: 9c05ba4fa6638a40d78b1e61934af4af1abece8e [file] [log] [blame]
// Copyright (c) 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_HANDLE_H_
#define QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_HANDLE_H_
#include "quic/core/crypto/proof_source.h"
namespace quic {
namespace test {
// FakeProofSourceHandle allows its behavior to be scripted for testing.
class FakeProofSourceHandle : public ProofSourceHandle {
public:
// What would an operation return when it is called.
enum class Action {
// Delegate the operation to |delegate_| immediately.
DELEGATE_SYNC = 0,
// Handle the operation asynchronously. Delegate the operation to
// |delegate_| when the caller calls CompletePendingOperation().
DELEGATE_ASYNC,
// Fail the operation immediately.
FAIL_SYNC,
// Handle the operation asynchronously. Fail the operation when the caller
// calls CompletePendingOperation().
FAIL_ASYNC,
};
// |delegate| must do cert selection and signature synchronously.
FakeProofSourceHandle(ProofSource* delegate,
ProofSourceHandleCallback* callback,
Action select_cert_action,
Action compute_signature_action);
~FakeProofSourceHandle() override = default;
void CancelPendingOperation() override;
QuicAsyncStatus SelectCertificate(
const QuicSocketAddress& server_address,
const QuicSocketAddress& client_address,
const std::string& hostname,
absl::string_view client_hello,
const std::string& alpn,
const std::vector<uint8_t>& quic_transport_params,
const absl::optional<std::vector<uint8_t>>& early_data_context) override;
QuicAsyncStatus ComputeSignature(const QuicSocketAddress& server_address,
const QuicSocketAddress& client_address,
const std::string& hostname,
uint16_t signature_algorithm,
absl::string_view in,
size_t max_signature_size) override;
ProofSourceHandleCallback* callback() override;
// Whether there's a pending operation in |this|.
bool HasPendingOperation() const;
void CompletePendingOperation();
struct SelectCertArgs {
SelectCertArgs(QuicSocketAddress server_address,
QuicSocketAddress client_address,
std::string hostname,
absl::string_view client_hello,
std::string alpn,
std::vector<uint8_t> quic_transport_params,
absl::optional<std::vector<uint8_t>> early_data_context)
: server_address(server_address),
client_address(client_address),
hostname(hostname),
client_hello(client_hello),
alpn(alpn),
quic_transport_params(quic_transport_params),
early_data_context(early_data_context) {}
QuicSocketAddress server_address;
QuicSocketAddress client_address;
std::string hostname;
std::string client_hello;
std::string alpn;
std::vector<uint8_t> quic_transport_params;
absl::optional<std::vector<uint8_t>> early_data_context;
};
struct ComputeSignatureArgs {
ComputeSignatureArgs(QuicSocketAddress server_address,
QuicSocketAddress client_address,
std::string hostname,
uint16_t signature_algorithm,
absl::string_view in,
size_t max_signature_size)
: server_address(server_address),
client_address(client_address),
hostname(hostname),
signature_algorithm(signature_algorithm),
in(in),
max_signature_size(max_signature_size) {}
QuicSocketAddress server_address;
QuicSocketAddress client_address;
std::string hostname;
uint16_t signature_algorithm;
std::string in;
size_t max_signature_size;
};
std::vector<SelectCertArgs> all_select_cert_args() const {
return all_select_cert_args_;
}
std::vector<ComputeSignatureArgs> all_compute_signature_args() const {
return all_compute_signature_args_;
}
private:
class PendingOperation {
public:
PendingOperation(ProofSource* delegate,
ProofSourceHandleCallback* callback,
Action action)
: delegate_(delegate), callback_(callback), action_(action) {}
virtual ~PendingOperation() = default;
virtual void Run() = 0;
protected:
ProofSource* delegate_;
ProofSourceHandleCallback* callback_;
Action action_;
};
class SelectCertOperation : public PendingOperation {
public:
SelectCertOperation(ProofSource* delegate,
ProofSourceHandleCallback* callback,
Action action,
SelectCertArgs args);
~SelectCertOperation() override = default;
void Run() override;
private:
const SelectCertArgs args_;
};
class ComputeSignatureOperation : public PendingOperation {
public:
ComputeSignatureOperation(ProofSource* delegate,
ProofSourceHandleCallback* callback,
Action action,
ComputeSignatureArgs args);
~ComputeSignatureOperation() override = default;
void Run() override;
private:
const ComputeSignatureArgs args_;
};
private:
int NumPendingOperations() const;
ProofSource* delegate_;
ProofSourceHandleCallback* callback_;
// Action for the next select cert operation.
Action select_cert_action_ = Action::DELEGATE_SYNC;
// Action for the next compute signature operation.
Action compute_signature_action_ = Action::DELEGATE_SYNC;
absl::optional<SelectCertOperation> select_cert_op_;
absl::optional<ComputeSignatureOperation> compute_signature_op_;
// Save all the select cert and compute signature args for tests to inspect.
std::vector<SelectCertArgs> all_select_cert_args_;
std::vector<ComputeSignatureArgs> all_compute_signature_args_;
};
} // namespace test
} // namespace quic
#endif // QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_HANDLE_H_