curl-fuzzer C++ reference
Loading...
Searching...
No Matches
tls_mock_server.h
Go to the documentation of this file.
1/*
2 * Copyright (C) Max Dymond, <cmeister2@gmail.com>, et al.
3 *
4 * SPDX-License-Identifier: curl
5 */
6
9
10#ifndef PROTO_FUZZER_TLS_MOCK_SERVER_H_
11#define PROTO_FUZZER_TLS_MOCK_SERVER_H_
12
13#include <cstddef>
14#include <memory>
15#include <string>
16
18
19namespace proto_fuzzer {
20
30
40
43class TlsServerContext;
44
50 public:
51 explicit TlsMockTransport(
53 curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain =
54 curl::fuzzer::proto::TLS_CERTIFICATE_CHAIN_DEFAULT_EC,
56 curl::fuzzer::proto::TlsHandshakeProfile handshake_profile = curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT);
58
59 TlsMockTransport(const TlsMockTransport&) = delete;
60 TlsMockTransport& operator=(const TlsMockTransport&) = delete;
61
62 void Install(CURL* easy) const;
63
64 std::unique_ptr<MockConnection> CreateConnection();
65
66 std::unique_ptr<MockConnection> CreateAcceptedConnection(int accepted_fd);
67
68 int negotiated_tls_version() const;
69 std::size_t completed_handshake_count() const;
70 std::size_t reused_session_count() const;
71 std::size_t write_retry_count() const;
72 std::string negotiated_alpn() const;
74 std::string negotiated_group() const;
75 int ech_status() const;
76 std::string ech_inner_name() const;
77 std::string ech_outer_name() const;
78
79 private:
80 const TlsGroupPolicy group_policy_;
81 const bool openssl_close_notify_;
82 const bool openssl_hello_request_;
83 std::unique_ptr<TlsServerContext> context_;
84};
85
89class TlsMockServer : public MockServer {
90 public:
92
93 explicit TlsMockServer(
94 curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain,
95 curl::fuzzer::proto::TlsHandshakeProfile handshake_profile = curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT);
96 ~TlsMockServer() override;
97
98 TlsMockServer(const TlsMockServer&) = delete;
99 TlsMockServer& operator=(const TlsMockServer&) = delete;
100
101 void Install(CURL* easy) override;
102
103 bool saw_live_tls_session() const;
104
105 std::size_t exported_session_count() const;
106
107 std::size_t imported_session_count() const;
108
109 int negotiated_tls_version() const;
110
111 std::size_t completed_handshake_count() const;
112
113 std::size_t reused_session_count() const;
114
115 std::size_t write_retry_count() const;
116
117 std::string negotiated_alpn() const;
118
119 std::string negotiated_group() const;
120
121 int ech_status() const;
122
123 std::string ech_inner_name() const;
124
125 std::string ech_outer_name() const;
126
127 protected:
128 explicit TlsMockServer(
129 TlsApplicationProtocol protocol,
130 curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain =
131 curl::fuzzer::proto::TLS_CERTIFICATE_CHAIN_DEFAULT_EC,
133 curl::fuzzer::proto::TlsHandshakeProfile handshake_profile = curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT);
134
136
137 std::unique_ptr<MockConnection> CreateConnection() override;
138
139 void ObserveActiveTransfer(CURL* easy) override;
140
141 private:
142 TlsMockTransport transport_;
143 bool saw_live_tls_session_;
144 std::size_t session_export_attempt_count_;
145 std::size_t exported_session_count_;
146 std::size_t imported_session_count_;
147};
148
149} // namespace proto_fuzzer
150
151#endif // PROTO_FUZZER_TLS_MOCK_SERVER_H_
MockServer(MultiDrivePolicy drive_policy=MultiDrivePolicy::kPerform)
Construct an idle MockServer with no scripted responses or open peers.
void Install(CURL *easy) override
Install common socket callbacks and a stable local trust anchor.
std::string ech_inner_name() const
std::size_t reused_session_count() const
std::size_t imported_session_count() const
std::size_t exported_session_count() const
std::string negotiated_alpn() const
TlsMockServer()
Build one reusable in-process server context per fuzz iteration.
std::size_t completed_handshake_count() const
TlsGroupPolicy group_policy() const
~TlsMockServer() override
Release SSL objects before their owning server context.
std::string negotiated_group() const
void ObserveActiveTransfer(CURL *easy) override
Query while the connection filters are attached.
std::size_t write_retry_count() const
std::unique_ptr< MockConnection > CreateConnection() override
Wrap one socketpair server endpoint in an OpenSSL acceptor consumed by MockServer.
std::string ech_outer_name() const
Reusable TLS carrier for protocol-specific mock peers.
std::unique_ptr< MockConnection > CreateConnection()
Wrap one socketpair server endpoint in an OpenSSL acceptor.
std::unique_ptr< MockConnection > CreateAcceptedConnection(int accepted_fd)
Wrap one accepted loopback descriptor in this transport's OpenSSL server context.
std::size_t completed_handshake_count() const
std::size_t reused_session_count() const
void Install(CURL *easy) const
Install the stable local trust anchor and strict peer verification.
std::size_t write_retry_count() const
TlsMockTransport(TlsApplicationProtocol protocol=TlsApplicationProtocol::kHttp11, curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain=curl::fuzzer::proto::TLS_CERTIFICATE_CHAIN_DEFAULT_EC, TlsGroupPolicy group_policy=TlsGroupPolicy::kProviderDefault, curl::fuzzer::proto::TlsHandshakeProfile handshake_profile=curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT)
Construct one reusable TLS context for a protocol-specific peer.
std::string negotiated_alpn() const
TlsGroupPolicy group_policy() const
std::string negotiated_group() const
MockConnection and MockServer — the in-process peer that feeds canned response bytes to libcurl over ...
TlsGroupPolicy
Key-exchange group policy fixed when a TLS peer is constructed.
@ kProviderDefault
Retain the linked OpenSSL provider's preferred group ordering.
@ kX25519
Restrict negotiation to the inexpensive X25519 group.
TlsApplicationProtocol
Application protocol selected by the in-process TLS peer.
@ kHttp2
The dedicated proxy peer exchanges HTTP/2 frames after its handshake.
@ kHttp11
Ordinary HTTPS scripts contain HTTP/1.1 response bytes.