| // 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 "quiche/quic/core/crypto/proof_source.h" | |
| #include "quiche/quic/core/quic_connection_id.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, | |
| // Similar to FAIL_SYNC, but do not QUICHE_CHECK(!closed_) when invoked. | |
| FAIL_SYNC_DO_NOT_CHECK_CLOSED, | |
| }; | |
| // |delegate| must do cert selection and signature synchronously. | |
| // |dealyed_ssl_config| is the config passed to OnSelectCertificateDone. | |
| FakeProofSourceHandle( | |
| ProofSource* delegate, ProofSourceHandleCallback* callback, | |
| Action select_cert_action, Action compute_signature_action, | |
| QuicDelayedSSLConfig dealyed_ssl_config = QuicDelayedSSLConfig()); | |
| ~FakeProofSourceHandle() override = default; | |
| void CloseHandle() override; | |
| QuicAsyncStatus SelectCertificate( | |
| const QuicSocketAddress& server_address, | |
| const QuicSocketAddress& client_address, | |
| const QuicConnectionId& original_connection_id, | |
| absl::string_view ssl_capabilities, const std::string& hostname, | |
| absl::string_view client_hello, const std::string& alpn, | |
| absl::optional<std::string> alps, | |
| const std::vector<uint8_t>& quic_transport_params, | |
| const absl::optional<std::vector<uint8_t>>& early_data_context, | |
| const QuicSSLConfig& ssl_config) 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, | |
| QuicConnectionId original_connection_id, | |
| absl::string_view ssl_capabilities, std::string hostname, | |
| absl::string_view client_hello, std::string alpn, | |
| absl::optional<std::string> alps, | |
| std::vector<uint8_t> quic_transport_params, | |
| absl::optional<std::vector<uint8_t>> early_data_context, | |
| QuicSSLConfig ssl_config) | |
| : server_address(server_address), | |
| client_address(client_address), | |
| original_connection_id(original_connection_id), | |
| ssl_capabilities(ssl_capabilities), | |
| hostname(hostname), | |
| client_hello(client_hello), | |
| alpn(alpn), | |
| alps(alps), | |
| quic_transport_params(quic_transport_params), | |
| early_data_context(early_data_context), | |
| ssl_config(ssl_config) {} | |
| QuicSocketAddress server_address; | |
| QuicSocketAddress client_address; | |
| QuicConnectionId original_connection_id; | |
| std::string ssl_capabilities; | |
| std::string hostname; | |
| std::string client_hello; | |
| std::string alpn; | |
| absl::optional<std::string> alps; | |
| std::vector<uint8_t> quic_transport_params; | |
| absl::optional<std::vector<uint8_t>> early_data_context; | |
| QuicSSLConfig ssl_config; | |
| }; | |
| 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, | |
| QuicDelayedSSLConfig dealyed_ssl_config); | |
| ~SelectCertOperation() override = default; | |
| void Run() override; | |
| private: | |
| const SelectCertArgs args_; | |
| const QuicDelayedSSLConfig dealyed_ssl_config_; | |
| }; | |
| 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; | |
| bool closed_ = false; | |
| 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; | |
| const QuicDelayedSSLConfig dealyed_ssl_config_; | |
| 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_ |