|  | // 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(); | 
|  |  | 
|  | 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, | 
|  | 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); | 
|  |  | 
|  | ~SelectCertOperation() override = default; | 
|  |  | 
|  | void Run() override; | 
|  |  | 
|  | private: | 
|  | 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_; | 
|  | }; | 
|  |  | 
|  | class ComputeSignatureOperation : public PendingOperation { | 
|  | public: | 
|  | ComputeSignatureOperation(ProofSource* delegate, | 
|  | ProofSourceHandleCallback* callback, | 
|  | Action action, | 
|  | 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); | 
|  |  | 
|  | ~ComputeSignatureOperation() override = default; | 
|  |  | 
|  | void Run() override; | 
|  |  | 
|  | private: | 
|  | QuicSocketAddress server_address_; | 
|  | QuicSocketAddress client_address_; | 
|  | std::string hostname_; | 
|  | uint16_t signature_algorithm_; | 
|  | std::string in_; | 
|  | size_t max_signature_size_; | 
|  | }; | 
|  |  | 
|  | 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_; | 
|  | }; | 
|  |  | 
|  | }  // namespace test | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_HANDLE_H_ |