Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qsslsocket.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// Copyright (C) 2014 BlackBerry Limited. All rights reserved.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
6
7//#define QSSLSOCKET_DEBUG
8
9/*!
10 \class QSslSocket
11 \brief The QSslSocket class provides an SSL encrypted socket for both
12 clients and servers.
13 \since 4.3
14
15 \reentrant
16 \ingroup network
17 \ingroup ssl
18 \inmodule QtNetwork
19
20 QSslSocket establishes a secure, encrypted TCP connection you can
21 use for transmitting encrypted data. It can operate in both client
22 and server mode, and it supports modern TLS protocols, including
23 TLS 1.3. By default, QSslSocket uses only TLS protocols
24 which are considered to be secure (QSsl::SecureProtocols), but you can
25 change the TLS protocol by calling setProtocol() as long as you do
26 it before the handshake has started.
27
28 SSL encryption operates on top of the existing TCP stream after
29 the socket enters the ConnectedState. There are two simple ways to
30 establish a secure connection using QSslSocket: With an immediate
31 SSL handshake, or with a delayed SSL handshake occurring after the
32 connection has been established in unencrypted mode.
33
34 The most common way to use QSslSocket is to construct an object
35 and start a secure connection by calling connectToHostEncrypted().
36 This method starts an immediate SSL handshake once the connection
37 has been established.
38
39 \snippet code/src_network_ssl_qsslsocket.cpp 0
40
41 As with a plain QTcpSocket, QSslSocket enters the HostLookupState,
42 ConnectingState, and finally the ConnectedState, if the connection
43 is successful. The handshake then starts automatically, and if it
44 succeeds, the encrypted() signal is emitted to indicate the socket
45 has entered the encrypted state and is ready for use.
46
47 Note that data can be written to the socket immediately after the
48 return from connectToHostEncrypted() (i.e., before the encrypted()
49 signal is emitted). The data is queued in QSslSocket until after
50 the encrypted() signal is emitted.
51
52 An example of using the delayed SSL handshake to secure an
53 existing connection is the case where an SSL server secures an
54 incoming connection. Suppose you create an SSL server class as a
55 subclass of QTcpServer. You would override
56 QTcpServer::incomingConnection() with something like the example
57 below, which first constructs an instance of QSslSocket and then
58 calls setSocketDescriptor() to set the new socket's descriptor to
59 the existing one passed in. It then initiates the SSL handshake
60 by calling startServerEncryption().
61
62 \snippet code/src_network_ssl_qsslsocket.cpp 1
63
64 If an error occurs, QSslSocket emits the sslErrors() signal. In this
65 case, if no action is taken to ignore the error(s), the connection
66 is dropped. To continue, despite the occurrence of an error, you
67 can call ignoreSslErrors(), either from within this slot after the
68 error occurs, or any time after construction of the QSslSocket and
69 before the connection is attempted. This will allow QSslSocket to
70 ignore the errors it encounters when establishing the identity of
71 the peer. Ignoring errors during an SSL handshake should be used
72 with caution, since a fundamental characteristic of secure
73 connections is that they should be established with a successful
74 handshake.
75
76 Once encrypted, you use QSslSocket as a regular QTcpSocket. When
77 readyRead() is emitted, you can call read(), canReadLine() and
78 readLine(), or getChar() to read decrypted data from QSslSocket's
79 internal buffer, and you can call write() or putChar() to write
80 data back to the peer. QSslSocket will automatically encrypt the
81 written data for you, and emit encryptedBytesWritten() once
82 the data has been written to the peer.
83
84 As a convenience, QSslSocket supports QTcpSocket's blocking
85 functions waitForConnected(), waitForReadyRead(),
86 waitForBytesWritten(), and waitForDisconnected(). It also provides
87 waitForEncrypted(), which will block the calling thread until an
88 encrypted connection has been established.
89
90 \snippet code/src_network_ssl_qsslsocket.cpp 2
91
92 QSslSocket provides an extensive, easy-to-use API for handling
93 cryptographic ciphers, private keys, and local, peer, and
94 Certification Authority (CA) certificates. It also provides an API
95 for handling errors that occur during the handshake phase.
96
97 The following features can also be customized:
98
99 \list
100 \li The socket's cryptographic cipher suite can be customized before
101 the handshake phase with QSslConfiguration::setCiphers().
102 \li The socket's local certificate and private key can be customized
103 before the handshake phase with setLocalCertificate() and
104 setPrivateKey().
105 \li The CA certificate database can be extended and customized with
106 QSslConfiguration::addCaCertificate(),
107 QSslConfiguration::addCaCertificates().
108 \endlist
109
110 To extend the list of \e default CA certificates used by the SSL sockets
111 during the SSL handshake you must update the default configuration, as
112 in the snippet below:
113
114 \code
115 QList<QSslCertificate> certificates = getCertificates();
116 QSslConfiguration configuration = QSslConfiguration::defaultConfiguration();
117 configuration.addCaCertificates(certificates);
118 QSslConfiguration::setDefaultConfiguration(configuration);
119 \endcode
120
121 \note If available, root certificates on Unix (excluding \macos) will be
122 loaded on demand from the standard certificate directories. If you do not
123 want to load root certificates on demand, you need to call either
124 QSslConfiguration::defaultConfiguration().setCaCertificates() before the first
125 SSL handshake is made in your application (for example, via passing
126 QSslSocket::systemCaCertificates() to it), or call
127 QSslConfiguration::defaultConfiguration()::setCaCertificates() on your QSslSocket instance
128 prior to the SSL handshake.
129
130 For more information about ciphers and certificates, refer to QSslCipher and
131 QSslCertificate.
132
133 This product includes software developed by the OpenSSL Project
134 for use in the OpenSSL Toolkit (\l{http://www.openssl.org/}).
135
136 \note Be aware of the difference between the bytesWritten() signal and
137 the encryptedBytesWritten() signal. For a QTcpSocket, bytesWritten()
138 will get emitted as soon as data has been written to the TCP socket.
139 For a QSslSocket, bytesWritten() will get emitted when the data
140 is being encrypted and encryptedBytesWritten()
141 will get emitted as soon as data has been written to the TCP socket.
142
143 \sa QSslCertificate, QSslCipher, QSslError
144*/
145
146/*!
147 \enum QSslSocket::SslMode
148
149 Describes the connection modes available for QSslSocket.
150
151 \value UnencryptedMode The socket is unencrypted. Its
152 behavior is identical to QTcpSocket.
153
154 \value SslClientMode The socket is a client-side SSL socket.
155 It is either already encrypted, or it is in the SSL handshake
156 phase (see QSslSocket::isEncrypted()).
157
158 \value SslServerMode The socket is a server-side SSL socket.
159 It is either already encrypted, or it is in the SSL handshake
160 phase (see QSslSocket::isEncrypted()).
161*/
162
163/*!
164 \enum QSslSocket::PeerVerifyMode
165 \since 4.4
166
167 Describes the peer verification modes for QSslSocket. The default mode is
168 AutoVerifyPeer, which selects an appropriate mode depending on the
169 socket's QSocket::SslMode.
170
171 \value VerifyNone QSslSocket will not request a certificate from the
172 peer. You can set this mode if you are not interested in the identity of
173 the other side of the connection. The connection will still be encrypted,
174 and your socket will still send its local certificate to the peer if it's
175 requested.
176
177 \value QueryPeer QSslSocket will request a certificate from the peer, but
178 does not require this certificate to be valid. This is useful when you
179 want to display peer certificate details to the user without affecting the
180 actual SSL handshake. This mode is the default for servers.
181 Note: In Schannel this value acts the same as VerifyNone.
182
183 \value VerifyPeer QSslSocket will request a certificate from the peer
184 during the SSL handshake phase, and requires that this certificate is
185 valid. On failure, QSslSocket will emit the QSslSocket::sslErrors()
186 signal. This mode is the default for clients.
187
188 \value AutoVerifyPeer QSslSocket will automatically use QueryPeer for
189 server sockets and VerifyPeer for client sockets.
190
191 \sa QSslSocket::peerVerifyMode()
192*/
193
194/*!
195 \fn void QSslSocket::encrypted()
196
197 This signal is emitted when QSslSocket enters encrypted mode. After this
198 signal has been emitted, QSslSocket::isEncrypted() will return true, and
199 all further transmissions on the socket will be encrypted.
200
201 \sa QSslSocket::connectToHostEncrypted(), QSslSocket::isEncrypted()
202*/
203
204/*!
205 \fn void QSslSocket::modeChanged(QSslSocket::SslMode mode)
206
207 This signal is emitted when QSslSocket changes from \l
208 QSslSocket::UnencryptedMode to either \l QSslSocket::SslClientMode or \l
209 QSslSocket::SslServerMode. \a mode is the new mode.
210
211 \sa QSslSocket::mode()
212*/
213
214/*!
215 \fn void QSslSocket::encryptedBytesWritten(qint64 written)
216 \since 4.4
217
218 This signal is emitted when QSslSocket writes its encrypted data to the
219 network. The \a written parameter contains the number of bytes that were
220 successfully written.
221
222 \sa QIODevice::bytesWritten()
223*/
224
225/*!
226 \fn void QSslSocket::peerVerifyError(const QSslError &error)
227 \since 4.4
228
229 QSslSocket can emit this signal several times during the SSL handshake,
230 before encryption has been established, to indicate that an error has
231 occurred while establishing the identity of the peer. The \a error is
232 usually an indication that QSslSocket is unable to securely identify the
233 peer.
234
235 This signal provides you with an early indication when something's wrong.
236 By connecting to this signal, you can manually choose to tear down the
237 connection from inside the connected slot before the handshake has
238 completed. If no action is taken, QSslSocket will proceed to emitting
239 QSslSocket::sslErrors().
240
241 \sa sslErrors()
242*/
243
244/*!
245 \fn void QSslSocket::sslErrors(const QList<QSslError> &errors);
246
247 QSslSocket emits this signal after the SSL handshake to indicate that one
248 or more errors have occurred while establishing the identity of the
249 peer. The errors are usually an indication that QSslSocket is unable to
250 securely identify the peer. Unless any action is taken, the connection
251 will be dropped after this signal has been emitted.
252
253 If you want to continue connecting despite the errors that have occurred,
254 you must call QSslSocket::ignoreSslErrors() from inside a slot connected to
255 this signal. If you need to access the error list at a later point, you
256 can call sslHandshakeErrors().
257
258 \a errors contains one or more errors that prevent QSslSocket from
259 verifying the identity of the peer.
260
261 \note You cannot use Qt::QueuedConnection when connecting to this signal,
262 or calling QSslSocket::ignoreSslErrors() will have no effect.
263
264 \sa peerVerifyError()
265*/
266
267/*!
268 \fn void QSslSocket::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)
269 \since 5.5
270
271 QSslSocket emits this signal when it negotiates a PSK ciphersuite, and
272 therefore a PSK authentication is then required.
273
274 When using PSK, the client must send to the server a valid identity and a
275 valid pre shared key, in order for the SSL handshake to continue.
276 Applications can provide this information in a slot connected to this
277 signal, by filling in the passed \a authenticator object according to their
278 needs.
279
280 \note Ignoring this signal, or failing to provide the required credentials,
281 will cause the handshake to fail, and therefore the connection to be aborted.
282
283 \note The \a authenticator object is owned by the socket and must not be
284 deleted by the application.
285
286 \sa QSslPreSharedKeyAuthenticator
287*/
288
289/*!
290 \fn void QSslSocket::alertSent(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
291
292 QSslSocket emits this signal if an alert message was sent to a peer. \a level
293 describes if it was a warning or a fatal error. \a type gives the code
294 of the alert message. When a textual description of the alert message is
295 available, it is supplied in \a description.
296
297 \note This signal is mostly informational and can be used for debugging
298 purposes, normally it does not require any actions from the application.
299 \note Not all backends support this functionality.
300
301 \sa alertReceived(), QSsl::AlertLevel, QSsl::AlertType
302*/
303
304/*!
305 \fn void QSslSocket::alertReceived(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
306
307 QSslSocket emits this signal if an alert message was received from a peer.
308 \a level tells if the alert was fatal or it was a warning. \a type is the
309 code explaining why the alert was sent. When a textual description of
310 the alert message is available, it is supplied in \a description.
311
312 \note The signal is mostly for informational and debugging purposes and does not
313 require any handling in the application. If the alert was fatal, underlying
314 backend will handle it and close the connection.
315 \note Not all backends support this functionality.
316
317 \sa alertSent(), QSsl::AlertLevel, QSsl::AlertType
318*/
319
320/*!
321 \fn void QSslSocket::handshakeInterruptedOnError(const QSslError &error)
322
323 QSslSocket emits this signal if a certificate verification error was
324 found and if early error reporting was enabled in QSslConfiguration.
325 An application is expected to inspect the \a error and decide if
326 it wants to continue the handshake, or abort it and send an alert message
327 to the peer. The signal-slot connection must be direct.
328
329 \sa continueInterruptedHandshake(), sslErrors(), QSslConfiguration::setHandshakeMustInterruptOnError()
330*/
331
332/*!
333 \fn void QSslSocket::newSessionTicketReceived()
334 \since 5.15
335
336 If TLS 1.3 protocol was negotiated during a handshake, QSslSocket
337 emits this signal after receiving NewSessionTicket message. Session
338 and session ticket's lifetime hint are updated in the socket's
339 configuration. The session can be used for session resumption (and
340 a shortened handshake) in future TLS connections.
341
342 \note This functionality enabled only with OpenSSL backend and requires
343 OpenSSL v 1.1.1 or above.
344
345 \sa QSslSocket::sslConfiguration(), QSslConfiguration::sessionTicket(), QSslConfiguration::sessionTicketLifeTimeHint()
346*/
347
348#include "qssl_p.h"
349#include "qsslsocket.h"
350#include "qsslcipher.h"
351#include "qocspresponse.h"
352#include "qtlsbackend_p.h"
354#include "qsslsocket_p.h"
355
356#include <QtCore/qdebug.h>
357#include <QtCore/qdir.h>
358#include <QtCore/qmutex.h>
359#include <QtCore/qurl.h>
360#include <QtCore/qelapsedtimer.h>
361#include <QtNetwork/qhostaddress.h>
362#include <QtNetwork/qhostinfo.h>
363
365
366using namespace Qt::StringLiterals;
367
368#ifdef Q_OS_VXWORKS
369constexpr auto isVxworks = true;
370#else
371constexpr auto isVxworks = false;
372#endif
373
392Q_GLOBAL_STATIC(QSslSocketGlobalData, globalData)
393
394/*!
395 Constructs a QSslSocket object. \a parent is passed to QObject's
396 constructor. The new socket's \l {QSslCipher} {cipher} suite is
397 set to the one returned by the static method defaultCiphers().
398*/
399QSslSocket::QSslSocket(QObject *parent)
400 : QTcpSocket(*new QSslSocketPrivate, parent)
401{
402 Q_D(QSslSocket);
403#ifdef QSSLSOCKET_DEBUG
404 qCDebug(lcSsl) << "QSslSocket::QSslSocket(" << parent << "), this =" << (void *)this;
405#endif
406 d->q_ptr = this;
407 d->init();
408}
409
410/*!
411 Destroys the QSslSocket.
412*/
413QSslSocket::~QSslSocket()
414{
415 Q_D(QSslSocket);
416#ifdef QSSLSOCKET_DEBUG
417 qCDebug(lcSsl) << "QSslSocket::~QSslSocket(), this =" << (void *)this;
418#endif
419 delete d->plainSocket;
420 d->plainSocket = nullptr;
421}
422
423/*!
424 \reimp
425
426 \since 5.0
427
428 Continues data transfer on the socket after it has been paused. If
429 "setPauseMode(QAbstractSocket::PauseOnSslErrors);" has been called on
430 this socket and a sslErrors() signal is received, calling this method
431 is necessary for the socket to continue.
432
433 \sa QAbstractSocket::pauseMode(), QAbstractSocket::setPauseMode()
434*/
435void QSslSocket::resume()
436{
437 Q_D(QSslSocket);
438 if (!d->paused)
439 return;
440 // continuing might emit signals, rather do this through the event loop
441 QMetaObject::invokeMethod(this, "_q_resumeImplementation", Qt::QueuedConnection);
442}
443
444/*!
445 Starts an encrypted connection to the device \a hostName on \a
446 port, using \a mode as the \l OpenMode. This is equivalent to
447 calling connectToHost() to establish the connection, followed by a
448 call to startClientEncryption(). The \a protocol parameter can be
449 used to specify which network protocol to use (eg. IPv4 or IPv6).
450
451 QSslSocket first enters the HostLookupState. Then, after entering
452 either the event loop or one of the waitFor...() functions, it
453 enters the ConnectingState, emits connected(), and then initiates
454 the SSL client handshake. At each state change, QSslSocket emits
455 signal stateChanged().
456
457 After initiating the SSL client handshake, if the identity of the
458 peer can't be established, signal sslErrors() is emitted. If you
459 want to ignore the errors and continue connecting, you must call
460 ignoreSslErrors(), either from inside a slot function connected to
461 the sslErrors() signal, or prior to entering encrypted mode. If
462 ignoreSslErrors() is not called, the connection is dropped, signal
463 disconnected() is emitted, and QSslSocket returns to the
464 UnconnectedState.
465
466 If the SSL handshake is successful, QSslSocket emits encrypted().
467
468 \snippet code/src_network_ssl_qsslsocket.cpp 3
469
470 \note The example above shows that text can be written to
471 the socket immediately after requesting the encrypted connection,
472 before the encrypted() signal has been emitted. In such cases, the
473 text is queued in the object and written to the socket \e after
474 the connection is established and the encrypted() signal has been
475 emitted.
476
477 The default for \a mode is \l ReadWrite.
478
479 If you want to create a QSslSocket on the server side of a connection, you
480 should instead call startServerEncryption() upon receiving the incoming
481 connection through QTcpServer.
482
483 \sa connectToHost(), startClientEncryption(), waitForConnected(), waitForEncrypted()
484*/
485void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port, OpenMode mode, NetworkLayerProtocol protocol)
486{
487 Q_D(QSslSocket);
488 if (d->state == ConnectedState || d->state == ConnectingState) {
489 qCWarning(lcSsl,
490 "QSslSocket::connectToHostEncrypted() called when already connecting/connected");
491 return;
492 }
493
494 if (!supportsSsl()) {
495 qCWarning(lcSsl, "QSslSocket::connectToHostEncrypted: TLS initialization failed");
496 d->setErrorAndEmit(QAbstractSocket::SslInternalError, tr("TLS initialization failed"));
497 return;
498 }
499
500 if (!d->verifyProtocolSupported("QSslSocket::connectToHostEncrypted:"))
501 return;
502
503 d->init();
504 d->autoStartHandshake = true;
505 d->initialized = true;
506
507 // Note: When connecting to localhost, some platforms (e.g., HP-UX and some BSDs)
508 // establish the connection immediately (i.e., first attempt).
509 connectToHost(hostName, port, mode, protocol);
510}
511
512/*!
513 \since 4.6
514 \overload
515
516 In addition to the original behaviour of connectToHostEncrypted,
517 this overloaded method enables the usage of a different hostname
518 (\a sslPeerName) for the certificate validation instead of
519 the one used for the TCP connection (\a hostName).
520
521 \sa connectToHostEncrypted()
522*/
523void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port,
524 const QString &sslPeerName, OpenMode mode,
525 NetworkLayerProtocol protocol)
526{
527 Q_D(QSslSocket);
528 if (d->state == ConnectedState || d->state == ConnectingState) {
529 qCWarning(lcSsl,
530 "QSslSocket::connectToHostEncrypted() called when already connecting/connected");
531 return;
532 }
533
534 if (!supportsSsl()) {
535 qCWarning(lcSsl, "QSslSocket::connectToHostEncrypted: TLS initialization failed");
536 d->setErrorAndEmit(QAbstractSocket::SslInternalError, tr("TLS initialization failed"));
537 return;
538 }
539
540 d->init();
541 d->autoStartHandshake = true;
542 d->initialized = true;
543 d->verificationPeerName = sslPeerName;
544
545 // Note: When connecting to localhost, some platforms (e.g., HP-UX and some BSDs)
546 // establish the connection immediately (i.e., first attempt).
547 connectToHost(hostName, port, mode, protocol);
548}
549
550/*!
551 Initializes QSslSocket with the native socket descriptor \a
552 socketDescriptor. Returns \c true if \a socketDescriptor is accepted
553 as a valid socket descriptor; otherwise returns \c false.
554 The socket is opened in the mode specified by \a openMode, and
555 enters the socket state specified by \a state.
556
557 \note It is not possible to initialize two sockets with the same
558 native socket descriptor.
559
560 \sa socketDescriptor()
561*/
562bool QSslSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState state, OpenMode openMode)
563{
564 Q_D(QSslSocket);
565#ifdef QSSLSOCKET_DEBUG
566 qCDebug(lcSsl) << "QSslSocket::setSocketDescriptor(" << socketDescriptor << ','
567 << state << ',' << openMode << ')';
568#endif
569 if (!d->plainSocket)
570 d->createPlainSocket(openMode);
571 bool retVal = d->plainSocket->setSocketDescriptor(socketDescriptor, state, openMode);
572 d->cachedSocketDescriptor = d->plainSocket->socketDescriptor();
573 d->setError(d->plainSocket->error(), d->plainSocket->errorString());
574 setSocketState(state);
575 setOpenMode(openMode);
576 setLocalPort(d->plainSocket->localPort());
577 setLocalAddress(d->plainSocket->localAddress());
578 setPeerPort(d->plainSocket->peerPort());
579 setPeerAddress(d->plainSocket->peerAddress());
580 setPeerName(d->plainSocket->peerName());
581 d->readChannelCount = d->plainSocket->readChannelCount();
582 d->writeChannelCount = d->plainSocket->writeChannelCount();
583 return retVal;
584}
585
586/*!
587 \since 4.6
588 Sets the given \a option to the value described by \a value.
589
590 \sa socketOption()
591*/
592void QSslSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
593{
594 Q_D(QSslSocket);
595 if (d->plainSocket)
596 d->plainSocket->setSocketOption(option, value);
597}
598
599/*!
600 \since 4.6
601 Returns the value of the \a option option.
602
603 \sa setSocketOption()
604*/
605QVariant QSslSocket::socketOption(QAbstractSocket::SocketOption option)
606{
607 Q_D(QSslSocket);
608 if (d->plainSocket)
609 return d->plainSocket->socketOption(option);
610 else
611 return QVariant();
612}
613
614/*!
615 Returns the current mode for the socket; either UnencryptedMode, where
616 QSslSocket behaves identially to QTcpSocket, or one of SslClientMode or
617 SslServerMode, where the client is either negotiating or in encrypted
618 mode.
619
620 When the mode changes, QSslSocket emits modeChanged()
621
622 \sa SslMode
623*/
624QSslSocket::SslMode QSslSocket::mode() const
625{
626 Q_D(const QSslSocket);
627 return d->mode;
628}
629
630/*!
631 Returns \c true if the socket is encrypted; otherwise, false is returned.
632
633 An encrypted socket encrypts all data that is written by calling write()
634 or putChar() before the data is written to the network, and decrypts all
635 incoming data as the data is received from the network, before you call
636 read(), readLine() or getChar().
637
638 QSslSocket emits encrypted() when it enters encrypted mode.
639
640 You can call sessionCipher() to find which cryptographic cipher is used to
641 encrypt and decrypt your data.
642
643 \sa mode()
644*/
645bool QSslSocket::isEncrypted() const
646{
647 Q_D(const QSslSocket);
648 return d->connectionEncrypted;
649}
650
651/*!
652 Returns the socket's SSL protocol. By default, \l QSsl::SecureProtocols is used.
653
654 \sa setProtocol()
655*/
656QSsl::SslProtocol QSslSocket::protocol() const
657{
658 Q_D(const QSslSocket);
659 return d->configuration.protocol;
660}
661
662/*!
663 Sets the socket's SSL protocol to \a protocol. This will affect the next
664 initiated handshake; calling this function on an already-encrypted socket
665 will not affect the socket's protocol.
666*/
667void QSslSocket::setProtocol(QSsl::SslProtocol protocol)
668{
669 Q_D(QSslSocket);
670 d->configuration.protocol = protocol;
671}
672
673/*!
674 \since 4.4
675
676 Returns the socket's verify mode. This mode decides whether
677 QSslSocket should request a certificate from the peer (i.e., the client
678 requests a certificate from the server, or a server requesting a
679 certificate from the client), and whether it should require that this
680 certificate is valid.
681
682 The default mode is AutoVerifyPeer, which tells QSslSocket to use
683 VerifyPeer for clients and QueryPeer for servers.
684
685 \sa setPeerVerifyMode(), peerVerifyDepth(), mode()
686*/
687QSslSocket::PeerVerifyMode QSslSocket::peerVerifyMode() const
688{
689 Q_D(const QSslSocket);
690 return d->configuration.peerVerifyMode;
691}
692
693/*!
694 \since 4.4
695
696 Sets the socket's verify mode to \a mode. This mode decides whether
697 QSslSocket should request a certificate from the peer (i.e., the client
698 requests a certificate from the server, or a server requesting a
699 certificate from the client), and whether it should require that this
700 certificate is valid.
701
702 The default mode is AutoVerifyPeer, which tells QSslSocket to use
703 VerifyPeer for clients and QueryPeer for servers.
704
705 Setting this mode after encryption has started has no effect on the
706 current connection.
707
708 \sa peerVerifyMode(), setPeerVerifyDepth(), mode()
709*/
710void QSslSocket::setPeerVerifyMode(QSslSocket::PeerVerifyMode mode)
711{
712 Q_D(QSslSocket);
713 d->configuration.peerVerifyMode = mode;
714}
715
716/*!
717 \since 4.4
718
719 Returns the maximum number of certificates in the peer's certificate chain
720 to be checked during the SSL handshake phase, or 0 (the default) if no
721 maximum depth has been set, indicating that the whole certificate chain
722 should be checked.
723
724 The certificates are checked in issuing order, starting with the peer's
725 own certificate, then its issuer's certificate, and so on.
726
727 \sa setPeerVerifyDepth(), peerVerifyMode()
728*/
729int QSslSocket::peerVerifyDepth() const
730{
731 Q_D(const QSslSocket);
732 return d->configuration.peerVerifyDepth;
733}
734
735/*!
736 \since 4.4
737
738 Sets the maximum number of certificates in the peer's certificate chain to
739 be checked during the SSL handshake phase, to \a depth. Setting a depth of
740 0 means that no maximum depth is set, indicating that the whole
741 certificate chain should be checked.
742
743 The certificates are checked in issuing order, starting with the peer's
744 own certificate, then its issuer's certificate, and so on.
745
746 \sa peerVerifyDepth(), setPeerVerifyMode()
747*/
748void QSslSocket::setPeerVerifyDepth(int depth)
749{
750 Q_D(QSslSocket);
751 if (depth < 0) {
752 qCWarning(lcSsl, "QSslSocket::setPeerVerifyDepth: cannot set negative depth of %d", depth);
753 return;
754 }
755 d->configuration.peerVerifyDepth = depth;
756}
757
758/*!
759 \since 4.8
760
761 Returns the different hostname for the certificate validation, as set by
762 setPeerVerifyName or by connectToHostEncrypted.
763
764 \sa setPeerVerifyName(), connectToHostEncrypted()
765*/
766QString QSslSocket::peerVerifyName() const
767{
768 Q_D(const QSslSocket);
769 return d->verificationPeerName;
770}
771
772/*!
773 \since 4.8
774
775 Sets a different host name, given by \a hostName, for the certificate
776 validation instead of the one used for the TCP connection.
777
778 \sa connectToHostEncrypted()
779*/
780void QSslSocket::setPeerVerifyName(const QString &hostName)
781{
782 Q_D(QSslSocket);
783 d->verificationPeerName = hostName;
784}
785
786/*!
787 \reimp
788
789 Returns the number of decrypted bytes that are immediately available for
790 reading.
791*/
792qint64 QSslSocket::bytesAvailable() const
793{
794 Q_D(const QSslSocket);
795 if (d->mode == UnencryptedMode)
796 return QAbstractSocket::bytesAvailable() + (d->plainSocket ? d->plainSocket->bytesAvailable() : 0);
797 return QAbstractSocket::bytesAvailable();
798}
799
800/*!
801 \reimp
802
803 Returns the number of unencrypted bytes that are waiting to be encrypted
804 and written to the network.
805*/
806qint64 QSslSocket::bytesToWrite() const
807{
808 Q_D(const QSslSocket);
809 if (d->mode == UnencryptedMode)
810 return d->plainSocket ? d->plainSocket->bytesToWrite() : 0;
811 return d->writeBuffer.size();
812}
813
814/*!
815 \since 4.4
816
817 Returns the number of encrypted bytes that are awaiting decryption.
818 Normally, this function will return 0 because QSslSocket decrypts its
819 incoming data as soon as it can.
820*/
821qint64 QSslSocket::encryptedBytesAvailable() const
822{
823 Q_D(const QSslSocket);
824 if (d->mode == UnencryptedMode)
825 return 0;
826 return d->plainSocket->bytesAvailable();
827}
828
829/*!
830 \since 4.4
831
832 Returns the number of encrypted bytes that are waiting to be written to
833 the network.
834*/
835qint64 QSslSocket::encryptedBytesToWrite() const
836{
837 Q_D(const QSslSocket);
838 if (d->mode == UnencryptedMode)
839 return 0;
840 return d->plainSocket->bytesToWrite();
841}
842
843/*!
844 \reimp
845
846 Returns \c true if you can read one while line (terminated by a single ASCII
847 '\\n' character) of decrypted characters; otherwise, false is returned.
848*/
849bool QSslSocket::canReadLine() const
850{
851 Q_D(const QSslSocket);
852 if (d->mode == UnencryptedMode)
853 return QAbstractSocket::canReadLine() || (d->plainSocket && d->plainSocket->canReadLine());
854 return QAbstractSocket::canReadLine();
855}
856
857/*!
858 \reimp
859*/
860void QSslSocket::close()
861{
862#ifdef QSSLSOCKET_DEBUG
863 qCDebug(lcSsl) << "QSslSocket::close()";
864#endif
865 Q_D(QSslSocket);
866
867 // On Windows, CertGetCertificateChain is probably still doing its
868 // job, if the socket is re-used, we want to ignore its reported
869 // root CA.
870 if (auto *backend = d->backend.get())
871 backend->cancelCAFetch();
872
873 if (!d->abortCalled && (encryptedBytesToWrite() || !d->writeBuffer.isEmpty()))
874 flush();
875 if (d->plainSocket) {
876 if (d->abortCalled)
877 d->plainSocket->abort();
878 else
879 d->plainSocket->close();
880 }
881 QTcpSocket::close();
882
883 // must be cleared, reading/writing not possible on closed socket:
884 d->buffer.clear();
885 d->writeBuffer.clear();
886}
887
888/*!
889 \reimp
890*/
891bool QSslSocket::atEnd() const
892{
893 Q_D(const QSslSocket);
894 if (d->mode == UnencryptedMode)
895 return QAbstractSocket::atEnd() && (!d->plainSocket || d->plainSocket->atEnd());
896 return QAbstractSocket::atEnd();
897}
898
899/*!
900 \since 4.4
901
902 Sets the size of QSslSocket's internal read buffer to be \a size bytes.
903*/
904void QSslSocket::setReadBufferSize(qint64 size)
905{
906 Q_D(QSslSocket);
907 d->readBufferMaxSize = size;
908
909 if (d->plainSocket)
910 d->plainSocket->setReadBufferSize(size);
911}
912
913/*!
914 \since 4.4
915
916 Returns the socket's SSL configuration state. The default SSL
917 configuration of a socket is to use the default ciphers,
918 default CA certificates, no local private key or certificate.
919
920 The SSL configuration also contains fields that can change with
921 time without notice.
922
923 \sa localCertificate(), peerCertificate(), peerCertificateChain(),
924 sessionCipher(), privateKey(), QSslConfiguration::ciphers(),
925 QSslConfiguration::caCertificates()
926*/
927QSslConfiguration QSslSocket::sslConfiguration() const
928{
929 Q_D(const QSslSocket);
930
931 // create a deep copy of our configuration
932 QSslConfigurationPrivate *copy = new QSslConfigurationPrivate(d->configuration);
933 copy->ref.storeRelaxed(0); // the QSslConfiguration constructor refs up
934 copy->sessionCipher = d->sessionCipher();
935 copy->sessionProtocol = d->sessionProtocol();
936
937 return QSslConfiguration(copy);
938}
939
940/*!
941 \since 4.4
942
943 Sets the socket's SSL configuration to be the contents of \a configuration.
944 This function sets the local certificate, the ciphers, the private key and the CA
945 certificates to those stored in \a configuration.
946
947 It is not possible to set the SSL-state related fields.
948
949 \sa setLocalCertificate(), setPrivateKey(), QSslConfiguration::setCaCertificates(),
950 QSslConfiguration::setCiphers()
951*/
952void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
953{
954 Q_D(QSslSocket);
955 d->configuration.localCertificateChain = configuration.localCertificateChain();
956 d->configuration.privateKey = configuration.privateKey();
957 d->configuration.ciphers = configuration.ciphers();
958 d->configuration.ellipticCurves = configuration.ellipticCurves();
959 d->configuration.preSharedKeyIdentityHint = configuration.preSharedKeyIdentityHint();
960 d->configuration.dhParams = configuration.diffieHellmanParameters();
961 d->configuration.caCertificates = configuration.caCertificates();
962 d->configuration.peerVerifyDepth = configuration.peerVerifyDepth();
963 d->configuration.peerVerifyMode = configuration.peerVerifyMode();
964 d->configuration.protocol = configuration.protocol();
965 d->configuration.backendConfig = configuration.backendConfiguration();
966 d->configuration.sslOptions = configuration.d->sslOptions;
967 d->configuration.sslSession = configuration.sessionTicket();
968 d->configuration.sslSessionTicketLifeTimeHint = configuration.sessionTicketLifeTimeHint();
969 d->configuration.nextAllowedProtocols = configuration.allowedNextProtocols();
970 d->configuration.nextNegotiatedProtocol = configuration.nextNegotiatedProtocol();
971 d->configuration.nextProtocolNegotiationStatus = configuration.nextProtocolNegotiationStatus();
972 d->configuration.keyingMaterial = configuration.keyingMaterial();
973#if QT_CONFIG(ocsp)
974 d->configuration.ocspStaplingEnabled = configuration.ocspStaplingEnabled();
975#endif
976#if QT_CONFIG(openssl)
977 d->configuration.reportFromCallback = configuration.handshakeMustInterruptOnError();
978 d->configuration.missingCertIsFatal = configuration.missingCertificateIsFatal();
979#endif // openssl
980 // if the CA certificates were set explicitly (either via
981 // QSslConfiguration::setCaCertificates() or QSslSocket::setCaCertificates(),
982 // we cannot load the certificates on demand
983 if (!configuration.d->allowRootCertOnDemandLoading) {
984 d->allowRootCertOnDemandLoading = false;
985 d->configuration.allowRootCertOnDemandLoading = false;
986 }
987}
988
989/*!
990 Sets the certificate chain to be presented to the peer during the
991 SSL handshake to be \a localChain.
992
993 \sa QSslConfiguration::setLocalCertificateChain()
994 \since 5.1
995 */
996void QSslSocket::setLocalCertificateChain(const QList<QSslCertificate> &localChain)
997{
998 Q_D(QSslSocket);
999 d->configuration.localCertificateChain = localChain;
1000}
1001
1002/*!
1003 Returns the socket's local \l {QSslCertificate} {certificate} chain,
1004 or an empty list if no local certificates have been assigned.
1005
1006 \sa setLocalCertificateChain()
1007 \since 5.1
1008*/
1009QList<QSslCertificate> QSslSocket::localCertificateChain() const
1010{
1011 Q_D(const QSslSocket);
1012 return d->configuration.localCertificateChain;
1013}
1014
1015/*!
1016 Sets the socket's local certificate to \a certificate. The local
1017 certificate is necessary if you need to confirm your identity to the
1018 peer. It is used together with the private key; if you set the local
1019 certificate, you must also set the private key.
1020
1021 The local certificate and private key are always necessary for server
1022 sockets, but are also rarely used by client sockets if the server requires
1023 the client to authenticate.
1024
1025 \note Secure Transport SSL backend on macOS may update the default keychain
1026 (the default is probably your login keychain) by importing your local certificates
1027 and keys. This can also result in system dialogs showing up and asking for
1028 permission when your application is using these private keys. If such behavior
1029 is undesired, set the QT_SSL_USE_TEMPORARY_KEYCHAIN environment variable to a
1030 non-zero value; this will prompt QSslSocket to use its own temporary keychain.
1031
1032 \sa localCertificate(), setPrivateKey()
1033*/
1034void QSslSocket::setLocalCertificate(const QSslCertificate &certificate)
1035{
1036 Q_D(QSslSocket);
1037 d->configuration.localCertificateChain = QList<QSslCertificate>();
1038 d->configuration.localCertificateChain += certificate;
1039}
1040
1041/*!
1042 \overload
1043
1044 Sets the socket's local \l {QSslCertificate} {certificate} to the
1045 first one found in file \a path, which is parsed according to the
1046 specified \a format.
1047*/
1048void QSslSocket::setLocalCertificate(const QString &path,
1049 QSsl::EncodingFormat format)
1050{
1051 QFile file(path);
1052 if (file.open(QIODevice::ReadOnly | QIODevice::Text))
1053 setLocalCertificate(QSslCertificate(file.readAll(), format));
1054
1055}
1056
1057/*!
1058 Returns the socket's local \l {QSslCertificate} {certificate}, or
1059 an empty certificate if no local certificate has been assigned.
1060
1061 \sa setLocalCertificate(), privateKey()
1062*/
1063QSslCertificate QSslSocket::localCertificate() const
1064{
1065 Q_D(const QSslSocket);
1066 if (d->configuration.localCertificateChain.isEmpty())
1067 return QSslCertificate();
1068 return d->configuration.localCertificateChain[0];
1069}
1070
1071/*!
1072 Returns the peer's digital certificate (i.e., the immediate
1073 certificate of the host you are connected to), or a null
1074 certificate, if the peer has not assigned a certificate.
1075
1076 The peer certificate is checked automatically during the
1077 handshake phase, so this function is normally used to fetch
1078 the certificate for display or for connection diagnostic
1079 purposes. It contains information about the peer, including
1080 its host name, the certificate issuer, and the peer's public
1081 key.
1082
1083 Because the peer certificate is set during the handshake phase, it
1084 is safe to access the peer certificate from a slot connected to
1085 the sslErrors() signal or the encrypted() signal.
1086
1087 If a null certificate is returned, it can mean the SSL handshake
1088 failed, or it can mean the host you are connected to doesn't have
1089 a certificate, or it can mean there is no connection.
1090
1091 If you want to check the peer's complete chain of certificates,
1092 use peerCertificateChain() to get them all at once.
1093
1094 \sa peerCertificateChain()
1095*/
1096QSslCertificate QSslSocket::peerCertificate() const
1097{
1098 Q_D(const QSslSocket);
1099 return d->configuration.peerCertificate;
1100}
1101
1102/*!
1103 Returns the peer's chain of digital certificates, or an empty list
1104 of certificates.
1105
1106 Peer certificates are checked automatically during the handshake
1107 phase. This function is normally used to fetch certificates for
1108 display, or for performing connection diagnostics. Certificates
1109 contain information about the peer and the certificate issuers,
1110 including host name, issuer names, and issuer public keys.
1111
1112 The peer certificates are set in QSslSocket during the handshake
1113 phase, so it is safe to call this function from a slot connected
1114 to the sslErrors() signal or the encrypted() signal.
1115
1116 If an empty list is returned, it can mean the SSL handshake
1117 failed, or it can mean the host you are connected to doesn't have
1118 a certificate, or it can mean there is no connection.
1119
1120 If you want to get only the peer's immediate certificate, use
1121 peerCertificate().
1122
1123 \sa peerCertificate()
1124*/
1125QList<QSslCertificate> QSslSocket::peerCertificateChain() const
1126{
1127 Q_D(const QSslSocket);
1128 return d->configuration.peerCertificateChain;
1129}
1130
1131/*!
1132 Returns the socket's cryptographic \l {QSslCipher} {cipher}, or a
1133 null cipher if the connection isn't encrypted. The socket's cipher
1134 for the session is set during the handshake phase. The cipher is
1135 used to encrypt and decrypt data transmitted through the socket.
1136
1137 QSslSocket also provides functions for setting the ordered list of
1138 ciphers from which the handshake phase will eventually select the
1139 session cipher. This ordered list must be in place before the
1140 handshake phase begins.
1141
1142 \sa QSslConfiguration::ciphers(), QSslConfiguration::setCiphers(),
1143 QSslConfiguration::setCiphers(),
1144 QSslConfiguration::ciphers(),
1145 QSslConfiguration::supportedCiphers()
1146*/
1147QSslCipher QSslSocket::sessionCipher() const
1148{
1149 Q_D(const QSslSocket);
1150 return d->sessionCipher();
1151}
1152
1153/*!
1154 Returns the socket's SSL/TLS protocol or UnknownProtocol if the
1155 connection isn't encrypted. The socket's protocol for the session
1156 is set during the handshake phase.
1157
1158 \sa protocol(), setProtocol()
1159 \since 5.4
1160*/
1161QSsl::SslProtocol QSslSocket::sessionProtocol() const
1162{
1163 Q_D(const QSslSocket);
1164 return d->sessionProtocol();
1165}
1166
1167/*!
1168 \since 5.13
1169
1170 This function returns Online Certificate Status Protocol responses that
1171 a server may send during a TLS handshake using OCSP stapling. The list
1172 is empty if no definitive response or no response at all was received.
1173
1174 \sa QSslConfiguration::setOcspStaplingEnabled()
1175*/
1176QList<QOcspResponse> QSslSocket::ocspResponses() const
1177{
1178 Q_D(const QSslSocket);
1179 if (const auto *backend = d->backend.get())
1180 return backend->ocsps();
1181 return {};
1182}
1183
1184/*!
1185 Sets the socket's private \l {QSslKey} {key} to \a key. The
1186 private key and the local \l {QSslCertificate} {certificate} are
1187 used by clients and servers that must prove their identity to
1188 SSL peers.
1189
1190 Both the key and the local certificate are required if you are
1191 creating an SSL server socket. If you are creating an SSL client
1192 socket, the key and local certificate are required if your client
1193 must identify itself to an SSL server.
1194
1195 \sa privateKey(), setLocalCertificate()
1196*/
1197void QSslSocket::setPrivateKey(const QSslKey &key)
1198{
1199 Q_D(QSslSocket);
1200 d->configuration.privateKey = key;
1201}
1202
1203/*!
1204 \overload
1205
1206 Reads the string in file \a fileName and decodes it using
1207 a specified \a algorithm and encoding \a format to construct
1208 an \l {QSslKey} {SSL key}. If the encoded key is encrypted,
1209 \a passPhrase is used to decrypt it.
1210
1211 The socket's private key is set to the constructed key. The
1212 private key and the local \l {QSslCertificate} {certificate} are
1213 used by clients and servers that must prove their identity to SSL
1214 peers.
1215
1216 Both the key and the local certificate are required if you are
1217 creating an SSL server socket. If you are creating an SSL client
1218 socket, the key and local certificate are required if your client
1219 must identify itself to an SSL server.
1220
1221 \sa privateKey(), setLocalCertificate()
1222*/
1223void QSslSocket::setPrivateKey(const QString &fileName, QSsl::KeyAlgorithm algorithm,
1224 QSsl::EncodingFormat format, const QByteArray &passPhrase)
1225{
1226 QFile file(fileName);
1227 if (!file.open(QIODevice::ReadOnly)) {
1228 qCWarning(lcSsl, "QSslSocket::setPrivateKey: Couldn't open file for reading");
1229 return;
1230 }
1231
1232 QSslKey key(file.readAll(), algorithm, format, QSsl::PrivateKey, passPhrase);
1233 if (key.isNull()) {
1234 qCWarning(lcSsl, "QSslSocket::setPrivateKey: "
1235 "The specified file does not contain a valid key");
1236 return;
1237 }
1238
1239 Q_D(QSslSocket);
1240 d->configuration.privateKey = key;
1241}
1242
1243/*!
1244 Returns this socket's private key.
1245
1246 \sa setPrivateKey(), localCertificate()
1247*/
1248QSslKey QSslSocket::privateKey() const
1249{
1250 Q_D(const QSslSocket);
1251 return d->configuration.privateKey;
1252}
1253
1254/*!
1255 Waits until the socket is connected, or \a msecs milliseconds,
1256 whichever happens first. If the connection has been established,
1257 this function returns \c true; otherwise it returns \c false.
1258
1259 \sa QAbstractSocket::waitForConnected()
1260*/
1261bool QSslSocket::waitForConnected(int msecs)
1262{
1263 Q_D(QSslSocket);
1264 if (!d->plainSocket)
1265 return false;
1266 bool retVal = d->plainSocket->waitForConnected(msecs);
1267 if (!retVal) {
1268 setSocketState(d->plainSocket->state());
1269 d->setError(d->plainSocket->error(), d->plainSocket->errorString());
1270 }
1271 return retVal;
1272}
1273
1274/*!
1275 Waits until the socket has completed the SSL handshake and has
1276 emitted encrypted(), or \a msecs milliseconds, whichever comes
1277 first. If encrypted() has been emitted, this function returns
1278 true; otherwise (e.g., the socket is disconnected, or the SSL
1279 handshake fails), false is returned.
1280
1281 The following example waits up to one second for the socket to be
1282 encrypted:
1283
1284 \snippet code/src_network_ssl_qsslsocket.cpp 5
1285
1286 If msecs is -1, this function will not time out.
1287
1288 \sa startClientEncryption(), startServerEncryption(), encrypted(), isEncrypted()
1289*/
1290bool QSslSocket::waitForEncrypted(int msecs)
1291{
1292 Q_D(QSslSocket);
1293 if (!d->plainSocket || d->connectionEncrypted)
1294 return false;
1295 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1296 return false;
1297 if (!d->verifyProtocolSupported("QSslSocket::waitForEncrypted:"))
1298 return false;
1299
1300 QElapsedTimer stopWatch;
1301 stopWatch.start();
1302
1303 if (d->plainSocket->state() != QAbstractSocket::ConnectedState) {
1304 // Wait until we've entered connected state.
1305 if (!d->plainSocket->waitForConnected(msecs))
1306 return false;
1307 }
1308
1309 while (!d->connectionEncrypted) {
1310 // Start the handshake, if this hasn't been started yet.
1311 if (d->mode == UnencryptedMode)
1312 startClientEncryption();
1313 // Loop, waiting until the connection has been encrypted or an error
1314 // occurs.
1315 if (!d->plainSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed())))
1316 return false;
1317 }
1318 return d->connectionEncrypted;
1319}
1320
1321/*!
1322 \reimp
1323*/
1324bool QSslSocket::waitForReadyRead(int msecs)
1325{
1326 Q_D(QSslSocket);
1327 if (!d->plainSocket)
1328 return false;
1329 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1330 return d->plainSocket->waitForReadyRead(msecs);
1331
1332 // This function must return true if and only if readyRead() *was* emitted.
1333 // So we initialize "readyReadEmitted" to false and check if it was set to true.
1334 // waitForReadyRead() could be called recursively, so we can't use the same variable
1335 // (the inner waitForReadyRead() may fail, but the outer one still succeeded)
1336 bool readyReadEmitted = false;
1337 bool *previousReadyReadEmittedPointer = d->readyReadEmittedPointer;
1338 d->readyReadEmittedPointer = &readyReadEmitted;
1339
1340 QElapsedTimer stopWatch;
1341 stopWatch.start();
1342
1343 if (!d->connectionEncrypted) {
1344 // Wait until we've entered encrypted mode, or until a failure occurs.
1345 if (!waitForEncrypted(msecs)) {
1346 d->readyReadEmittedPointer = previousReadyReadEmittedPointer;
1347 return false;
1348 }
1349 }
1350
1351 if (!d->writeBuffer.isEmpty()) {
1352 // empty our cleartext write buffer first
1353 d->transmit();
1354 }
1355
1356 // test readyReadEmitted first because either operation above
1357 // (waitForEncrypted or transmit) may have set it
1358 while (!readyReadEmitted &&
1359 d->plainSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
1360 }
1361
1362 d->readyReadEmittedPointer = previousReadyReadEmittedPointer;
1363 return readyReadEmitted;
1364}
1365
1366/*!
1367 \reimp
1368*/
1369bool QSslSocket::waitForBytesWritten(int msecs)
1370{
1371 Q_D(QSslSocket);
1372 if (!d->plainSocket)
1373 return false;
1374 if (d->mode == UnencryptedMode)
1375 return d->plainSocket->waitForBytesWritten(msecs);
1376
1377 QElapsedTimer stopWatch;
1378 stopWatch.start();
1379
1380 if (!d->connectionEncrypted) {
1381 // Wait until we've entered encrypted mode, or until a failure occurs.
1382 if (!waitForEncrypted(msecs))
1383 return false;
1384 }
1385 if (!d->writeBuffer.isEmpty()) {
1386 // empty our cleartext write buffer first
1387 d->transmit();
1388 }
1389
1390 return d->plainSocket->waitForBytesWritten(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
1391}
1392
1393/*!
1394 Waits until the socket has disconnected or \a msecs milliseconds,
1395 whichever comes first. If the connection has been disconnected,
1396 this function returns \c true; otherwise it returns \c false.
1397
1398 \sa QAbstractSocket::waitForDisconnected()
1399*/
1400bool QSslSocket::waitForDisconnected(int msecs)
1401{
1402 Q_D(QSslSocket);
1403
1404 // require calling connectToHost() before waitForDisconnected()
1405 if (state() == UnconnectedState) {
1406 qCWarning(lcSsl, "QSslSocket::waitForDisconnected() is not allowed in UnconnectedState");
1407 return false;
1408 }
1409
1410 if (!d->plainSocket)
1411 return false;
1412 // Forward to the plain socket unless the connection is secure.
1413 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1414 return d->plainSocket->waitForDisconnected(msecs);
1415
1416 QElapsedTimer stopWatch;
1417 stopWatch.start();
1418
1419 if (!d->connectionEncrypted) {
1420 // Wait until we've entered encrypted mode, or until a failure occurs.
1421 if (!waitForEncrypted(msecs))
1422 return false;
1423 }
1424 // We are delaying the disconnect, if the write buffer is not empty.
1425 // So, start the transmission.
1426 if (!d->writeBuffer.isEmpty())
1427 d->transmit();
1428
1429 // At this point, the socket might be disconnected, if disconnectFromHost()
1430 // was called just after the connectToHostEncrypted() call. Also, we can
1431 // lose the connection as a result of the transmit() call.
1432 if (state() == UnconnectedState)
1433 return true;
1434
1435 bool retVal = d->plainSocket->waitForDisconnected(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
1436 if (!retVal) {
1437 setSocketState(d->plainSocket->state());
1438 d->setError(d->plainSocket->error(), d->plainSocket->errorString());
1439 }
1440 return retVal;
1441}
1442
1443/*!
1444 \since 5.15
1445
1446 Returns a list of the last SSL errors that occurred. This is the
1447 same list as QSslSocket passes via the sslErrors() signal. If the
1448 connection has been encrypted with no errors, this function will
1449 return an empty list.
1450
1451 \sa connectToHostEncrypted()
1452*/
1453QList<QSslError> QSslSocket::sslHandshakeErrors() const
1454{
1455 Q_D(const QSslSocket);
1456 if (const auto *backend = d->backend.get())
1457 return backend->tlsErrors();
1458 return {};
1459}
1460
1461/*!
1462 Returns \c true if this platform supports SSL; otherwise, returns
1463 false. If the platform doesn't support SSL, the socket will fail
1464 in the connection phase.
1465*/
1466bool QSslSocket::supportsSsl()
1467{
1468 return QSslSocketPrivate::supportsSsl();
1469}
1470
1471/*!
1472 \since 5.0
1473 Returns the version number of the SSL library in use. Note that
1474 this is the version of the library in use at run-time not compile
1475 time. If no SSL support is available then this will return -1.
1476*/
1477long QSslSocket::sslLibraryVersionNumber()
1478{
1479 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1480 return tlsBackend->tlsLibraryVersionNumber();
1481
1482 return -1;
1483}
1484
1485/*!
1486 \since 5.0
1487 Returns the version string of the SSL library in use. Note that
1488 this is the version of the library in use at run-time not compile
1489 time. If no SSL support is available then this will return an empty value.
1490*/
1491QString QSslSocket::sslLibraryVersionString()
1492{
1493 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1494 return tlsBackend->tlsLibraryVersionString();
1495 return {};
1496}
1497
1498/*!
1499 \since 5.4
1500 Returns the version number of the SSL library in use at compile
1501 time. If no SSL support is available then this will return -1.
1502
1503 \sa sslLibraryVersionNumber()
1504*/
1505long QSslSocket::sslLibraryBuildVersionNumber()
1506{
1507 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1508 return tlsBackend->tlsLibraryBuildVersionNumber();
1509 return -1;
1510}
1511
1512/*!
1513 \since 5.4
1514 Returns the version string of the SSL library in use at compile
1515 time. If no SSL support is available then this will return an
1516 empty value.
1517
1518 \sa sslLibraryVersionString()
1519*/
1520QString QSslSocket::sslLibraryBuildVersionString()
1521{
1522 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1523 return tlsBackend->tlsLibraryBuildVersionString();
1524
1525 return {};
1526}
1527
1528/*!
1529 \since 6.1
1530 Returns the names of the currently available backends. These names
1531 are in lower case, e.g. "openssl", "securetransport", "schannel"
1532 (similar to the already existing feature names for TLS backends in Qt).
1533
1534 \sa activeBackend()
1535*/
1536QList<QString> QSslSocket::availableBackends()
1537{
1538 return QTlsBackend::availableBackendNames();
1539}
1540
1541/*!
1542 \since 6.1
1543 Returns the name of the backend that QSslSocket and related classes
1544 use. If the active backend was not set explicitly, this function
1545 returns the name of a default backend that QSslSocket selects implicitly
1546 from the list of available backends.
1547
1548 \note When selecting a default backend implicitly, QSslSocket prefers
1549 the OpenSSL backend if available. If it's not available, the Schannel backend
1550 is implicitly selected on Windows, and Secure Transport on Darwin platforms.
1551 Failing these, if a custom TLS backend is found, it is used.
1552 If no other backend is found, the "certificate only" backend is selected.
1553 For more information about TLS plugins, please see
1554 \l {Enabling and Disabling SSL Support when Building Qt from Source}.
1555
1556 \sa setActiveBackend(), availableBackends()
1557*/
1558QString QSslSocket::activeBackend()
1559{
1560 const QMutexLocker locker(&QSslSocketPrivate::backendMutex);
1561
1562 if (!QSslSocketPrivate::activeBackendName.size())
1563 QSslSocketPrivate::activeBackendName = QTlsBackend::defaultBackendName();
1564
1565 return QSslSocketPrivate::activeBackendName;
1566}
1567
1568/*!
1569 \since 6.1
1570 Returns true if a backend with name \a backendName was set as
1571 active backend. \a backendName must be one of names returned
1572 by availableBackends().
1573
1574 \note An application cannot mix different backends simultaneously.
1575 This implies that a non-default backend must be selected prior
1576 to any use of QSslSocket or related classes, e.g. QSslCertificate
1577 or QSslKey.
1578
1579 \sa activeBackend(), availableBackends()
1580*/
1581bool QSslSocket::setActiveBackend(const QString &backendName)
1582{
1583 if (!backendName.size()) {
1584 qCWarning(lcSsl, "Invalid parameter (backend name cannot be an empty string)");
1585 return false;
1586 }
1587
1588 QMutexLocker locker(&QSslSocketPrivate::backendMutex);
1589 if (QSslSocketPrivate::tlsBackend) {
1590 qCWarning(lcSsl) << "Cannot set backend named" << backendName
1591 << "as active, another backend is already in use";
1592 locker.unlock();
1593 return activeBackend() == backendName;
1594 }
1595
1596 if (!QTlsBackend::availableBackendNames().contains(backendName)) {
1597 qCWarning(lcSsl) << "Cannot set unavailable backend named" << backendName
1598 << "as active";
1599 return false;
1600 }
1601
1602 QSslSocketPrivate::activeBackendName = backendName;
1603
1604 return true;
1605}
1606
1607/*!
1608 \since 6.1
1609 If a backend with name \a backendName is available, this function returns the
1610 list of TLS protocol versions supported by this backend. An empty \a backendName
1611 is understood as a query about the currently active backend. Otherwise, this
1612 function returns an empty list.
1613
1614 \sa availableBackends(), activeBackend(), isProtocolSupported()
1615*/
1616QList<QSsl::SslProtocol> QSslSocket::supportedProtocols(const QString &backendName)
1617{
1618 return QTlsBackend::supportedProtocols(backendName.size() ? backendName : activeBackend());
1619}
1620
1621/*!
1622 \since 6.1
1623 Returns true if \a protocol is supported by a backend named \a backendName. An empty
1624 \a backendName is understood as a query about the currently active backend.
1625
1626 \sa supportedProtocols()
1627*/
1628bool QSslSocket::isProtocolSupported(QSsl::SslProtocol protocol, const QString &backendName)
1629{
1630 const auto versions = supportedProtocols(backendName);
1631 return versions.contains(protocol);
1632}
1633
1634/*!
1635 \since 6.1
1636 This function returns backend-specific classes implemented by the backend named
1637 \a backendName. An empty \a backendName is understood as a query about the
1638 currently active backend.
1639
1640 \sa QSsl::ImplementedClass, activeBackend(), isClassImplemented()
1641*/
1642QList<QSsl::ImplementedClass> QSslSocket::implementedClasses(const QString &backendName)
1643{
1644 return QTlsBackend::implementedClasses(backendName.size() ? backendName : activeBackend());
1645}
1646
1647/*!
1648 \since 6.1
1649 Returns true if a class \a cl is implemented by the backend named \a backendName. An empty
1650 \a backendName is understood as a query about the currently active backend.
1651
1652 \sa implementedClasses()
1653*/
1654
1655bool QSslSocket::isClassImplemented(QSsl::ImplementedClass cl, const QString &backendName)
1656{
1657 return implementedClasses(backendName).contains(cl);
1658}
1659
1660/*!
1661 \since 6.1
1662 This function returns features supported by a backend named \a backendName.
1663 An empty \a backendName is understood as a query about the currently active backend.
1664
1665 \sa QSsl::SupportedFeature, activeBackend()
1666*/
1667QList<QSsl::SupportedFeature> QSslSocket::supportedFeatures(const QString &backendName)
1668{
1669 return QTlsBackend::supportedFeatures(backendName.size() ? backendName : activeBackend());
1670}
1671
1672/*!
1673 \since 6.1
1674 Returns true if a feature \a ft is supported by a backend named \a backendName. An empty
1675 \a backendName is understood as a query about the currently active backend.
1676
1677 \sa QSsl::SupportedFeature, supportedFeatures()
1678*/
1679bool QSslSocket::isFeatureSupported(QSsl::SupportedFeature ft, const QString &backendName)
1680{
1681 return supportedFeatures(backendName).contains(ft);
1682}
1683
1684/*!
1685 Starts a delayed SSL handshake for a client connection. This
1686 function can be called when the socket is in the \l ConnectedState
1687 but still in the \l UnencryptedMode. If it is not yet connected,
1688 or if it is already encrypted, this function has no effect.
1689
1690 Clients that implement STARTTLS functionality often make use of
1691 delayed SSL handshakes. Most other clients can avoid calling this
1692 function directly by using connectToHostEncrypted() instead, which
1693 automatically performs the handshake.
1694
1695 \sa connectToHostEncrypted(), startServerEncryption()
1696*/
1697void QSslSocket::startClientEncryption()
1698{
1699 Q_D(QSslSocket);
1700 if (d->mode != UnencryptedMode) {
1701 qCWarning(lcSsl,
1702 "QSslSocket::startClientEncryption: cannot start handshake on non-plain connection");
1703 return;
1704 }
1705 if (state() != ConnectedState) {
1706 qCWarning(lcSsl,
1707 "QSslSocket::startClientEncryption: cannot start handshake when not connected");
1708 return;
1709 }
1710
1711 if (!supportsSsl()) {
1712 qCWarning(lcSsl, "QSslSocket::startClientEncryption: TLS initialization failed");
1713 d->setErrorAndEmit(QAbstractSocket::SslInternalError, tr("TLS initialization failed"));
1714 return;
1715 }
1716
1717 if (!d->verifyProtocolSupported("QSslSocket::startClientEncryption:"))
1718 return;
1719
1720#ifdef QSSLSOCKET_DEBUG
1721 qCDebug(lcSsl) << "QSslSocket::startClientEncryption()";
1722#endif
1723 d->mode = SslClientMode;
1724 emit modeChanged(d->mode);
1725 d->startClientEncryption();
1726}
1727
1728/*!
1729 Starts a delayed SSL handshake for a server connection. This
1730 function can be called when the socket is in the \l ConnectedState
1731 but still in \l UnencryptedMode. If it is not connected or it is
1732 already encrypted, the function has no effect.
1733
1734 For server sockets, calling this function is the only way to
1735 initiate the SSL handshake. Most servers will call this function
1736 immediately upon receiving a connection, or as a result of having
1737 received a protocol-specific command to enter SSL mode (e.g, the
1738 server may respond to receiving the string "STARTTLS\\r\\n" by
1739 calling this function).
1740
1741 The most common way to implement an SSL server is to create a
1742 subclass of QTcpServer and reimplement
1743 QTcpServer::incomingConnection(). The returned socket descriptor
1744 is then passed to QSslSocket::setSocketDescriptor().
1745
1746 \sa connectToHostEncrypted(), startClientEncryption()
1747*/
1748void QSslSocket::startServerEncryption()
1749{
1750 Q_D(QSslSocket);
1751 if (d->mode != UnencryptedMode) {
1752 qCWarning(lcSsl, "QSslSocket::startServerEncryption: cannot start handshake on non-plain connection");
1753 return;
1754 }
1755#ifdef QSSLSOCKET_DEBUG
1756 qCDebug(lcSsl) << "QSslSocket::startServerEncryption()";
1757#endif
1758 if (!supportsSsl()) {
1759 qCWarning(lcSsl, "QSslSocket::startServerEncryption: TLS initialization failed");
1760 d->setErrorAndEmit(QAbstractSocket::SslInternalError, tr("TLS initialization failed"));
1761 return;
1762 }
1763 if (!d->verifyProtocolSupported("QSslSocket::startServerEncryption"))
1764 return;
1765
1766 d->mode = SslServerMode;
1767 emit modeChanged(d->mode);
1768 d->startServerEncryption();
1769}
1770
1771/*!
1772 This slot tells QSslSocket to ignore errors during QSslSocket's
1773 handshake phase and continue connecting. If you want to continue
1774 with the connection even if errors occur during the handshake
1775 phase, then you must call this slot, either from a slot connected
1776 to sslErrors(), or before the handshake phase. If you don't call
1777 this slot, either in response to errors or before the handshake,
1778 the connection will be dropped after the sslErrors() signal has
1779 been emitted.
1780
1781 If there are no errors during the SSL handshake phase (i.e., the
1782 identity of the peer is established with no problems), QSslSocket
1783 will not emit the sslErrors() signal, and it is unnecessary to
1784 call this function.
1785
1786 \warning Be sure to always let the user inspect the errors
1787 reported by the sslErrors() signal, and only call this method
1788 upon confirmation from the user that proceeding is ok.
1789 If there are unexpected errors, the connection should be aborted.
1790 Calling this method without inspecting the actual errors will
1791 most likely pose a security risk for your application. Use it
1792 with great care!
1793
1794 \sa sslErrors()
1795*/
1796void QSslSocket::ignoreSslErrors()
1797{
1798 Q_D(QSslSocket);
1799 d->ignoreAllSslErrors = true;
1800}
1801
1802/*!
1803 \overload
1804 \since 4.6
1805
1806 This method tells QSslSocket to ignore only the errors given in \a
1807 errors.
1808
1809 \note Because most SSL errors are associated with a certificate, for most
1810 of them you must set the expected certificate this SSL error is related to.
1811 If, for instance, you want to connect to a server that uses
1812 a self-signed certificate, consider the following snippet:
1813
1814 \snippet code/src_network_ssl_qsslsocket.cpp 6
1815
1816 Multiple calls to this function will replace the list of errors that
1817 were passed in previous calls.
1818 You can clear the list of errors you want to ignore by calling this
1819 function with an empty list.
1820
1821 \sa sslErrors(), sslHandshakeErrors()
1822*/
1823void QSslSocket::ignoreSslErrors(const QList<QSslError> &errors)
1824{
1825 Q_D(QSslSocket);
1826 d->ignoreErrorsList = errors;
1827}
1828
1829
1830/*!
1831 \since 6.0
1832
1833 If an application wants to conclude a handshake even after receiving
1834 handshakeInterruptedOnError() signal, it must call this function.
1835 This call must be done from a slot function attached to the signal.
1836 The signal-slot connection must be direct.
1837
1838 \sa handshakeInterruptedOnError(), QSslConfiguration::setHandshakeMustInterruptOnError()
1839*/
1840void QSslSocket::continueInterruptedHandshake()
1841{
1842 Q_D(QSslSocket);
1843 if (auto *backend = d->backend.get())
1844 backend->enableHandshakeContinuation();
1845}
1846
1847/*!
1848 \reimp
1849*/
1850void QSslSocket::connectToHost(const QString &hostName, quint16 port, OpenMode openMode, NetworkLayerProtocol protocol)
1851{
1852 Q_D(QSslSocket);
1853 d->preferredNetworkLayerProtocol = protocol;
1854 if (!d->initialized)
1855 d->init();
1856 d->initialized = false;
1857
1858#ifdef QSSLSOCKET_DEBUG
1859 qCDebug(lcSsl) << "QSslSocket::connectToHost("
1860 << hostName << ',' << port << ',' << openMode << ')';
1861#endif
1862 if (!d->plainSocket) {
1863#ifdef QSSLSOCKET_DEBUG
1864 qCDebug(lcSsl) << "\tcreating internal plain socket";
1865#endif
1866 d->createPlainSocket(openMode);
1867 }
1868#ifndef QT_NO_NETWORKPROXY
1869 d->plainSocket->setProtocolTag(d->protocolTag);
1870 d->plainSocket->setProxy(proxy());
1871#endif
1872 QIODevice::open(openMode);
1873 d->readChannelCount = d->writeChannelCount = 0;
1874 d->plainSocket->connectToHost(hostName, port, openMode, d->preferredNetworkLayerProtocol);
1875 d->cachedSocketDescriptor = d->plainSocket->socketDescriptor();
1876}
1877
1878/*!
1879 \reimp
1880*/
1881void QSslSocket::disconnectFromHost()
1882{
1883 Q_D(QSslSocket);
1884#ifdef QSSLSOCKET_DEBUG
1885 qCDebug(lcSsl) << "QSslSocket::disconnectFromHost()";
1886#endif
1887 if (!d->plainSocket)
1888 return;
1889 if (d->state == UnconnectedState)
1890 return;
1891 if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
1892 d->plainSocket->disconnectFromHost();
1893 return;
1894 }
1895 if (d->state <= ConnectingState) {
1896 d->pendingClose = true;
1897 return;
1898 }
1899 // Make sure we don't process any signal from the CA fetcher
1900 // (Windows):
1901 if (auto *backend = d->backend.get())
1902 backend->cancelCAFetch();
1903
1904 // Perhaps emit closing()
1905 if (d->state != ClosingState) {
1906 d->state = ClosingState;
1907 emit stateChanged(d->state);
1908 }
1909
1910 if (!d->writeBuffer.isEmpty()) {
1911 d->pendingClose = true;
1912 return;
1913 }
1914
1915 if (d->mode == UnencryptedMode) {
1916 d->plainSocket->disconnectFromHost();
1917 } else {
1918 d->disconnectFromHost();
1919 }
1920}
1921
1922/*!
1923 \reimp
1924*/
1925qint64 QSslSocket::readData(char *data, qint64 maxlen)
1926{
1927 Q_D(QSslSocket);
1928 qint64 readBytes = 0;
1929
1930 if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
1931 readBytes = d->plainSocket->read(data, maxlen);
1932#ifdef QSSLSOCKET_DEBUG
1933 qCDebug(lcSsl) << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") =="
1934 << readBytes;
1935#endif
1936 } else {
1937 // possibly trigger another transmit() to decrypt more data from the socket
1938 if (d->plainSocket->bytesAvailable() || d->hasUndecryptedData())
1939 QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
1940 else if (d->state != QAbstractSocket::ConnectedState)
1941 return maxlen ? qint64(-1) : qint64(0);
1942 }
1943
1944 return readBytes;
1945}
1946
1947/*!
1948 \reimp
1949*/
1950qint64 QSslSocket::writeData(const char *data, qint64 len)
1951{
1952 Q_D(QSslSocket);
1953#ifdef QSSLSOCKET_DEBUG
1954 qCDebug(lcSsl) << "QSslSocket::writeData(" << (void *)data << ',' << len << ')';
1955#endif
1956 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1957 return d->plainSocket->write(data, len);
1958
1959 d->write(data, len);
1960
1961 // make sure we flush to the plain socket's buffer
1962 if (!d->flushTriggered) {
1963 d->flushTriggered = true;
1964 QMetaObject::invokeMethod(this, "_q_flushWriteBuffer", Qt::QueuedConnection);
1965 }
1966
1967 return len;
1968}
1969
1970bool QSslSocketPrivate::s_loadRootCertsOnDemand = false;
1971
1972/*!
1973 \internal
1974*/
1975QSslSocketPrivate::QSslSocketPrivate()
1976 : initialized(false)
1977 , mode(QSslSocket::UnencryptedMode)
1978 , autoStartHandshake(false)
1979 , connectionEncrypted(false)
1980 , ignoreAllSslErrors(false)
1981 , readyReadEmittedPointer(nullptr)
1982 , allowRootCertOnDemandLoading(true)
1983 , plainSocket(nullptr)
1984 , paused(false)
1985 , flushTriggered(false)
1986{
1987 QSslConfigurationPrivate::deepCopyDefaultConfiguration(&configuration);
1988 // If the global configuration doesn't allow root certificates to be loaded
1989 // on demand then we have to disable it for this socket as well.
1990 if (!configuration.allowRootCertOnDemandLoading)
1991 allowRootCertOnDemandLoading = false;
1992
1993 const auto *tlsBackend = tlsBackendInUse();
1994 if (!tlsBackend) {
1995 qCWarning(lcSsl, "No TLS backend is available");
1996 return;
1997 }
1998 backend.reset(tlsBackend->createTlsCryptograph());
1999 if (!backend.get()) {
2000 qCWarning(lcSsl) << "The backend named" << tlsBackend->backendName()
2001 << "does not support TLS";
2002 }
2003}
2004
2005/*!
2006 \internal
2007*/
2008QSslSocketPrivate::~QSslSocketPrivate()
2009{
2010}
2011
2012/*!
2013 \internal
2014*/
2015bool QSslSocketPrivate::supportsSsl()
2016{
2017 if (const auto *tlsBackend = tlsBackendInUse())
2018 return tlsBackend->implementedClasses().contains(QSsl::ImplementedClass::Socket);
2019 return false;
2020}
2021
2022/*!
2023 \internal
2024
2025 Declared static in QSslSocketPrivate, makes sure the SSL libraries have
2026 been initialized.
2027*/
2028void QSslSocketPrivate::ensureInitialized()
2029{
2030 if (!supportsSsl())
2031 return;
2032
2033 const auto *tlsBackend = tlsBackendInUse();
2034 Q_ASSERT(tlsBackend);
2035 tlsBackend->ensureInitialized();
2036}
2037
2038/*!
2039 \internal
2040*/
2041void QSslSocketPrivate::init()
2042{
2043 // TLSTODO: delete those data members.
2044 mode = QSslSocket::UnencryptedMode;
2045 autoStartHandshake = false;
2046 connectionEncrypted = false;
2047 ignoreAllSslErrors = false;
2048 abortCalled = false;
2049 pendingClose = false;
2050 flushTriggered = false;
2051 // We don't want to clear the ignoreErrorsList, so
2052 // that it is possible setting it before connecting.
2053
2054 buffer.clear();
2055 writeBuffer.clear();
2056 configuration.peerCertificate.clear();
2057 configuration.peerCertificateChain.clear();
2058
2059 if (backend.get()) {
2060 Q_ASSERT(q_ptr);
2061 backend->init(static_cast<QSslSocket *>(q_ptr), this);
2062 }
2063}
2064
2065/*!
2066 \internal
2067*/
2068bool QSslSocketPrivate::verifyProtocolSupported(const char *where)
2069{
2070 auto protocolName = "DTLS"_L1;
2071 switch (configuration.protocol) {
2072 case QSsl::UnknownProtocol:
2073 // UnknownProtocol, according to our docs, is for cipher whose protocol is unknown.
2074 // Should not be used when configuring QSslSocket.
2075 protocolName = "UnknownProtocol"_L1;
2076 Q_FALLTHROUGH();
2077QT_WARNING_PUSH
2078QT_WARNING_DISABLE_DEPRECATED
2079 case QSsl::DtlsV1_0:
2080 case QSsl::DtlsV1_2:
2081 case QSsl::DtlsV1_0OrLater:
2082 case QSsl::DtlsV1_2OrLater:
2083 qCWarning(lcSsl) << where << "QSslConfiguration with unexpected protocol" << protocolName;
2084 setErrorAndEmit(QAbstractSocket::SslInvalidUserDataError,
2085 QSslSocket::tr("Attempted to use an unsupported protocol."));
2086 return false;
2087QT_WARNING_POP
2088 default:
2089 return true;
2090 }
2091}
2092
2093/*!
2094 \internal
2095*/
2096QList<QSslCipher> QSslSocketPrivate::defaultCiphers()
2097{
2098 QSslSocketPrivate::ensureInitialized();
2099 QMutexLocker locker(&globalData()->mutex);
2100 return globalData()->config->ciphers;
2101}
2102
2103/*!
2104 \internal
2105*/
2106QList<QSslCipher> QSslSocketPrivate::supportedCiphers()
2107{
2108 QSslSocketPrivate::ensureInitialized();
2109 QMutexLocker locker(&globalData()->mutex);
2110 return globalData()->supportedCiphers;
2111}
2112
2113/*!
2114 \internal
2115*/
2116void QSslSocketPrivate::setDefaultCiphers(const QList<QSslCipher> &ciphers)
2117{
2118 QMutexLocker locker(&globalData()->mutex);
2119 globalData()->config.detach();
2120 globalData()->config->ciphers = ciphers;
2121}
2122
2123/*!
2124 \internal
2125*/
2126void QSslSocketPrivate::setDefaultSupportedCiphers(const QList<QSslCipher> &ciphers)
2127{
2128 QMutexLocker locker(&globalData()->mutex);
2129 globalData()->config.detach();
2130 globalData()->supportedCiphers = ciphers;
2131}
2132
2133/*!
2134 \internal
2135*/
2136void QSslSocketPrivate::resetDefaultEllipticCurves()
2137{
2138 const auto *tlsBackend = tlsBackendInUse();
2139 if (!tlsBackend)
2140 return;
2141
2142 auto ids = tlsBackend->ellipticCurvesIds();
2143 if (!ids.size())
2144 return;
2145
2146 QList<QSslEllipticCurve> curves;
2147 curves.reserve(ids.size());
2148 for (int id : ids) {
2149 QSslEllipticCurve curve;
2150 curve.id = id;
2151 curves.append(curve);
2152 }
2153
2154 // Set the list of supported ECs, but not the list
2155 // of *default* ECs. OpenSSL doesn't like forcing an EC for the wrong
2156 // ciphersuite, so don't try it -- leave the empty list to mean
2157 // "the implementation will choose the most suitable one".
2158 setDefaultSupportedEllipticCurves(curves);
2159}
2160
2161/*!
2162 \internal
2163*/
2164void QSslSocketPrivate::setDefaultDtlsCiphers(const QList<QSslCipher> &ciphers)
2165{
2166 QMutexLocker locker(&globalData()->mutex);
2167 globalData()->dtlsConfig.detach();
2168 globalData()->dtlsConfig->ciphers = ciphers;
2169}
2170
2171/*!
2172 \internal
2173*/
2174QList<QSslCipher> QSslSocketPrivate::defaultDtlsCiphers()
2175{
2176 QSslSocketPrivate::ensureInitialized();
2177 QMutexLocker locker(&globalData()->mutex);
2178 return globalData()->dtlsConfig->ciphers;
2179}
2180
2181/*!
2182 \internal
2183*/
2184QList<QSslEllipticCurve> QSslSocketPrivate::supportedEllipticCurves()
2185{
2186 QSslSocketPrivate::ensureInitialized();
2187 const QMutexLocker locker(&globalData()->mutex);
2188 return globalData()->supportedEllipticCurves;
2189}
2190
2191/*!
2192 \internal
2193*/
2194void QSslSocketPrivate::setDefaultSupportedEllipticCurves(const QList<QSslEllipticCurve> &curves)
2195{
2196 const QMutexLocker locker(&globalData()->mutex);
2197 globalData()->config.detach();
2198 globalData()->dtlsConfig.detach();
2199 globalData()->supportedEllipticCurves = curves;
2200}
2201
2202/*!
2203 \internal
2204*/
2205QList<QSslCertificate> QSslSocketPrivate::defaultCaCertificates()
2206{
2207 QSslSocketPrivate::ensureInitialized();
2208 QMutexLocker locker(&globalData()->mutex);
2209 return globalData()->config->caCertificates;
2210}
2211
2212/*!
2213 \internal
2214*/
2215void QSslSocketPrivate::setDefaultCaCertificates(const QList<QSslCertificate> &certs)
2216{
2217 QSslSocketPrivate::ensureInitialized();
2218 QMutexLocker locker(&globalData()->mutex);
2219 globalData()->config.detach();
2220 globalData()->config->caCertificates = certs;
2221 globalData()->dtlsConfig.detach();
2222 globalData()->dtlsConfig->caCertificates = certs;
2223 // when the certificates are set explicitly, we do not want to
2224 // load the system certificates on demand
2225 s_loadRootCertsOnDemand = false;
2226}
2227
2228/*!
2229 \internal
2230*/
2231void QSslSocketPrivate::addDefaultCaCertificate(const QSslCertificate &cert)
2232{
2233 QSslSocketPrivate::ensureInitialized();
2234 QMutexLocker locker(&globalData()->mutex);
2235 if (globalData()->config->caCertificates.contains(cert))
2236 return;
2237 globalData()->config.detach();
2238 globalData()->config->caCertificates += cert;
2239 globalData()->dtlsConfig.detach();
2240 globalData()->dtlsConfig->caCertificates += cert;
2241}
2242
2243/*!
2244 \internal
2245*/
2246void QSslSocketPrivate::addDefaultCaCertificates(const QList<QSslCertificate> &certs)
2247{
2248 QSslSocketPrivate::ensureInitialized();
2249 QMutexLocker locker(&globalData()->mutex);
2250 globalData()->config.detach();
2251 globalData()->config->caCertificates += certs;
2252 globalData()->dtlsConfig.detach();
2253 globalData()->dtlsConfig->caCertificates += certs;
2254}
2255
2256/*!
2257 \internal
2258*/
2259QSslConfiguration QSslConfigurationPrivate::defaultConfiguration()
2260{
2261 QSslSocketPrivate::ensureInitialized();
2262 QMutexLocker locker(&globalData()->mutex);
2263 return QSslConfiguration(globalData()->config.data());
2264}
2265
2266/*!
2267 \internal
2268*/
2269void QSslConfigurationPrivate::setDefaultConfiguration(const QSslConfiguration &configuration)
2270{
2271 QSslSocketPrivate::ensureInitialized();
2272 QMutexLocker locker(&globalData()->mutex);
2273 if (globalData()->config == configuration.d)
2274 return; // nothing to do
2275
2276 globalData()->config = const_cast<QSslConfigurationPrivate*>(configuration.d.constData());
2277}
2278
2279/*!
2280 \internal
2281*/
2282void QSslConfigurationPrivate::deepCopyDefaultConfiguration(QSslConfigurationPrivate *ptr)
2283{
2284 QSslSocketPrivate::ensureInitialized();
2285 QMutexLocker locker(&globalData()->mutex);
2286 const QSslConfigurationPrivate *global = globalData()->config.constData();
2287
2288 if (!global)
2289 return;
2290
2291 ptr->ref.storeRelaxed(1);
2292 ptr->peerCertificate = global->peerCertificate;
2293 ptr->peerCertificateChain = global->peerCertificateChain;
2294 ptr->localCertificateChain = global->localCertificateChain;
2295 ptr->privateKey = global->privateKey;
2296 ptr->sessionCipher = global->sessionCipher;
2297 ptr->sessionProtocol = global->sessionProtocol;
2298 ptr->ciphers = global->ciphers;
2299 ptr->caCertificates = global->caCertificates;
2300 ptr->allowRootCertOnDemandLoading = global->allowRootCertOnDemandLoading;
2301 ptr->protocol = global->protocol;
2302 ptr->peerVerifyMode = global->peerVerifyMode;
2303 ptr->peerVerifyDepth = global->peerVerifyDepth;
2304 ptr->sslOptions = global->sslOptions;
2305 ptr->ellipticCurves = global->ellipticCurves;
2306 ptr->backendConfig = global->backendConfig;
2307#if QT_CONFIG(dtls)
2308 ptr->dtlsCookieEnabled = global->dtlsCookieEnabled;
2309#endif
2310#if QT_CONFIG(ocsp)
2311 ptr->ocspStaplingEnabled = global->ocspStaplingEnabled;
2312#endif
2313#if QT_CONFIG(openssl)
2314 ptr->reportFromCallback = global->reportFromCallback;
2315 ptr->missingCertIsFatal = global->missingCertIsFatal;
2316#endif
2317}
2318
2319/*!
2320 \internal
2321*/
2322QSslConfiguration QSslConfigurationPrivate::defaultDtlsConfiguration()
2323{
2324 QSslSocketPrivate::ensureInitialized();
2325 QMutexLocker locker(&globalData()->mutex);
2326
2327 return QSslConfiguration(globalData()->dtlsConfig.data());
2328}
2329
2330/*!
2331 \internal
2332*/
2333void QSslConfigurationPrivate::setDefaultDtlsConfiguration(const QSslConfiguration &configuration)
2334{
2335 QSslSocketPrivate::ensureInitialized();
2336 QMutexLocker locker(&globalData()->mutex);
2337 if (globalData()->dtlsConfig == configuration.d)
2338 return; // nothing to do
2339
2340 globalData()->dtlsConfig = const_cast<QSslConfigurationPrivate*>(configuration.d.constData());
2341}
2342
2343/*!
2344 \internal
2345*/
2346void QSslSocketPrivate::createPlainSocket(QIODevice::OpenMode openMode)
2347{
2348 Q_Q(QSslSocket);
2349 q->setOpenMode(openMode); // <- from QIODevice
2350 q->setSocketState(QAbstractSocket::UnconnectedState);
2351 q->setSocketError(QAbstractSocket::UnknownSocketError);
2352 q->setLocalPort(0);
2353 q->setLocalAddress(QHostAddress());
2354 q->setPeerPort(0);
2355 q->setPeerAddress(QHostAddress());
2356 q->setPeerName(QString());
2357
2358 plainSocket = new QTcpSocket(q);
2359 q->connect(plainSocket, SIGNAL(connected()),
2360 q, SLOT(_q_connectedSlot()),
2361 Qt::DirectConnection);
2362 q->connect(plainSocket, SIGNAL(hostFound()),
2363 q, SLOT(_q_hostFoundSlot()),
2364 Qt::DirectConnection);
2365 q->connect(plainSocket, SIGNAL(disconnected()),
2366 q, SLOT(_q_disconnectedSlot()),
2367 Qt::DirectConnection);
2368 q->connect(plainSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
2369 q, SLOT(_q_stateChangedSlot(QAbstractSocket::SocketState)),
2370 Qt::DirectConnection);
2371 q->connect(plainSocket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)),
2372 q, SLOT(_q_errorSlot(QAbstractSocket::SocketError)),
2373 Qt::DirectConnection);
2374 q->connect(plainSocket, SIGNAL(readyRead()),
2375 q, SLOT(_q_readyReadSlot()),
2376 Qt::DirectConnection);
2377 q->connect(plainSocket, SIGNAL(channelReadyRead(int)),
2378 q, SLOT(_q_channelReadyReadSlot(int)),
2379 Qt::DirectConnection);
2380 q->connect(plainSocket, SIGNAL(bytesWritten(qint64)),
2381 q, SLOT(_q_bytesWrittenSlot(qint64)),
2382 Qt::DirectConnection);
2383 q->connect(plainSocket, SIGNAL(channelBytesWritten(int,qint64)),
2384 q, SLOT(_q_channelBytesWrittenSlot(int,qint64)),
2385 Qt::DirectConnection);
2386 q->connect(plainSocket, SIGNAL(readChannelFinished()),
2387 q, SLOT(_q_readChannelFinishedSlot()),
2388 Qt::DirectConnection);
2389#ifndef QT_NO_NETWORKPROXY
2390 q->connect(plainSocket, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
2391 q, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
2392#endif
2393
2394 buffer.clear();
2395 writeBuffer.clear();
2396 connectionEncrypted = false;
2397 configuration.peerCertificate.clear();
2398 configuration.peerCertificateChain.clear();
2399 mode = QSslSocket::UnencryptedMode;
2400 q->setReadBufferSize(readBufferMaxSize);
2401}
2402
2403void QSslSocketPrivate::pauseSocketNotifiers(QSslSocket *socket)
2404{
2405 if (!socket->d_func()->plainSocket)
2406 return;
2407 QAbstractSocketPrivate::pauseSocketNotifiers(socket->d_func()->plainSocket);
2408}
2409
2410void QSslSocketPrivate::resumeSocketNotifiers(QSslSocket *socket)
2411{
2412 if (!socket->d_func()->plainSocket)
2413 return;
2414 QAbstractSocketPrivate::resumeSocketNotifiers(socket->d_func()->plainSocket);
2415}
2416
2417bool QSslSocketPrivate::isPaused() const
2418{
2419 return paused;
2420}
2421
2422void QSslSocketPrivate::setPaused(bool p)
2423{
2424 paused = p;
2425}
2426
2427bool QSslSocketPrivate::bind(const QHostAddress &address, quint16 port, QAbstractSocket::BindMode mode,
2428 const QNetworkInterface *iface)
2429{
2430 Q_UNUSED(iface); // only relevant for QUdpSocket for now
2431 // this function is called from QAbstractSocket::bind
2432 if (!initialized)
2433 init();
2434 initialized = false;
2435
2436#ifdef QSSLSOCKET_DEBUG
2437 qCDebug(lcSsl) << "QSslSocket::bind(" << address << ',' << port << ',' << mode << ')';
2438#endif
2439 if (!plainSocket) {
2440#ifdef QSSLSOCKET_DEBUG
2441 qCDebug(lcSsl) << "\tcreating internal plain socket";
2442#endif
2443 createPlainSocket(QIODevice::ReadWrite);
2444 }
2445 bool ret = plainSocket->bind(address, port, mode);
2446 localPort = plainSocket->localPort();
2447 localAddress = plainSocket->localAddress();
2448 cachedSocketDescriptor = plainSocket->socketDescriptor();
2449 readChannelCount = writeChannelCount = 0;
2450 return ret;
2451}
2452
2453/*!
2454 \internal
2455*/
2456void QSslSocketPrivate::_q_connectedSlot()
2457{
2458 Q_Q(QSslSocket);
2459 q->setLocalPort(plainSocket->localPort());
2460 q->setLocalAddress(plainSocket->localAddress());
2461 q->setPeerPort(plainSocket->peerPort());
2462 q->setPeerAddress(plainSocket->peerAddress());
2463 q->setPeerName(plainSocket->peerName());
2464 cachedSocketDescriptor = plainSocket->socketDescriptor();
2465 readChannelCount = plainSocket->readChannelCount();
2466 writeChannelCount = plainSocket->writeChannelCount();
2467
2468#ifdef QSSLSOCKET_DEBUG
2469 qCDebug(lcSsl) << "QSslSocket::_q_connectedSlot()";
2470 qCDebug(lcSsl) << "\tstate =" << q->state();
2471 qCDebug(lcSsl) << "\tpeer =" << q->peerName() << q->peerAddress() << q->peerPort();
2472 qCDebug(lcSsl) << "\tlocal =" << QHostInfo::fromName(q->localAddress().toString()).hostName()
2473 << q->localAddress() << q->localPort();
2474#endif
2475
2476 if (autoStartHandshake)
2477 q->startClientEncryption();
2478
2479 emit q->connected();
2480
2481 if (pendingClose && !autoStartHandshake) {
2482 pendingClose = false;
2483 q->disconnectFromHost();
2484 }
2485}
2486
2487/*!
2488 \internal
2489*/
2490void QSslSocketPrivate::_q_hostFoundSlot()
2491{
2492 Q_Q(QSslSocket);
2493#ifdef QSSLSOCKET_DEBUG
2494 qCDebug(lcSsl) << "QSslSocket::_q_hostFoundSlot()";
2495 qCDebug(lcSsl) << "\tstate =" << q->state();
2496#endif
2497 emit q->hostFound();
2498}
2499
2500/*!
2501 \internal
2502*/
2503void QSslSocketPrivate::_q_disconnectedSlot()
2504{
2505 Q_Q(QSslSocket);
2506#ifdef QSSLSOCKET_DEBUG
2507 qCDebug(lcSsl) << "QSslSocket::_q_disconnectedSlot()";
2508 qCDebug(lcSsl) << "\tstate =" << q->state();
2509#endif
2510 disconnected();
2511 emit q->disconnected();
2512
2513 q->setLocalPort(0);
2514 q->setLocalAddress(QHostAddress());
2515 q->setPeerPort(0);
2516 q->setPeerAddress(QHostAddress());
2517 q->setPeerName(QString());
2518 cachedSocketDescriptor = -1;
2519}
2520
2521/*!
2522 \internal
2523*/
2524void QSslSocketPrivate::_q_stateChangedSlot(QAbstractSocket::SocketState state)
2525{
2526 Q_Q(QSslSocket);
2527#ifdef QSSLSOCKET_DEBUG
2528 qCDebug(lcSsl) << "QSslSocket::_q_stateChangedSlot(" << state << ')';
2529#endif
2530 q->setSocketState(state);
2531 emit q->stateChanged(state);
2532}
2533
2534/*!
2535 \internal
2536*/
2537void QSslSocketPrivate::_q_errorSlot(QAbstractSocket::SocketError error)
2538{
2539 Q_UNUSED(error);
2540#ifdef QSSLSOCKET_DEBUG
2541 Q_Q(QSslSocket);
2542 qCDebug(lcSsl) << "QSslSocket::_q_errorSlot(" << error << ')';
2543 qCDebug(lcSsl) << "\tstate =" << q->state();
2544 qCDebug(lcSsl) << "\terrorString =" << q->errorString();
2545#endif
2546 // this moves encrypted bytes from plain socket into our buffer
2547 if (plainSocket->bytesAvailable() && mode != QSslSocket::UnencryptedMode) {
2548 qint64 tmpReadBufferMaxSize = readBufferMaxSize;
2549 readBufferMaxSize = 0; // reset temporarily so the plain sockets completely drained drained
2550 transmit();
2551 readBufferMaxSize = tmpReadBufferMaxSize;
2552 }
2553
2554 setErrorAndEmit(plainSocket->error(), plainSocket->errorString());
2555}
2556
2557/*!
2558 \internal
2559*/
2560void QSslSocketPrivate::_q_readyReadSlot()
2561{
2562 Q_Q(QSslSocket);
2563#ifdef QSSLSOCKET_DEBUG
2564 qCDebug(lcSsl) << "QSslSocket::_q_readyReadSlot() -" << plainSocket->bytesAvailable() << "bytes available";
2565#endif
2566 if (mode == QSslSocket::UnencryptedMode) {
2567 if (readyReadEmittedPointer)
2568 *readyReadEmittedPointer = true;
2569 emit q->readyRead();
2570 return;
2571 }
2572
2573 transmit();
2574}
2575
2576/*!
2577 \internal
2578*/
2579void QSslSocketPrivate::_q_channelReadyReadSlot(int channel)
2580{
2581 Q_Q(QSslSocket);
2582 if (mode == QSslSocket::UnencryptedMode)
2583 emit q->channelReadyRead(channel);
2584}
2585
2586/*!
2587 \internal
2588*/
2589void QSslSocketPrivate::_q_bytesWrittenSlot(qint64 written)
2590{
2591 Q_Q(QSslSocket);
2592#ifdef QSSLSOCKET_DEBUG
2593 qCDebug(lcSsl) << "QSslSocket::_q_bytesWrittenSlot(" << written << ')';
2594#endif
2595
2596 if (mode == QSslSocket::UnencryptedMode)
2597 emit q->bytesWritten(written);
2598 else
2599 emit q->encryptedBytesWritten(written);
2600 if (state == QAbstractSocket::ClosingState && writeBuffer.isEmpty())
2601 q->disconnectFromHost();
2602}
2603
2604/*!
2605 \internal
2606*/
2607void QSslSocketPrivate::_q_channelBytesWrittenSlot(int channel, qint64 written)
2608{
2609 Q_Q(QSslSocket);
2610 if (mode == QSslSocket::UnencryptedMode)
2611 emit q->channelBytesWritten(channel, written);
2612}
2613
2614/*!
2615 \internal
2616*/
2617void QSslSocketPrivate::_q_readChannelFinishedSlot()
2618{
2619 Q_Q(QSslSocket);
2620 emit q->readChannelFinished();
2621}
2622
2623/*!
2624 \internal
2625*/
2626void QSslSocketPrivate::_q_flushWriteBuffer()
2627{
2628 Q_Q(QSslSocket);
2629
2630 // need to notice if knock-on effects of this flush (e.g. a readReady() via transmit())
2631 // make another necessary, so clear flag before calling:
2632 flushTriggered = false;
2633 if (!writeBuffer.isEmpty())
2634 q->flush();
2635}
2636
2637/*!
2638 \internal
2639*/
2640void QSslSocketPrivate::_q_flushReadBuffer()
2641{
2642 // trigger a read from the plainSocket into SSL
2643 if (mode != QSslSocket::UnencryptedMode)
2644 transmit();
2645}
2646
2647/*!
2648 \internal
2649*/
2650void QSslSocketPrivate::_q_resumeImplementation()
2651{
2652 if (plainSocket)
2653 plainSocket->resume();
2654 paused = false;
2655 if (!connectionEncrypted) {
2656 if (verifyErrorsHaveBeenIgnored()) {
2657 continueHandshake();
2658 } else {
2659 const auto sslErrors = backend->tlsErrors();
2660 Q_ASSERT(!sslErrors.isEmpty());
2661 setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.constFirst().errorString());
2662 plainSocket->disconnectFromHost();
2663 return;
2664 }
2665 }
2666 transmit();
2667}
2668
2669/*!
2670 \internal
2671*/
2672bool QSslSocketPrivate::verifyErrorsHaveBeenIgnored()
2673{
2674 Q_ASSERT(backend.get());
2675
2676 bool doEmitSslError;
2677 if (!ignoreErrorsList.empty()) {
2678 // check whether the errors we got are all in the list of expected errors
2679 // (applies only if the method QSslSocket::ignoreSslErrors(const QList<QSslError> &errors)
2680 // was called)
2681 const auto &sslErrors = backend->tlsErrors();
2682 doEmitSslError = false;
2683 for (int a = 0; a < sslErrors.size(); a++) {
2684 if (!ignoreErrorsList.contains(sslErrors.at(a))) {
2685 doEmitSslError = true;
2686 break;
2687 }
2688 }
2689 } else {
2690 // if QSslSocket::ignoreSslErrors(const QList<QSslError> &errors) was not called and
2691 // we get an SSL error, emit a signal unless we ignored all errors (by calling
2692 // QSslSocket::ignoreSslErrors() )
2693 doEmitSslError = !ignoreAllSslErrors;
2694 }
2695 return !doEmitSslError;
2696}
2697
2698/*!
2699 \internal
2700*/
2701bool QSslSocketPrivate::isAutoStartingHandshake() const
2702{
2703 return autoStartHandshake;
2704}
2705
2706/*!
2707 \internal
2708*/
2709bool QSslSocketPrivate::isPendingClose() const
2710{
2711 return pendingClose;
2712}
2713
2714/*!
2715 \internal
2716*/
2717void QSslSocketPrivate::setPendingClose(bool pc)
2718{
2719 pendingClose = pc;
2720}
2721
2722/*!
2723 \internal
2724*/
2725qint64 QSslSocketPrivate::maxReadBufferSize() const
2726{
2727 return readBufferMaxSize;
2728}
2729
2730/*!
2731 \internal
2732*/
2733void QSslSocketPrivate::setMaxReadBufferSize(qint64 maxSize)
2734{
2735 readBufferMaxSize = maxSize;
2736}
2737
2738/*!
2739 \internal
2740*/
2741void QSslSocketPrivate::setEncrypted(bool enc)
2742{
2743 connectionEncrypted = enc;
2744}
2745
2746/*!
2747 \internal
2748*/
2749QIODevicePrivate::QRingBufferRef &QSslSocketPrivate::tlsWriteBuffer()
2750{
2751 return writeBuffer;
2752}
2753
2754/*!
2755 \internal
2756*/
2757QIODevicePrivate::QRingBufferRef &QSslSocketPrivate::tlsBuffer()
2758{
2759 return buffer;
2760}
2761
2762/*!
2763 \internal
2764*/
2765bool &QSslSocketPrivate::tlsEmittedBytesWritten()
2766{
2767 return emittedBytesWritten;
2768}
2769
2770/*!
2771 \internal
2772*/
2773bool *QSslSocketPrivate::readyReadPointer()
2774{
2775 return readyReadEmittedPointer;
2776}
2777
2778bool QSslSocketPrivate::hasUndecryptedData() const
2779{
2780 return backend.get() && backend->hasUndecryptedData();
2781}
2782
2783/*!
2784 \internal
2785*/
2786qint64 QSslSocketPrivate::peek(char *data, qint64 maxSize)
2787{
2788 if (mode == QSslSocket::UnencryptedMode && !autoStartHandshake) {
2789 //unencrypted mode - do not use QIODevice::peek, as it reads ahead data from the plain socket
2790 //peek at data already in the QIODevice buffer (from a previous read)
2791 qint64 r = buffer.peek(data, maxSize, transactionPos);
2792 if (r == maxSize)
2793 return r;
2794 data += r;
2795 //peek at data in the plain socket
2796 if (plainSocket) {
2797 qint64 r2 = plainSocket->peek(data, maxSize - r);
2798 if (r2 < 0)
2799 return (r > 0 ? r : r2);
2800 return r + r2;
2801 }
2802
2803 return -1;
2804 } else {
2805 //encrypted mode - the socket engine will read and decrypt data into the QIODevice buffer
2806 return QTcpSocketPrivate::peek(data, maxSize);
2807 }
2808}
2809
2810/*!
2811 \internal
2812*/
2813QByteArray QSslSocketPrivate::peek(qint64 maxSize)
2814{
2815 if (mode == QSslSocket::UnencryptedMode && !autoStartHandshake) {
2816 //unencrypted mode - do not use QIODevice::peek, as it reads ahead data from the plain socket
2817 //peek at data already in the QIODevice buffer (from a previous read)
2818 QByteArray ret;
2819 ret.reserve(maxSize);
2820 ret.resize(buffer.peek(ret.data(), maxSize, transactionPos));
2821 if (ret.size() == maxSize)
2822 return ret;
2823 //peek at data in the plain socket
2824 if (plainSocket)
2825 return ret + plainSocket->peek(maxSize - ret.size());
2826
2827 return QByteArray();
2828 } else {
2829 //encrypted mode - the socket engine will read and decrypt data into the QIODevice buffer
2830 return QTcpSocketPrivate::peek(maxSize);
2831 }
2832}
2833
2834/*!
2835 \reimp
2836*/
2837qint64 QSslSocket::skipData(qint64 maxSize)
2838{
2839 Q_D(QSslSocket);
2840
2841 if (d->mode == QSslSocket::UnencryptedMode && !d->autoStartHandshake)
2842 return d->plainSocket->skip(maxSize);
2843
2844 // In encrypted mode, the SSL backend writes decrypted data directly into the
2845 // QIODevice's read buffer. As this buffer is always emptied by the caller,
2846 // we need to wait for more incoming data.
2847 return (d->state == QAbstractSocket::ConnectedState) ? Q_INT64_C(0) : Q_INT64_C(-1);
2848}
2849
2850/*!
2851 \internal
2852*/
2853bool QSslSocketPrivate::flush()
2854{
2855#ifdef QSSLSOCKET_DEBUG
2856 qCDebug(lcSsl) << "QSslSocketPrivate::flush()";
2857#endif
2858 if (mode != QSslSocket::UnencryptedMode) {
2859 // encrypt any unencrypted bytes in our buffer
2860 transmit();
2861 }
2862
2863 return plainSocket && plainSocket->flush();
2864}
2865
2866/*!
2867 \internal
2868*/
2869void QSslSocketPrivate::startClientEncryption()
2870{
2871 if (backend.get())
2872 backend->startClientEncryption();
2873}
2874
2875/*!
2876 \internal
2877*/
2878void QSslSocketPrivate::startServerEncryption()
2879{
2880 if (backend.get())
2881 backend->startServerEncryption();
2882}
2883
2884/*!
2885 \internal
2886*/
2887void QSslSocketPrivate::transmit()
2888{
2889 if (backend.get())
2890 backend->transmit();
2891}
2892
2893/*!
2894 \internal
2895*/
2896void QSslSocketPrivate::disconnectFromHost()
2897{
2898 if (backend.get())
2899 backend->disconnectFromHost();
2900}
2901
2902/*!
2903 \internal
2904*/
2905void QSslSocketPrivate::disconnected()
2906{
2907 if (backend.get())
2908 backend->disconnected();
2909}
2910
2911/*!
2912 \internal
2913*/
2914QSslCipher QSslSocketPrivate::sessionCipher() const
2915{
2916 if (backend.get())
2917 return backend->sessionCipher();
2918
2919 return {};
2920}
2921
2922/*!
2923 \internal
2924*/
2925QSsl::SslProtocol QSslSocketPrivate::sessionProtocol() const
2926{
2927 if (backend.get())
2928 return backend->sessionProtocol();
2929
2930 return QSsl::UnknownProtocol;
2931}
2932
2933/*!
2934 \internal
2935*/
2936void QSslSocketPrivate::continueHandshake()
2937{
2938 if (backend.get())
2939 backend->continueHandshake();
2940}
2941
2942/*!
2943 \internal
2944*/
2945bool QSslSocketPrivate::rootCertOnDemandLoadingSupported()
2946{
2947 return s_loadRootCertsOnDemand;
2948}
2949
2950/*!
2951 \internal
2952*/
2953void QSslSocketPrivate::setRootCertOnDemandLoadingSupported(bool supported)
2954{
2955 s_loadRootCertsOnDemand = supported;
2956}
2957
2958/*!
2959 \internal
2960*/
2961QList<QByteArray> QSslSocketPrivate::unixRootCertDirectories()
2962{
2963 const auto ba = [](const auto &cstr) constexpr {
2964 return QByteArray::fromRawData(std::begin(cstr), std::size(cstr) - 1);
2965 };
2966 static const QByteArray dirs[] = {
2967 ba("/etc/ssl/certs/"), // (K)ubuntu, OpenSUSE, Mandriva ...
2968 ba("/usr/lib/ssl/certs/"), // Gentoo, Mandrake
2969 ba("/usr/share/ssl/"), // Red Hat pre-2004, SuSE
2970 ba("/etc/pki/ca-trust/extracted/pem/directory-hash/"), // Red Hat 2021+
2971 ba("/usr/local/ssl/"), // Normal OpenSSL Tarball
2972 ba("/var/ssl/certs/"), // AIX
2973 ba("/usr/local/ssl/certs/"), // Solaris
2974 ba("/etc/openssl/certs/"), // BlackBerry
2975 ba("/opt/openssl/certs/"), // HP-UX
2976 ba("/etc/ssl/"), // OpenBSD
2977 };
2978 QList<QByteArray> result = QList<QByteArray>::fromReadOnlyData(dirs);
2979 if constexpr (isVxworks) {
2980 static QByteArray vxworksCertsDir = qgetenv("VXWORKS_CERTS_DIR");
2981 if (!vxworksCertsDir.isEmpty())
2982 result.push_back(vxworksCertsDir);
2983 }
2984 return result;
2985}
2986
2987/*!
2988 \internal
2989*/
2990void QSslSocketPrivate::checkSettingSslContext(QSslSocket* socket, std::shared_ptr<QSslContext> tlsContext)
2991{
2992 if (!socket)
2993 return;
2994
2995 if (auto *backend = socket->d_func()->backend.get())
2996 backend->checkSettingSslContext(tlsContext);
2997}
2998
2999/*!
3000 \internal
3001*/
3002std::shared_ptr<QSslContext> QSslSocketPrivate::sslContext(QSslSocket *socket)
3003{
3004 if (!socket)
3005 return {};
3006
3007 if (const auto *backend = socket->d_func()->backend.get())
3008 return backend->sslContext();
3009
3010 return {};
3011}
3012
3013bool QSslSocketPrivate::isMatchingHostname(const QSslCertificate &cert, const QString &peerName)
3014{
3015 QHostAddress hostAddress(peerName);
3016 if (!hostAddress.isNull()) {
3017 const auto subjectAlternativeNames = cert.subjectAlternativeNames();
3018 const auto ipAddresses = subjectAlternativeNames.equal_range(QSsl::AlternativeNameEntryType::IpAddressEntry);
3019
3020 for (auto it = ipAddresses.first; it != ipAddresses.second; it++) {
3021 if (QHostAddress(*it).isEqual(hostAddress, QHostAddress::StrictConversion))
3022 return true;
3023 }
3024 }
3025
3026 const QString lowerPeerName = QString::fromLatin1(QUrl::toAce(peerName));
3027 const QStringList commonNames = cert.subjectInfo(QSslCertificate::CommonName);
3028
3029 for (const QString &commonName : commonNames) {
3030 if (isMatchingHostname(commonName, lowerPeerName))
3031 return true;
3032 }
3033
3034 const auto subjectAlternativeNames = cert.subjectAlternativeNames();
3035 const auto altNames = subjectAlternativeNames.equal_range(QSsl::DnsEntry);
3036 for (auto it = altNames.first; it != altNames.second; ++it) {
3037 if (isMatchingHostname(*it, lowerPeerName))
3038 return true;
3039 }
3040
3041 return false;
3042}
3043
3044/*! \internal
3045 Checks if the certificate's name \a cn matches the \a hostname.
3046 \a hostname must be normalized in ASCII-Compatible Encoding, but \a cn is not normalized
3047 */
3048bool QSslSocketPrivate::isMatchingHostname(const QString &cn, const QString &hostname)
3049{
3050 qsizetype wildcard = cn.indexOf(u'*');
3051
3052 // Check this is a wildcard cert, if not then just compare the strings
3053 if (wildcard < 0)
3054 return QLatin1StringView(QUrl::toAce(cn)) == hostname;
3055
3056 qsizetype firstCnDot = cn.indexOf(u'.');
3057 qsizetype secondCnDot = cn.indexOf(u'.', firstCnDot+1);
3058
3059 // Check at least 3 components
3060 if ((-1 == secondCnDot) || (secondCnDot+1 >= cn.size()))
3061 return false;
3062
3063 // Check * is last character of 1st component (ie. there's a following .)
3064 if (wildcard+1 != firstCnDot)
3065 return false;
3066
3067 // Check only one star
3068 if (cn.lastIndexOf(u'*') != wildcard)
3069 return false;
3070
3071 // Reject wildcard character embedded within the A-labels or U-labels of an internationalized
3072 // domain name (RFC6125 section 7.2)
3073 if (cn.startsWith("xn--"_L1, Qt::CaseInsensitive))
3074 return false;
3075
3076 // Check characters preceding * (if any) match
3077 if (wildcard && QStringView{hostname}.left(wildcard).compare(QStringView{cn}.left(wildcard), Qt::CaseInsensitive) != 0)
3078 return false;
3079
3080 // Check characters following first . match
3081 qsizetype hnDot = hostname.indexOf(u'.');
3082 if (QStringView{hostname}.mid(hnDot + 1) != QStringView{cn}.mid(firstCnDot + 1)
3083 && QStringView{hostname}.mid(hnDot + 1) != QLatin1StringView(QUrl::toAce(cn.mid(firstCnDot + 1)))) {
3084 return false;
3085 }
3086
3087 // Check if the hostname is an IP address, if so then wildcards are not allowed
3088 QHostAddress addr(hostname);
3089 if (!addr.isNull())
3090 return false;
3091
3092 // Ok, I guess this was a wildcard CN and the hostname matches.
3093 return true;
3094}
3095
3096/*!
3097 \internal
3098*/
3099QTlsBackend *QSslSocketPrivate::tlsBackendInUse()
3100{
3101 const QMutexLocker locker(&backendMutex);
3102 if (tlsBackend)
3103 return tlsBackend;
3104
3105 if (!activeBackendName.size())
3106 activeBackendName = QTlsBackend::defaultBackendName();
3107
3108 if (!activeBackendName.size()) {
3109 qCWarning(lcSsl, "No functional TLS backend was found");
3110 return nullptr;
3111 }
3112
3113 tlsBackend = QTlsBackend::findBackend(activeBackendName);
3114 if (tlsBackend) {
3115 QObject::connect(tlsBackend, &QObject::destroyed, tlsBackend, [] {
3116 const QMutexLocker locker(&backendMutex);
3117 tlsBackend = nullptr;
3118 },
3119 Qt::DirectConnection);
3120 }
3121 return tlsBackend;
3122}
3123
3124/*!
3125 \internal
3126*/
3127QSslSocket::SslMode QSslSocketPrivate::tlsMode() const
3128{
3129 return mode;
3130}
3131
3132/*!
3133 \internal
3134*/
3135bool QSslSocketPrivate::isRootsOnDemandAllowed() const
3136{
3137 return allowRootCertOnDemandLoading;
3138}
3139
3140/*!
3141 \internal
3142*/
3143QString QSslSocketPrivate::verificationName() const
3144{
3145 return verificationPeerName;
3146}
3147
3148/*!
3149 \internal
3150*/
3151QString QSslSocketPrivate::tlsHostName() const
3152{
3153 return hostName;
3154}
3155
3156QTcpSocket *QSslSocketPrivate::plainTcpSocket() const
3157{
3158 return plainSocket;
3159}
3160
3161/*!
3162 \internal
3163*/
3164QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
3165{
3166 if (const auto *tlsBackend = tlsBackendInUse())
3167 return tlsBackend->systemCaCertificates();
3168 return {};
3169}
3170
3171QT_END_NAMESPACE
3172
3173#include "moc_qsslsocket.cpp"
Definition qlist.h:81
Represents an elliptic curve for use by elliptic-curve cipher algorithms.
QList< QSslCipher > supportedCiphers
QList< QSslEllipticCurve > supportedEllipticCurves
QExplicitlySharedDataPointer< QSslConfigurationPrivate > dtlsConfig
QExplicitlySharedDataPointer< QSslConfigurationPrivate > config
Combined button and popup list for selecting options.
constexpr auto isVxworks