| Index: net/quic/test_tools/crypto_test_utils.h
|
| diff --git a/net/quic/test_tools/crypto_test_utils.h b/net/quic/test_tools/crypto_test_utils.h
|
| index 8c3565d1447c1a72f049b91f102d69ce0e2faeb1..7d1d7ecd8df9481c08e6249fa956369034af3ecb 100644
|
| --- a/net/quic/test_tools/crypto_test_utils.h
|
| +++ b/net/quic/test_tools/crypto_test_utils.h
|
| @@ -38,206 +38,203 @@ namespace test {
|
|
|
| class PacketSavingConnection;
|
|
|
| -class CryptoTestUtils {
|
| +namespace crypto_test_utils {
|
| +
|
| +// An interface for a source of callbacks. This is used for invoking
|
| +// callbacks asynchronously.
|
| +//
|
| +// Call the RunPendingCallbacks method regularly to run the callbacks from
|
| +// this source.
|
| +class CallbackSource {
|
| public:
|
| - // An interface for a source of callbacks. This is used for invoking
|
| - // callbacks asynchronously.
|
| - //
|
| - // Call the RunPendingCallbacks method regularly to run the callbacks from
|
| - // this source.
|
| - class CallbackSource {
|
| - public:
|
| - virtual ~CallbackSource() {}
|
| -
|
| - // Runs pending callbacks from this source. If there is no pending
|
| - // callback, does nothing.
|
| - virtual void RunPendingCallbacks() = 0;
|
| - };
|
| -
|
| - // FakeServerOptions bundles together a number of options for configuring the
|
| - // server in HandshakeWithFakeServer.
|
| - struct FakeServerOptions {
|
| - FakeServerOptions();
|
| - ~FakeServerOptions();
|
| -
|
| - // The Token Binding params that the server supports and will negotiate.
|
| - QuicTagVector token_binding_params;
|
| - };
|
| -
|
| - // FakeClientOptions bundles together a number of options for configuring
|
| - // HandshakeWithFakeClient.
|
| - struct FakeClientOptions {
|
| - FakeClientOptions();
|
| - ~FakeClientOptions();
|
| -
|
| - // If channel_id_enabled is true then the client will attempt to send a
|
| - // ChannelID.
|
| - bool channel_id_enabled;
|
| -
|
| - // If channel_id_source_async is true then the client will use an async
|
| - // ChannelIDSource for testing. Ignored if channel_id_enabled is false.
|
| - bool channel_id_source_async;
|
| -
|
| - // The Token Binding params that the client supports and will negotiate.
|
| - QuicTagVector token_binding_params;
|
| - };
|
| -
|
| - // returns: the number of client hellos that the client sent.
|
| - static int HandshakeWithFakeServer(QuicConfig* server_quic_config,
|
| - MockQuicConnectionHelper* helper,
|
| - MockAlarmFactory* alarm_factory,
|
| - PacketSavingConnection* client_conn,
|
| - QuicCryptoClientStream* client,
|
| - const FakeServerOptions& options);
|
| -
|
| - // returns: the number of client hellos that the client sent.
|
| - static int HandshakeWithFakeClient(MockQuicConnectionHelper* helper,
|
| - MockAlarmFactory* alarm_factory,
|
| - PacketSavingConnection* server_conn,
|
| - QuicCryptoServerStream* server,
|
| - const QuicServerId& server_id,
|
| - const FakeClientOptions& options);
|
| -
|
| - // SetupCryptoServerConfigForTest configures |crypto_config|
|
| - // with sensible defaults for testing.
|
| - static void SetupCryptoServerConfigForTest(
|
| - const QuicClock* clock,
|
| - QuicRandom* rand,
|
| - QuicCryptoServerConfig* crypto_config,
|
| - const FakeServerOptions& options);
|
| -
|
| - // CommunicateHandshakeMessages moves messages from |client| to |server| and
|
| - // back until |clients|'s handshake has completed.
|
| - static void CommunicateHandshakeMessages(PacketSavingConnection* client_conn,
|
| + virtual ~CallbackSource() {}
|
| +
|
| + // Runs pending callbacks from this source. If there is no pending
|
| + // callback, does nothing.
|
| + virtual void RunPendingCallbacks() = 0;
|
| +};
|
| +
|
| +// FakeServerOptions bundles together a number of options for configuring the
|
| +// server in HandshakeWithFakeServer.
|
| +struct FakeServerOptions {
|
| + FakeServerOptions();
|
| + ~FakeServerOptions();
|
| +
|
| + // The Token Binding params that the server supports and will negotiate.
|
| + QuicTagVector token_binding_params;
|
| +};
|
| +
|
| +// FakeClientOptions bundles together a number of options for configuring
|
| +// HandshakeWithFakeClient.
|
| +struct FakeClientOptions {
|
| + FakeClientOptions();
|
| + ~FakeClientOptions();
|
| +
|
| + // If channel_id_enabled is true then the client will attempt to send a
|
| + // ChannelID.
|
| + bool channel_id_enabled;
|
| +
|
| + // If channel_id_source_async is true then the client will use an async
|
| + // ChannelIDSource for testing. Ignored if channel_id_enabled is false.
|
| + bool channel_id_source_async;
|
| +
|
| + // The Token Binding params that the client supports and will negotiate.
|
| + QuicTagVector token_binding_params;
|
| +};
|
| +
|
| +// returns: the number of client hellos that the client sent.
|
| +int HandshakeWithFakeServer(QuicConfig* server_quic_config,
|
| + MockQuicConnectionHelper* helper,
|
| + MockAlarmFactory* alarm_factory,
|
| + PacketSavingConnection* client_conn,
|
| + QuicCryptoClientStream* client,
|
| + const FakeServerOptions& options);
|
| +
|
| +// returns: the number of client hellos that the client sent.
|
| +int HandshakeWithFakeClient(MockQuicConnectionHelper* helper,
|
| + MockAlarmFactory* alarm_factory,
|
| + PacketSavingConnection* server_conn,
|
| + QuicCryptoServerStream* server,
|
| + const QuicServerId& server_id,
|
| + const FakeClientOptions& options);
|
| +
|
| +// SetupCryptoServerConfigForTest configures |crypto_config|
|
| +// with sensible defaults for testing.
|
| +void SetupCryptoServerConfigForTest(const QuicClock* clock,
|
| + QuicRandom* rand,
|
| + QuicCryptoServerConfig* crypto_config,
|
| + const FakeServerOptions& options);
|
| +
|
| +// CommunicateHandshakeMessages moves messages from |client| to |server| and
|
| +// back until |clients|'s handshake has completed.
|
| +void CommunicateHandshakeMessages(PacketSavingConnection* client_conn,
|
| + QuicCryptoStream* client,
|
| + PacketSavingConnection* server_conn,
|
| + QuicCryptoStream* server);
|
| +
|
| +// CommunicateHandshakeMessagesAndRunCallbacks moves messages from |client|
|
| +// to |server| and back until |client|'s handshake has completed. If
|
| +// |callback_source| is not nullptr,
|
| +// CommunicateHandshakeMessagesAndRunCallbacks also runs callbacks from
|
| +// |callback_source| between processing messages.
|
| +void CommunicateHandshakeMessagesAndRunCallbacks(
|
| + PacketSavingConnection* client_conn,
|
| + QuicCryptoStream* client,
|
| + PacketSavingConnection* server_conn,
|
| + QuicCryptoStream* server,
|
| + CallbackSource* callback_source);
|
| +
|
| +// AdvanceHandshake attempts to moves messages from |client| to |server| and
|
| +// |server| to |client|. Returns the number of messages moved.
|
| +std::pair<size_t, size_t> AdvanceHandshake(PacketSavingConnection* client_conn,
|
| QuicCryptoStream* client,
|
| + size_t client_i,
|
| PacketSavingConnection* server_conn,
|
| - QuicCryptoStream* server);
|
| -
|
| - // CommunicateHandshakeMessagesAndRunCallbacks moves messages from |client|
|
| - // to |server| and back until |client|'s handshake has completed. If
|
| - // |callback_source| is not nullptr,
|
| - // CommunicateHandshakeMessagesAndRunCallbacks also runs callbacks from
|
| - // |callback_source| between processing messages.
|
| - static void CommunicateHandshakeMessagesAndRunCallbacks(
|
| - PacketSavingConnection* client_conn,
|
| - QuicCryptoStream* client,
|
| - PacketSavingConnection* server_conn,
|
| - QuicCryptoStream* server,
|
| - CallbackSource* callback_source);
|
| -
|
| - // AdvanceHandshake attempts to moves messages from |client| to |server| and
|
| - // |server| to |client|. Returns the number of messages moved.
|
| - static std::pair<size_t, size_t> AdvanceHandshake(
|
| - PacketSavingConnection* client_conn,
|
| - QuicCryptoStream* client,
|
| - size_t client_i,
|
| - PacketSavingConnection* server_conn,
|
| - QuicCryptoStream* server,
|
| - size_t server_i);
|
| -
|
| - // Returns the value for the tag |tag| in the tag value map of |message|.
|
| - static std::string GetValueForTag(const CryptoHandshakeMessage& message,
|
| - QuicTag tag);
|
| -
|
| - // Returns a new |ProofSource| that serves up test certificates.
|
| - static std::unique_ptr<ProofSource> ProofSourceForTesting();
|
| -
|
| - // Identical to |ProofSourceForTesting|, with the addition of setting
|
| - // the |emit_expect_ct_header| field on the test certificates
|
| - // to be the value of |send_expect_ct_header|.
|
| - static std::unique_ptr<ProofSource> ProofSourceForTesting(
|
| - bool send_expect_ct_header);
|
| -
|
| - // Returns a new |ProofVerifier| that uses the QUIC testing root CA.
|
| - static std::unique_ptr<ProofVerifier> ProofVerifierForTesting();
|
| -
|
| - // Returns a hash of the leaf test certificate.
|
| - static uint64_t LeafCertHashForTesting();
|
| -
|
| - // Returns a |ProofVerifyContext| that must be used with the verifier
|
| - // returned by |ProofVerifierForTesting|.
|
| - static ProofVerifyContext* ProofVerifyContextForTesting();
|
| -
|
| - // MockCommonCertSets returns a CommonCertSets that contains a single set with
|
| - // hash |hash|, consisting of the certificate |cert| at index |index|.
|
| - static CommonCertSets* MockCommonCertSets(base::StringPiece cert,
|
| - uint64_t hash,
|
| - uint32_t index);
|
| -
|
| - // Creates a minimal dummy reject message that will pass the client-config
|
| - // validation tests. This will include a server config, but no certs, proof
|
| - // source address token, or server nonce.
|
| - static void FillInDummyReject(CryptoHandshakeMessage* rej,
|
| - bool reject_is_stateless);
|
| -
|
| - // ParseTag returns a QuicTag from parsing |tagstr|. |tagstr| may either be
|
| - // in the format "EXMP" (i.e. ASCII format), or "#11223344" (an explicit hex
|
| - // format). It CHECK fails if there's a parse error.
|
| - static QuicTag ParseTag(const char* tagstr);
|
| -
|
| - // Message constructs a handshake message from a variable number of
|
| - // arguments. |message_tag| is passed to |ParseTag| and used as the tag of
|
| - // the resulting message. The arguments are taken in pairs and nullptr
|
| - // terminated. The first of each pair is the tag of a tag/value and is given
|
| - // as an argument to |ParseTag|. The second is the value of the tag/value
|
| - // pair and is either a hex dump, preceeded by a '#', or a raw value.
|
| - //
|
| - // Message(
|
| - // "CHLO",
|
| - // "NOCE", "#11223344",
|
| - // "SNI", "www.example.com",
|
| - // nullptr);
|
| - static CryptoHandshakeMessage Message(const char* message_tag, ...);
|
| -
|
| - // ChannelIDSourceForTesting returns a ChannelIDSource that generates keys
|
| - // deterministically based on the hostname given in the GetChannelIDKey call.
|
| - // This ChannelIDSource works in synchronous mode, i.e., its GetChannelIDKey
|
| - // method never returns QUIC_PENDING.
|
| - static ChannelIDSource* ChannelIDSourceForTesting();
|
| -
|
| - // MovePackets parses crypto handshake messages from packet number
|
| - // |*inout_packet_index| through to the last packet (or until a packet fails
|
| - // to decrypt) and has |dest_stream| process them. |*inout_packet_index| is
|
| - // updated with an index one greater than the last packet processed.
|
| - static void MovePackets(PacketSavingConnection* source_conn,
|
| - size_t* inout_packet_index,
|
| - QuicCryptoStream* dest_stream,
|
| - PacketSavingConnection* dest_conn,
|
| - Perspective dest_perspective);
|
| -
|
| - // Return an inchoate CHLO with some basic tag value pairs.
|
| - static CryptoHandshakeMessage GenerateDefaultInchoateCHLO(
|
| - const QuicClock* clock,
|
| - QuicVersion version,
|
| - QuicCryptoServerConfig* crypto_config);
|
| -
|
| - // Takes a inchoate CHLO, returns a full CHLO in |out| which can pass
|
| - // |crypto_config|'s validation.
|
| - static void GenerateFullCHLO(
|
| - const CryptoHandshakeMessage& inchoate_chlo,
|
| - QuicCryptoServerConfig* crypto_config,
|
| - QuicSocketAddress server_addr,
|
| - QuicSocketAddress client_addr,
|
| - QuicVersion version,
|
| - const QuicClock* clock,
|
| - QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config,
|
| - QuicCompressedCertsCache* compressed_certs_cache,
|
| - CryptoHandshakeMessage* out);
|
| -
|
| - private:
|
| - static void CompareClientAndServerKeys(QuicCryptoClientStream* client,
|
| - QuicCryptoServerStream* server);
|
| -
|
| - // Return a CHLO nonce in hexadecimal.
|
| - static std::string GenerateClientNonceHex(
|
| - const QuicClock* clock,
|
| - QuicCryptoServerConfig* crypto_config);
|
| -
|
| - // Return a CHLO PUBS in hexadecimal.
|
| - static std::string GenerateClientPublicValuesHex();
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CryptoTestUtils);
|
| -};
|
| + QuicCryptoStream* server,
|
| + size_t server_i);
|
| +
|
| +// Returns the value for the tag |tag| in the tag value map of |message|.
|
| +std::string GetValueForTag(const CryptoHandshakeMessage& message, QuicTag tag);
|
| +
|
| +// Returns a new |ProofSource| that serves up test certificates.
|
| +std::unique_ptr<ProofSource> ProofSourceForTesting();
|
| +
|
| +// Identical to |ProofSourceForTesting|, with the addition of setting
|
| +// the |emit_expect_ct_header| field on the test certificates
|
| +// to be the value of |send_expect_ct_header|.
|
| +std::unique_ptr<ProofSource> ProofSourceForTesting(bool send_expect_ct_header);
|
| +
|
| +// Identical to |ProofSourceForTesting| but permitting the caller to specify
|
| +// the certs that will be loaded.
|
| +std::unique_ptr<ProofSource> ProofSourceForTesting(
|
| + const std::vector<std::string>& certs);
|
| +
|
| +// Returns a new |ProofVerifier| that uses the QUIC testing root CA.
|
| +std::unique_ptr<ProofVerifier> ProofVerifierForTesting();
|
| +
|
| +// Returns a hash of the leaf test certificate.
|
| +uint64_t LeafCertHashForTesting();
|
| +
|
| +// Returns a |ProofVerifyContext| that must be used with the verifier
|
| +// returned by |ProofVerifierForTesting|.
|
| +ProofVerifyContext* ProofVerifyContextForTesting();
|
| +
|
| +// MockCommonCertSets returns a CommonCertSets that contains a single set with
|
| +// hash |hash|, consisting of the certificate |cert| at index |index|.
|
| +CommonCertSets* MockCommonCertSets(base::StringPiece cert,
|
| + uint64_t hash,
|
| + uint32_t index);
|
| +
|
| +// Creates a minimal dummy reject message that will pass the client-config
|
| +// validation tests. This will include a server config, but no certs, proof
|
| +// source address token, or server nonce.
|
| +void FillInDummyReject(CryptoHandshakeMessage* rej, bool reject_is_stateless);
|
| +
|
| +// ParseTag returns a QuicTag from parsing |tagstr|. |tagstr| may either be
|
| +// in the format "EXMP" (i.e. ASCII format), or "#11223344" (an explicit hex
|
| +// format). It CHECK fails if there's a parse error.
|
| +QuicTag ParseTag(const char* tagstr);
|
| +
|
| +// Message constructs a handshake message from a variable number of
|
| +// arguments. |message_tag| is passed to |ParseTag| and used as the tag of
|
| +// the resulting message. The arguments are taken in pairs and nullptr
|
| +// terminated. The first of each pair is the tag of a tag/value and is given
|
| +// as an argument to |ParseTag|. The second is the value of the tag/value
|
| +// pair and is either a hex dump, preceeded by a '#', or a raw value.
|
| +//
|
| +// Message(
|
| +// "CHLO",
|
| +// "NOCE", "#11223344",
|
| +// "SNI", "www.example.com",
|
| +// nullptr);
|
| +CryptoHandshakeMessage Message(const char* message_tag, ...);
|
| +
|
| +// ChannelIDSourceForTesting returns a ChannelIDSource that generates keys
|
| +// deterministically based on the hostname given in the GetChannelIDKey call.
|
| +// This ChannelIDSource works in synchronous mode, i.e., its GetChannelIDKey
|
| +// method never returns QUIC_PENDING.
|
| +ChannelIDSource* ChannelIDSourceForTesting();
|
| +
|
| +// MovePackets parses crypto handshake messages from packet number
|
| +// |*inout_packet_index| through to the last packet (or until a packet fails
|
| +// to decrypt) and has |dest_stream| process them. |*inout_packet_index| is
|
| +// updated with an index one greater than the last packet processed.
|
| +void MovePackets(PacketSavingConnection* source_conn,
|
| + size_t* inout_packet_index,
|
| + QuicCryptoStream* dest_stream,
|
| + PacketSavingConnection* dest_conn,
|
| + Perspective dest_perspective);
|
| +
|
| +// Return an inchoate CHLO with some basic tag value pairs.
|
| +CryptoHandshakeMessage GenerateDefaultInchoateCHLO(
|
| + const QuicClock* clock,
|
| + QuicVersion version,
|
| + QuicCryptoServerConfig* crypto_config);
|
| +
|
| +// Takes a inchoate CHLO, returns a full CHLO in |out| which can pass
|
| +// |crypto_config|'s validation.
|
| +void GenerateFullCHLO(
|
| + const CryptoHandshakeMessage& inchoate_chlo,
|
| + QuicCryptoServerConfig* crypto_config,
|
| + QuicSocketAddress server_addr,
|
| + QuicSocketAddress client_addr,
|
| + QuicVersion version,
|
| + const QuicClock* clock,
|
| + QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config,
|
| + QuicCompressedCertsCache* compressed_certs_cache,
|
| + CryptoHandshakeMessage* out);
|
| +
|
| +void CompareClientAndServerKeys(QuicCryptoClientStream* client,
|
| + QuicCryptoServerStream* server);
|
| +
|
| +// Return a CHLO nonce in hexadecimal.
|
| +std::string GenerateClientNonceHex(const QuicClock* clock,
|
| + QuicCryptoServerConfig* crypto_config);
|
| +
|
| +// Return a CHLO PUBS in hexadecimal.
|
| +std::string GenerateClientPublicValuesHex();
|
| +
|
| +} // namespace crypto_test_utils
|
|
|
| } // namespace test
|
|
|
|
|