Botan 3.13.0
Crypto and TLS for C&
tls_client.cpp
Go to the documentation of this file.
1/*
2* TLS Client
3* (C) 2004-2011,2012,2015,2016 Jack Lloyd
4* 2016 Matthias Gierlings
5* 2017 Harry Reimann, Rohde & Schwarz Cybersecurity
6* 2021 Elektrobit Automotive GmbH
7*
8* Botan is released under the Simplified BSD License (see license.txt)
9*/
10
11#include <botan/tls_client.h>
12
13#include <botan/tls_policy.h>
14#include <botan/x509cert.h>
15#include <botan/internal/tls_channel_impl.h>
16
17#if defined(BOTAN_HAS_TLS_12)
18 #include <botan/internal/tls_client_impl_12.h>
19#endif
20
21#if defined(BOTAN_HAS_TLS_13)
22 #include <botan/internal/tls_client_impl_13.h>
23#endif
24
25namespace Botan::TLS {
26
27/*
28* TLS Client Constructor
29*/
30Client::Client(const std::shared_ptr<Callbacks>& callbacks,
31 const std::shared_ptr<Session_Manager>& session_manager,
32 const std::shared_ptr<Credentials_Manager>& creds,
33 const std::shared_ptr<const Policy>& policy,
34 const std::shared_ptr<RandomNumberGenerator>& rng,
36 Protocol_Version offer_version,
37 const std::vector<std::string>& next_protocols,
38 size_t io_buf_sz) {
39 BOTAN_ARG_CHECK(policy->acceptable_protocol_version(offer_version),
40 "Policy does not allow to offer requested protocol version");
41
42#if defined(BOTAN_HAS_TLS_13)
43 if(offer_version == Protocol_Version::TLS_V13) {
44 m_impl = std::make_unique<Client_Impl_13>(
45 callbacks, session_manager, creds, policy, rng, std::move(info), next_protocols);
46
47 #if defined(BOTAN_HAS_TLS_DOWNGRADE_SUPPORT)
48 if(m_impl->expects_downgrade()) {
49 m_impl->set_io_buffer_size(io_buf_sz);
50 }
51
52 if(m_impl->is_downgrading()) {
53 // TLS 1.3 implementation found a resumable TLS 1.2 session and
54 // requested a downgrade right away.
55 downgrade();
56 }
57 #endif
58
59 return;
60 }
61#endif
62
63#if defined(BOTAN_HAS_TLS_12)
64 if(offer_version.is_pre_tls_13()) {
65 m_impl = std::make_unique<Client_Impl_12>(callbacks,
66 session_manager,
67 creds,
68 policy,
69 rng,
70 std::move(info),
71 offer_version.is_datagram_protocol(),
72 next_protocols,
73 io_buf_sz);
74 return;
75 }
76#endif
77
78 BOTAN_UNUSED(callbacks, session_manager, creds, policy, rng, info, offer_version, next_protocols, io_buf_sz);
79 throw Not_Implemented("Requested TLS version to be offered is not available in this build");
80}
81
82Client::~Client() = default;
83
84#if defined(BOTAN_HAS_TLS_DOWNGRADE_SUPPORT)
85
86size_t Client::downgrade() {
87 BOTAN_ASSERT_NOMSG(m_impl->is_downgrading());
88
89 auto info = m_impl->extract_downgrade_info();
90 m_impl = std::make_unique<Client_Impl_12>(*info);
91
92 if(!info->peer_transcript.empty()) {
93 // replay peer data received so far
94 return m_impl->from_peer(info->peer_transcript);
95 } else {
96 // the downgrade happened due to a resumable TLS 1.2 session
97 // before any data was transferred
98 return 0;
99 }
100}
101
102#endif
103
104size_t Client::from_peer(std::span<const uint8_t> data) {
105 auto read = m_impl->from_peer(data);
106
107#if defined(BOTAN_HAS_TLS_DOWNGRADE_SUPPORT)
108 if(m_impl->is_downgrading()) {
109 read = downgrade();
110 }
111#endif
112
113 return read;
114}
115
117 return m_impl->is_handshake_complete();
118}
119
120bool Client::is_active() const {
121 return m_impl->is_active();
122}
123
124std::optional<std::chrono::milliseconds> Client::next_retransmission_timeout() const {
125 return m_impl->next_retransmission_timeout();
126}
127
128bool Client::is_closed() const {
129 return m_impl->is_closed();
130}
131
133 return m_impl->is_closed_for_reading();
134}
135
137 return m_impl->is_closed_for_writing();
138}
139
140std::vector<X509_Certificate> Client::peer_cert_chain() const {
141 return m_impl->peer_cert_chain();
142}
143
144std::shared_ptr<const Public_Key> Client::peer_raw_public_key() const {
145 return m_impl->peer_raw_public_key();
146}
147
148std::optional<std::string> Client::external_psk_identity() const {
149 return m_impl->external_psk_identity();
150}
151
152SymmetricKey Client::key_material_export(std::string_view label, std::string_view context, size_t length) const {
153 return m_impl->key_material_export(label, context, length);
154}
155
156void Client::renegotiate(bool force_full_renegotiation) {
157 m_impl->renegotiate(force_full_renegotiation);
158}
159
160void Client::update_traffic_keys(bool request_peer_update) {
161 m_impl->update_traffic_keys(request_peer_update);
162}
163
165 return m_impl->secure_renegotiation_supported();
166}
167
168void Client::to_peer(std::span<const uint8_t> data) {
169 m_impl->to_peer(data);
170}
171
172void Client::send_alert(const Alert& alert) {
173 m_impl->send_alert(alert);
174}
175
177 m_impl->send_warning_alert(type);
178}
179
181 m_impl->send_fatal_alert(type);
182}
183
185 m_impl->close();
186}
187
189 return m_impl->timeout_check();
190}
191
192std::string Client::application_protocol() const {
193 return m_impl->application_protocol();
194}
195
196} // namespace Botan::TLS
#define BOTAN_UNUSED
Definition assert.h:144
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
AlertType Type
Definition tls_alert.h:72
bool is_closed_for_reading() const override
bool is_handshake_complete() const override
void renegotiate(bool force_full_renegotiation=false) override
void close() override
std::string application_protocol() const override
std::shared_ptr< const Public_Key > peer_raw_public_key() const override
Client(const std::shared_ptr< Callbacks > &callbacks, const std::shared_ptr< Session_Manager > &session_manager, const std::shared_ptr< Credentials_Manager > &creds, const std::shared_ptr< const Policy > &policy, const std::shared_ptr< RandomNumberGenerator > &rng, Server_Information server_info=Server_Information(), Protocol_Version offer_version=Protocol_Version::latest_tls_version(), const std::vector< std::string > &next_protocols={}, size_t reserved_io_buffer_size=TLS::Client::IO_BUF_DEFAULT_SIZE)
bool secure_renegotiation_supported() const override
bool is_active() const override
SymmetricKey key_material_export(std::string_view label, std::string_view context, size_t length) const override
bool is_closed_for_writing() const override
std::optional< std::chrono::milliseconds > next_retransmission_timeout() const override
void send_fatal_alert(Alert::Type type) override
bool timeout_check() override
void send_warning_alert(Alert::Type type) override
void to_peer(std::span< const uint8_t > data) override
~Client() override
std::vector< X509_Certificate > peer_cert_chain() const override
bool is_closed() const override
void update_traffic_keys(bool request_peer_update=false) override
std::optional< std::string > external_psk_identity() const override
void send_alert(const Alert &alert) override
size_t from_peer(std::span< const uint8_t > data) override
OctetString SymmetricKey
Definition symkey.h:153