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
876 // Initiate TLS shutdown while the read buffer is still valid;
877 // QTcpSocket::close() destroys it before calling disconnectFromHost().
878 if (!d->abortCalled)
879 disconnectFromHost();
880
881 if (d->plainSocket) {
882 if (d->abortCalled)
883 d->plainSocket->abort();
884 else
885 d->plainSocket->close();
886 }
887
888 QTcpSocket::close();
889
890 // must be cleared, reading/writing not possible on closed socket:
891 d->buffer.clear();
892 d->writeBuffer.clear();
893}
894
895/*!
896 \reimp
897*/
898bool QSslSocket::atEnd() const
899{
900 Q_D(const QSslSocket);
901 if (d->mode == UnencryptedMode)
902 return QAbstractSocket::atEnd() && (!d->plainSocket || d->plainSocket->atEnd());
903 return QAbstractSocket::atEnd();
904}
905
906/*!
907 \since 4.4
908
909 Sets the size of QSslSocket's internal read buffer to be \a size bytes.
910*/
911void QSslSocket::setReadBufferSize(qint64 size)
912{
913 Q_D(QSslSocket);
914 d->readBufferMaxSize = size;
915
916 if (d->plainSocket)
917 d->plainSocket->setReadBufferSize(size);
918}
919
920/*!
921 \since 4.4
922
923 Returns the socket's SSL configuration state. The default SSL
924 configuration of a socket is to use the default ciphers,
925 default CA certificates, no local private key or certificate.
926
927 The SSL configuration also contains fields that can change with
928 time without notice.
929
930 \sa localCertificate(), peerCertificate(), peerCertificateChain(),
931 sessionCipher(), privateKey(), QSslConfiguration::ciphers(),
932 QSslConfiguration::caCertificates()
933*/
934QSslConfiguration QSslSocket::sslConfiguration() const
935{
936 Q_D(const QSslSocket);
937
938 // create a deep copy of our configuration
939 QSslConfigurationPrivate *copy = new QSslConfigurationPrivate(d->configuration);
940 copy->ref.storeRelaxed(0); // the QSslConfiguration constructor refs up
941 copy->sessionCipher = d->sessionCipher();
942 copy->sessionProtocol = d->sessionProtocol();
943
944 return QSslConfiguration(copy);
945}
946
947/*!
948 \since 4.4
949
950 Sets the socket's SSL configuration to be the contents of \a configuration.
951 This function sets the local certificate, the ciphers, the private key and the CA
952 certificates to those stored in \a configuration.
953
954 It is not possible to set the SSL-state related fields.
955
956 \sa setLocalCertificate(), setPrivateKey(), QSslConfiguration::setCaCertificates(),
957 QSslConfiguration::setCiphers()
958*/
959void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
960{
961 Q_D(QSslSocket);
962 d->configuration.localCertificateChain = configuration.localCertificateChain();
963 d->configuration.privateKey = configuration.privateKey();
964 d->configuration.ciphers = configuration.ciphers();
965 d->configuration.ellipticCurves = configuration.ellipticCurves();
966 d->configuration.preSharedKeyIdentityHint = configuration.preSharedKeyIdentityHint();
967 d->configuration.dhParams = configuration.diffieHellmanParameters();
968 d->configuration.caCertificates = configuration.caCertificates();
969 d->configuration.peerVerifyDepth = configuration.peerVerifyDepth();
970 d->configuration.peerVerifyMode = configuration.peerVerifyMode();
971 d->configuration.protocol = configuration.protocol();
972 d->configuration.backendConfig = configuration.backendConfiguration();
973 d->configuration.sslOptions = configuration.d->sslOptions;
974 d->configuration.sslSession = configuration.sessionTicket();
975 d->configuration.sslSessionTicketLifeTimeHint = configuration.sessionTicketLifeTimeHint();
976 d->configuration.nextAllowedProtocols = configuration.allowedNextProtocols();
977 d->configuration.nextNegotiatedProtocol = configuration.nextNegotiatedProtocol();
978 d->configuration.nextProtocolNegotiationStatus = configuration.nextProtocolNegotiationStatus();
979 d->configuration.keyingMaterial = configuration.keyingMaterial();
980#if QT_CONFIG(ocsp)
981 d->configuration.ocspStaplingEnabled = configuration.ocspStaplingEnabled();
982#endif
983#if QT_CONFIG(openssl)
984 d->configuration.reportFromCallback = configuration.handshakeMustInterruptOnError();
985 d->configuration.missingCertIsFatal = configuration.missingCertificateIsFatal();
986#endif // openssl
987 // if the CA certificates were set explicitly (either via
988 // QSslConfiguration::setCaCertificates() or QSslSocket::setCaCertificates(),
989 // we cannot load the certificates on demand
990 if (!configuration.d->allowRootCertOnDemandLoading) {
991 d->allowRootCertOnDemandLoading = false;
992 d->configuration.allowRootCertOnDemandLoading = false;
993 }
994}
995
996/*!
997 Sets the certificate chain to be presented to the peer during the
998 SSL handshake to be \a localChain.
999
1000 \sa QSslConfiguration::setLocalCertificateChain()
1001 \since 5.1
1002 */
1003void QSslSocket::setLocalCertificateChain(const QList<QSslCertificate> &localChain)
1004{
1005 Q_D(QSslSocket);
1006 d->configuration.localCertificateChain = localChain;
1007}
1008
1009/*!
1010 Returns the socket's local \l {QSslCertificate} {certificate} chain,
1011 or an empty list if no local certificates have been assigned.
1012
1013 \sa setLocalCertificateChain()
1014 \since 5.1
1015*/
1016QList<QSslCertificate> QSslSocket::localCertificateChain() const
1017{
1018 Q_D(const QSslSocket);
1019 return d->configuration.localCertificateChain;
1020}
1021
1022/*!
1023 Sets the socket's local certificate to \a certificate. The local
1024 certificate is necessary if you need to confirm your identity to the
1025 peer. It is used together with the private key; if you set the local
1026 certificate, you must also set the private key.
1027
1028 The local certificate and private key are always necessary for server
1029 sockets, but are also rarely used by client sockets if the server requires
1030 the client to authenticate.
1031
1032 \note Secure Transport SSL backend on macOS may update the default keychain
1033 (the default is probably your login keychain) by importing your local certificates
1034 and keys. This can also result in system dialogs showing up and asking for
1035 permission when your application is using these private keys. If such behavior
1036 is undesired, set the QT_SSL_USE_TEMPORARY_KEYCHAIN environment variable to a
1037 non-zero value; this will prompt QSslSocket to use its own temporary keychain.
1038
1039 \sa localCertificate(), setPrivateKey()
1040*/
1041void QSslSocket::setLocalCertificate(const QSslCertificate &certificate)
1042{
1043 Q_D(QSslSocket);
1044 d->configuration.localCertificateChain = QList<QSslCertificate>();
1045 d->configuration.localCertificateChain += certificate;
1046}
1047
1048/*!
1049 \overload
1050
1051 Sets the socket's local \l {QSslCertificate} {certificate} to the
1052 first one found in file \a path, which is parsed according to the
1053 specified \a format.
1054*/
1055void QSslSocket::setLocalCertificate(const QString &path,
1056 QSsl::EncodingFormat format)
1057{
1058 QFile file(path);
1059 if (file.open(QIODevice::ReadOnly | QIODevice::Text))
1060 setLocalCertificate(QSslCertificate(file.readAll(), format));
1061
1062}
1063
1064/*!
1065 Returns the socket's local \l {QSslCertificate} {certificate}, or
1066 an empty certificate if no local certificate has been assigned.
1067
1068 \sa setLocalCertificate(), privateKey()
1069*/
1070QSslCertificate QSslSocket::localCertificate() const
1071{
1072 Q_D(const QSslSocket);
1073 if (d->configuration.localCertificateChain.isEmpty())
1074 return QSslCertificate();
1075 return d->configuration.localCertificateChain[0];
1076}
1077
1078/*!
1079 Returns the peer's digital certificate (i.e., the immediate
1080 certificate of the host you are connected to), or a null
1081 certificate, if the peer has not assigned a certificate.
1082
1083 The peer certificate is checked automatically during the
1084 handshake phase, so this function is normally used to fetch
1085 the certificate for display or for connection diagnostic
1086 purposes. It contains information about the peer, including
1087 its host name, the certificate issuer, and the peer's public
1088 key.
1089
1090 Because the peer certificate is set during the handshake phase, it
1091 is safe to access the peer certificate from a slot connected to
1092 the sslErrors() signal or the encrypted() signal.
1093
1094 If a null certificate is returned, it can mean the SSL handshake
1095 failed, or it can mean the host you are connected to doesn't have
1096 a certificate, or it can mean there is no connection.
1097
1098 If you want to check the peer's complete chain of certificates,
1099 use peerCertificateChain() to get them all at once.
1100
1101 \sa peerCertificateChain()
1102*/
1103QSslCertificate QSslSocket::peerCertificate() const
1104{
1105 Q_D(const QSslSocket);
1106 return d->configuration.peerCertificate;
1107}
1108
1109/*!
1110 Returns the peer's chain of digital certificates, or an empty list
1111 of certificates.
1112
1113 Peer certificates are checked automatically during the handshake
1114 phase. This function is normally used to fetch certificates for
1115 display, or for performing connection diagnostics. Certificates
1116 contain information about the peer and the certificate issuers,
1117 including host name, issuer names, and issuer public keys.
1118
1119 The peer certificates are set in QSslSocket during the handshake
1120 phase, so it is safe to call this function from a slot connected
1121 to the sslErrors() signal or the encrypted() signal.
1122
1123 If an empty list is returned, it can mean the SSL handshake
1124 failed, or it can mean the host you are connected to doesn't have
1125 a certificate, or it can mean there is no connection.
1126
1127 If you want to get only the peer's immediate certificate, use
1128 peerCertificate().
1129
1130 \sa peerCertificate()
1131*/
1132QList<QSslCertificate> QSslSocket::peerCertificateChain() const
1133{
1134 Q_D(const QSslSocket);
1135 return d->configuration.peerCertificateChain;
1136}
1137
1138/*!
1139 Returns the socket's cryptographic \l {QSslCipher} {cipher}, or a
1140 null cipher if the connection isn't encrypted. The socket's cipher
1141 for the session is set during the handshake phase. The cipher is
1142 used to encrypt and decrypt data transmitted through the socket.
1143
1144 QSslSocket also provides functions for setting the ordered list of
1145 ciphers from which the handshake phase will eventually select the
1146 session cipher. This ordered list must be in place before the
1147 handshake phase begins.
1148
1149 \sa QSslConfiguration::ciphers(), QSslConfiguration::setCiphers(),
1150 QSslConfiguration::setCiphers(),
1151 QSslConfiguration::ciphers(),
1152 QSslConfiguration::supportedCiphers()
1153*/
1154QSslCipher QSslSocket::sessionCipher() const
1155{
1156 Q_D(const QSslSocket);
1157 return d->sessionCipher();
1158}
1159
1160/*!
1161 Returns the socket's SSL/TLS protocol or UnknownProtocol if the
1162 connection isn't encrypted. The socket's protocol for the session
1163 is set during the handshake phase.
1164
1165 \sa protocol(), setProtocol()
1166 \since 5.4
1167*/
1168QSsl::SslProtocol QSslSocket::sessionProtocol() const
1169{
1170 Q_D(const QSslSocket);
1171 return d->sessionProtocol();
1172}
1173
1174/*!
1175 \since 5.13
1176
1177 This function returns Online Certificate Status Protocol responses that
1178 a server may send during a TLS handshake using OCSP stapling. The list
1179 is empty if no definitive response or no response at all was received.
1180
1181 \sa QSslConfiguration::setOcspStaplingEnabled()
1182*/
1183QList<QOcspResponse> QSslSocket::ocspResponses() const
1184{
1185 Q_D(const QSslSocket);
1186 if (const auto *backend = d->backend.get())
1187 return backend->ocsps();
1188 return {};
1189}
1190
1191/*!
1192 Sets the socket's private \l {QSslKey} {key} to \a key. The
1193 private key and the local \l {QSslCertificate} {certificate} are
1194 used by clients and servers that must prove their identity to
1195 SSL peers.
1196
1197 Both the key and the local certificate are required if you are
1198 creating an SSL server socket. If you are creating an SSL client
1199 socket, the key and local certificate are required if your client
1200 must identify itself to an SSL server.
1201
1202 \sa privateKey(), setLocalCertificate()
1203*/
1204void QSslSocket::setPrivateKey(const QSslKey &key)
1205{
1206 Q_D(QSslSocket);
1207 d->configuration.privateKey = key;
1208}
1209
1210/*!
1211 \overload
1212
1213 Reads the string in file \a fileName and decodes it using
1214 a specified \a algorithm and encoding \a format to construct
1215 an \l {QSslKey} {SSL key}. If the encoded key is encrypted,
1216 \a passPhrase is used to decrypt it.
1217
1218 The socket's private key is set to the constructed key. The
1219 private key and the local \l {QSslCertificate} {certificate} are
1220 used by clients and servers that must prove their identity to SSL
1221 peers.
1222
1223 Both the key and the local certificate are required if you are
1224 creating an SSL server socket. If you are creating an SSL client
1225 socket, the key and local certificate are required if your client
1226 must identify itself to an SSL server.
1227
1228 \sa privateKey(), setLocalCertificate()
1229*/
1230void QSslSocket::setPrivateKey(const QString &fileName, QSsl::KeyAlgorithm algorithm,
1231 QSsl::EncodingFormat format, const QByteArray &passPhrase)
1232{
1233 QFile file(fileName);
1234 if (!file.open(QIODevice::ReadOnly)) {
1235 qCWarning(lcSsl, "QSslSocket::setPrivateKey: Couldn't open file for reading");
1236 return;
1237 }
1238
1239 QSslKey key(file.readAll(), algorithm, format, QSsl::PrivateKey, passPhrase);
1240 if (key.isNull()) {
1241 qCWarning(lcSsl, "QSslSocket::setPrivateKey: "
1242 "The specified file does not contain a valid key");
1243 return;
1244 }
1245
1246 Q_D(QSslSocket);
1247 d->configuration.privateKey = key;
1248}
1249
1250/*!
1251 Returns this socket's private key.
1252
1253 \sa setPrivateKey(), localCertificate()
1254*/
1255QSslKey QSslSocket::privateKey() const
1256{
1257 Q_D(const QSslSocket);
1258 return d->configuration.privateKey;
1259}
1260
1261/*!
1262 Waits until the socket is connected, or \a msecs milliseconds,
1263 whichever happens first. If the connection has been established,
1264 this function returns \c true; otherwise it returns \c false.
1265
1266 \sa QAbstractSocket::waitForConnected()
1267*/
1268bool QSslSocket::waitForConnected(int msecs)
1269{
1270 Q_D(QSslSocket);
1271 if (!d->plainSocket)
1272 return false;
1273 bool retVal = d->plainSocket->waitForConnected(msecs);
1274 if (!retVal) {
1275 setSocketState(d->plainSocket->state());
1276 d->setError(d->plainSocket->error(), d->plainSocket->errorString());
1277 }
1278 return retVal;
1279}
1280
1281/*!
1282 Waits until the socket has completed the SSL handshake and has
1283 emitted encrypted(), or \a msecs milliseconds, whichever comes
1284 first. If encrypted() has been emitted, this function returns
1285 true; otherwise (e.g., the socket is disconnected, or the SSL
1286 handshake fails), false is returned.
1287
1288 The following example waits up to one second for the socket to be
1289 encrypted:
1290
1291 \snippet code/src_network_ssl_qsslsocket.cpp 5
1292
1293 If msecs is -1, this function will not time out.
1294
1295 \sa startClientEncryption(), startServerEncryption(), encrypted(), isEncrypted()
1296*/
1297bool QSslSocket::waitForEncrypted(int msecs)
1298{
1299 Q_D(QSslSocket);
1300 if (!d->plainSocket || d->connectionEncrypted)
1301 return false;
1302 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1303 return false;
1304 if (!d->verifyProtocolSupported("QSslSocket::waitForEncrypted:"))
1305 return false;
1306
1307 QElapsedTimer stopWatch;
1308 stopWatch.start();
1309
1310 if (d->plainSocket->state() != QAbstractSocket::ConnectedState) {
1311 // Wait until we've entered connected state.
1312 if (!d->plainSocket->waitForConnected(msecs))
1313 return false;
1314 }
1315
1316 while (!d->connectionEncrypted) {
1317 // Start the handshake, if this hasn't been started yet.
1318 if (d->mode == UnencryptedMode)
1319 startClientEncryption();
1320 // Loop, waiting until the connection has been encrypted or an error
1321 // occurs.
1322 if (!d->plainSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed())))
1323 return false;
1324 }
1325 return d->connectionEncrypted;
1326}
1327
1328/*!
1329 \reimp
1330*/
1331bool QSslSocket::waitForReadyRead(int msecs)
1332{
1333 Q_D(QSslSocket);
1334 if (!d->plainSocket)
1335 return false;
1336 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1337 return d->plainSocket->waitForReadyRead(msecs);
1338
1339 // This function must return true if and only if readyRead() *was* emitted.
1340 // So we initialize "readyReadEmitted" to false and check if it was set to true.
1341 // waitForReadyRead() could be called recursively, so we can't use the same variable
1342 // (the inner waitForReadyRead() may fail, but the outer one still succeeded)
1343 bool readyReadEmitted = false;
1344 bool *previousReadyReadEmittedPointer = d->readyReadEmittedPointer;
1345 d->readyReadEmittedPointer = &readyReadEmitted;
1346
1347 QElapsedTimer stopWatch;
1348 stopWatch.start();
1349
1350 if (!d->connectionEncrypted) {
1351 // Wait until we've entered encrypted mode, or until a failure occurs.
1352 if (!waitForEncrypted(msecs)) {
1353 d->readyReadEmittedPointer = previousReadyReadEmittedPointer;
1354 return false;
1355 }
1356 }
1357
1358 if (!d->writeBuffer.isEmpty()) {
1359 // empty our cleartext write buffer first
1360 d->transmit();
1361 }
1362
1363 // test readyReadEmitted first because either operation above
1364 // (waitForEncrypted or transmit) may have set it
1365 while (!readyReadEmitted &&
1366 d->plainSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
1367 }
1368
1369 d->readyReadEmittedPointer = previousReadyReadEmittedPointer;
1370 return readyReadEmitted;
1371}
1372
1373/*!
1374 \reimp
1375*/
1376bool QSslSocket::waitForBytesWritten(int msecs)
1377{
1378 Q_D(QSslSocket);
1379 if (!d->plainSocket)
1380 return false;
1381 if (d->mode == UnencryptedMode)
1382 return d->plainSocket->waitForBytesWritten(msecs);
1383
1384 QElapsedTimer stopWatch;
1385 stopWatch.start();
1386
1387 if (!d->connectionEncrypted) {
1388 // Wait until we've entered encrypted mode, or until a failure occurs.
1389 if (!waitForEncrypted(msecs))
1390 return false;
1391 }
1392 if (!d->writeBuffer.isEmpty()) {
1393 // empty our cleartext write buffer first
1394 d->transmit();
1395 }
1396
1397 return d->plainSocket->waitForBytesWritten(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
1398}
1399
1400/*!
1401 Waits until the socket has disconnected or \a msecs milliseconds,
1402 whichever comes first. If the connection has been disconnected,
1403 this function returns \c true; otherwise it returns \c false.
1404
1405 \sa QAbstractSocket::waitForDisconnected()
1406*/
1407bool QSslSocket::waitForDisconnected(int msecs)
1408{
1409 Q_D(QSslSocket);
1410
1411 // require calling connectToHost() before waitForDisconnected()
1412 if (state() == UnconnectedState) {
1413 qCWarning(lcSsl, "QSslSocket::waitForDisconnected() is not allowed in UnconnectedState");
1414 return false;
1415 }
1416
1417 if (!d->plainSocket)
1418 return false;
1419 // Forward to the plain socket unless the connection is secure.
1420 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1421 return d->plainSocket->waitForDisconnected(msecs);
1422
1423 QElapsedTimer stopWatch;
1424 stopWatch.start();
1425
1426 if (!d->connectionEncrypted) {
1427 // Wait until we've entered encrypted mode, or until a failure occurs.
1428 if (!waitForEncrypted(msecs))
1429 return false;
1430 }
1431 // We are delaying the disconnect, if the write buffer is not empty.
1432 // So, start the transmission.
1433 if (!d->writeBuffer.isEmpty())
1434 d->transmit();
1435
1436 // At this point, the socket might be disconnected, if disconnectFromHost()
1437 // was called just after the connectToHostEncrypted() call. Also, we can
1438 // lose the connection as a result of the transmit() call.
1439 if (state() == UnconnectedState)
1440 return true;
1441
1442 bool retVal = d->plainSocket->waitForDisconnected(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
1443 if (!retVal) {
1444 setSocketState(d->plainSocket->state());
1445 d->setError(d->plainSocket->error(), d->plainSocket->errorString());
1446 }
1447 return retVal;
1448}
1449
1450/*!
1451 \since 5.15
1452
1453 Returns a list of the last SSL errors that occurred. This is the
1454 same list as QSslSocket passes via the sslErrors() signal. If the
1455 connection has been encrypted with no errors, this function will
1456 return an empty list.
1457
1458 \sa connectToHostEncrypted()
1459*/
1460QList<QSslError> QSslSocket::sslHandshakeErrors() const
1461{
1462 Q_D(const QSslSocket);
1463 if (const auto *backend = d->backend.get())
1464 return backend->tlsErrors();
1465 return {};
1466}
1467
1468/*!
1469 Returns \c true if this platform supports SSL; otherwise, returns
1470 false. If the platform doesn't support SSL, the socket will fail
1471 in the connection phase.
1472*/
1473bool QSslSocket::supportsSsl()
1474{
1475 return QSslSocketPrivate::supportsSsl();
1476}
1477
1478/*!
1479 \since 5.0
1480 Returns the version number of the SSL library in use. Note that
1481 this is the version of the library in use at run-time not compile
1482 time. If no SSL support is available then this will return -1.
1483*/
1484long QSslSocket::sslLibraryVersionNumber()
1485{
1486 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1487 return tlsBackend->tlsLibraryVersionNumber();
1488
1489 return -1;
1490}
1491
1492/*!
1493 \since 5.0
1494 Returns the version string of the SSL library in use. Note that
1495 this is the version of the library in use at run-time not compile
1496 time. If no SSL support is available then this will return an empty value.
1497*/
1498QString QSslSocket::sslLibraryVersionString()
1499{
1500 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1501 return tlsBackend->tlsLibraryVersionString();
1502 return {};
1503}
1504
1505/*!
1506 \since 5.4
1507 Returns the version number of the SSL library in use at compile
1508 time. If no SSL support is available then this will return -1.
1509
1510 \sa sslLibraryVersionNumber()
1511*/
1512long QSslSocket::sslLibraryBuildVersionNumber()
1513{
1514 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1515 return tlsBackend->tlsLibraryBuildVersionNumber();
1516 return -1;
1517}
1518
1519/*!
1520 \since 5.4
1521 Returns the version string of the SSL library in use at compile
1522 time. If no SSL support is available then this will return an
1523 empty value.
1524
1525 \sa sslLibraryVersionString()
1526*/
1527QString QSslSocket::sslLibraryBuildVersionString()
1528{
1529 if (const auto *tlsBackend = QSslSocketPrivate::tlsBackendInUse())
1530 return tlsBackend->tlsLibraryBuildVersionString();
1531
1532 return {};
1533}
1534
1535/*!
1536 \since 6.1
1537 Returns the names of the currently available backends. These names
1538 are in lower case, e.g. "openssl", "securetransport", "schannel"
1539 (similar to the already existing feature names for TLS backends in Qt).
1540
1541 \sa activeBackend()
1542*/
1543QList<QString> QSslSocket::availableBackends()
1544{
1545 return QTlsBackend::availableBackendNames();
1546}
1547
1548/*!
1549 \since 6.1
1550 Returns the name of the backend that QSslSocket and related classes
1551 use. If the active backend was not set explicitly, this function
1552 returns the name of a default backend that QSslSocket selects implicitly
1553 from the list of available backends.
1554
1555 \note When selecting a default backend implicitly, QSslSocket prefers
1556 the OpenSSL backend if available. If it's not available, the Schannel backend
1557 is implicitly selected on Windows, and Secure Transport on Darwin platforms.
1558 Failing these, if a custom TLS backend is found, it is used.
1559 If no other backend is found, the "certificate only" backend is selected.
1560 For more information about TLS plugins, please see
1561 \l {Enabling and Disabling SSL Support when Building Qt from Source}.
1562
1563 \sa setActiveBackend(), availableBackends()
1564*/
1565QString QSslSocket::activeBackend()
1566{
1567 const QMutexLocker locker(&QSslSocketPrivate::backendMutex);
1568
1569 if (!QSslSocketPrivate::activeBackendName.size())
1570 QSslSocketPrivate::activeBackendName = QTlsBackend::defaultBackendName();
1571
1572 return QSslSocketPrivate::activeBackendName;
1573}
1574
1575/*!
1576 \since 6.1
1577 Returns true if a backend with name \a backendName was set as
1578 active backend. \a backendName must be one of names returned
1579 by availableBackends().
1580
1581 \note An application cannot mix different backends simultaneously.
1582 This implies that a non-default backend must be selected prior
1583 to any use of QSslSocket or related classes, e.g. QSslCertificate
1584 or QSslKey.
1585
1586 \sa activeBackend(), availableBackends()
1587*/
1588bool QSslSocket::setActiveBackend(const QString &backendName)
1589{
1590 if (!backendName.size()) {
1591 qCWarning(lcSsl, "Invalid parameter (backend name cannot be an empty string)");
1592 return false;
1593 }
1594
1595 QMutexLocker locker(&QSslSocketPrivate::backendMutex);
1596 if (QSslSocketPrivate::tlsBackend) {
1597 qCWarning(lcSsl) << "Cannot set backend named" << backendName
1598 << "as active, another backend is already in use";
1599 locker.unlock();
1600 return activeBackend() == backendName;
1601 }
1602
1603 if (!QTlsBackend::availableBackendNames().contains(backendName)) {
1604 qCWarning(lcSsl) << "Cannot set unavailable backend named" << backendName
1605 << "as active";
1606 return false;
1607 }
1608
1609 QSslSocketPrivate::activeBackendName = backendName;
1610
1611 return true;
1612}
1613
1614/*!
1615 \since 6.1
1616 If a backend with name \a backendName is available, this function returns the
1617 list of TLS protocol versions supported by this backend. An empty \a backendName
1618 is understood as a query about the currently active backend. Otherwise, this
1619 function returns an empty list.
1620
1621 \sa availableBackends(), activeBackend(), isProtocolSupported()
1622*/
1623QList<QSsl::SslProtocol> QSslSocket::supportedProtocols(const QString &backendName)
1624{
1625 return QTlsBackend::supportedProtocols(backendName.size() ? backendName : activeBackend());
1626}
1627
1628/*!
1629 \since 6.1
1630 Returns true if \a protocol is supported by a backend named \a backendName. An empty
1631 \a backendName is understood as a query about the currently active backend.
1632
1633 \sa supportedProtocols()
1634*/
1635bool QSslSocket::isProtocolSupported(QSsl::SslProtocol protocol, const QString &backendName)
1636{
1637 const auto versions = supportedProtocols(backendName);
1638 return versions.contains(protocol);
1639}
1640
1641/*!
1642 \since 6.1
1643 This function returns backend-specific classes implemented by the backend named
1644 \a backendName. An empty \a backendName is understood as a query about the
1645 currently active backend.
1646
1647 \sa QSsl::ImplementedClass, activeBackend(), isClassImplemented()
1648*/
1649QList<QSsl::ImplementedClass> QSslSocket::implementedClasses(const QString &backendName)
1650{
1651 return QTlsBackend::implementedClasses(backendName.size() ? backendName : activeBackend());
1652}
1653
1654/*!
1655 \since 6.1
1656 Returns true if a class \a cl is implemented by the backend named \a backendName. An empty
1657 \a backendName is understood as a query about the currently active backend.
1658
1659 \sa implementedClasses()
1660*/
1661
1662bool QSslSocket::isClassImplemented(QSsl::ImplementedClass cl, const QString &backendName)
1663{
1664 return implementedClasses(backendName).contains(cl);
1665}
1666
1667/*!
1668 \since 6.1
1669 This function returns features supported by a backend named \a backendName.
1670 An empty \a backendName is understood as a query about the currently active backend.
1671
1672 \sa QSsl::SupportedFeature, activeBackend()
1673*/
1674QList<QSsl::SupportedFeature> QSslSocket::supportedFeatures(const QString &backendName)
1675{
1676 return QTlsBackend::supportedFeatures(backendName.size() ? backendName : activeBackend());
1677}
1678
1679/*!
1680 \since 6.1
1681 Returns true if a feature \a ft is supported by a backend named \a backendName. An empty
1682 \a backendName is understood as a query about the currently active backend.
1683
1684 \sa QSsl::SupportedFeature, supportedFeatures()
1685*/
1686bool QSslSocket::isFeatureSupported(QSsl::SupportedFeature ft, const QString &backendName)
1687{
1688 return supportedFeatures(backendName).contains(ft);
1689}
1690
1691/*!
1692 Starts a delayed SSL handshake for a client connection. This
1693 function can be called when the socket is in the \l ConnectedState
1694 but still in the \l UnencryptedMode. If it is not yet connected,
1695 or if it is already encrypted, this function has no effect.
1696
1697 Clients that implement STARTTLS functionality often make use of
1698 delayed SSL handshakes. Most other clients can avoid calling this
1699 function directly by using connectToHostEncrypted() instead, which
1700 automatically performs the handshake.
1701
1702 \sa connectToHostEncrypted(), startServerEncryption()
1703*/
1704void QSslSocket::startClientEncryption()
1705{
1706 Q_D(QSslSocket);
1707 if (d->mode != UnencryptedMode) {
1708 qCWarning(lcSsl,
1709 "QSslSocket::startClientEncryption: cannot start handshake on non-plain connection");
1710 return;
1711 }
1712 if (state() != ConnectedState) {
1713 qCWarning(lcSsl,
1714 "QSslSocket::startClientEncryption: cannot start handshake when not connected");
1715 return;
1716 }
1717
1718 if (!supportsSsl()) {
1719 qCWarning(lcSsl, "QSslSocket::startClientEncryption: TLS initialization failed");
1720 d->setErrorAndEmit(QAbstractSocket::SslInternalError, tr("TLS initialization failed"));
1721 return;
1722 }
1723
1724 if (!d->verifyProtocolSupported("QSslSocket::startClientEncryption:"))
1725 return;
1726
1727#ifdef QSSLSOCKET_DEBUG
1728 qCDebug(lcSsl) << "QSslSocket::startClientEncryption()";
1729#endif
1730 d->mode = SslClientMode;
1731 emit modeChanged(d->mode);
1732 d->startClientEncryption();
1733}
1734
1735/*!
1736 Starts a delayed SSL handshake for a server connection. This
1737 function can be called when the socket is in the \l ConnectedState
1738 but still in \l UnencryptedMode. If it is not connected or it is
1739 already encrypted, the function has no effect.
1740
1741 For server sockets, calling this function is the only way to
1742 initiate the SSL handshake. Most servers will call this function
1743 immediately upon receiving a connection, or as a result of having
1744 received a protocol-specific command to enter SSL mode (e.g, the
1745 server may respond to receiving the string "STARTTLS\\r\\n" by
1746 calling this function).
1747
1748 The most common way to implement an SSL server is to create a
1749 subclass of QTcpServer and reimplement
1750 QTcpServer::incomingConnection(). The returned socket descriptor
1751 is then passed to QSslSocket::setSocketDescriptor().
1752
1753 \sa connectToHostEncrypted(), startClientEncryption()
1754*/
1755void QSslSocket::startServerEncryption()
1756{
1757 Q_D(QSslSocket);
1758 if (d->mode != UnencryptedMode) {
1759 qCWarning(lcSsl, "QSslSocket::startServerEncryption: cannot start handshake on non-plain connection");
1760 return;
1761 }
1762#ifdef QSSLSOCKET_DEBUG
1763 qCDebug(lcSsl) << "QSslSocket::startServerEncryption()";
1764#endif
1765 if (!supportsSsl()) {
1766 qCWarning(lcSsl, "QSslSocket::startServerEncryption: TLS initialization failed");
1767 d->setErrorAndEmit(QAbstractSocket::SslInternalError, tr("TLS initialization failed"));
1768 return;
1769 }
1770 if (!d->verifyProtocolSupported("QSslSocket::startServerEncryption"))
1771 return;
1772
1773 d->mode = SslServerMode;
1774 emit modeChanged(d->mode);
1775 d->startServerEncryption();
1776}
1777
1778/*!
1779 This slot tells QSslSocket to ignore errors during QSslSocket's
1780 handshake phase and continue connecting. If you want to continue
1781 with the connection even if errors occur during the handshake
1782 phase, then you must call this slot, either from a slot connected
1783 to sslErrors(), or before the handshake phase. If you don't call
1784 this slot, either in response to errors or before the handshake,
1785 the connection will be dropped after the sslErrors() signal has
1786 been emitted.
1787
1788 If there are no errors during the SSL handshake phase (i.e., the
1789 identity of the peer is established with no problems), QSslSocket
1790 will not emit the sslErrors() signal, and it is unnecessary to
1791 call this function.
1792
1793 \warning Be sure to always let the user inspect the errors
1794 reported by the sslErrors() signal, and only call this method
1795 upon confirmation from the user that proceeding is ok.
1796 If there are unexpected errors, the connection should be aborted.
1797 Calling this method without inspecting the actual errors will
1798 most likely pose a security risk for your application. Use it
1799 with great care!
1800
1801 \sa sslErrors()
1802*/
1803void QSslSocket::ignoreSslErrors()
1804{
1805 Q_D(QSslSocket);
1806 d->ignoreAllSslErrors = true;
1807}
1808
1809/*!
1810 \overload
1811 \since 4.6
1812
1813 This method tells QSslSocket to ignore only the errors given in \a
1814 errors.
1815
1816 \note Because most SSL errors are associated with a certificate, for most
1817 of them you must set the expected certificate this SSL error is related to.
1818 If, for instance, you want to connect to a server that uses
1819 a self-signed certificate, consider the following snippet:
1820
1821 \snippet code/src_network_ssl_qsslsocket.cpp 6
1822
1823 Multiple calls to this function will replace the list of errors that
1824 were passed in previous calls.
1825 You can clear the list of errors you want to ignore by calling this
1826 function with an empty list.
1827
1828 \sa sslErrors(), sslHandshakeErrors()
1829*/
1830void QSslSocket::ignoreSslErrors(const QList<QSslError> &errors)
1831{
1832 Q_D(QSslSocket);
1833 d->ignoreErrorsList = errors;
1834}
1835
1836
1837/*!
1838 \since 6.0
1839
1840 If an application wants to conclude a handshake even after receiving
1841 handshakeInterruptedOnError() signal, it must call this function.
1842 This call must be done from a slot function attached to the signal.
1843 The signal-slot connection must be direct.
1844
1845 \sa handshakeInterruptedOnError(), QSslConfiguration::setHandshakeMustInterruptOnError()
1846*/
1847void QSslSocket::continueInterruptedHandshake()
1848{
1849 Q_D(QSslSocket);
1850 if (auto *backend = d->backend.get())
1851 backend->enableHandshakeContinuation();
1852}
1853
1854/*!
1855 \reimp
1856*/
1857void QSslSocket::connectToHost(const QString &hostName, quint16 port, OpenMode openMode, NetworkLayerProtocol protocol)
1858{
1859 Q_D(QSslSocket);
1860 d->preferredNetworkLayerProtocol = protocol;
1861 if (!d->initialized)
1862 d->init();
1863 d->initialized = false;
1864
1865#ifdef QSSLSOCKET_DEBUG
1866 qCDebug(lcSsl) << "QSslSocket::connectToHost("
1867 << hostName << ',' << port << ',' << openMode << ')';
1868#endif
1869 if (!d->plainSocket) {
1870#ifdef QSSLSOCKET_DEBUG
1871 qCDebug(lcSsl) << "\tcreating internal plain socket";
1872#endif
1873 d->createPlainSocket(openMode);
1874 }
1875#ifndef QT_NO_NETWORKPROXY
1876 d->plainSocket->setProtocolTag(d->protocolTag);
1877 d->plainSocket->setProxy(proxy());
1878#endif
1879 QIODevice::open(openMode);
1880 d->readChannelCount = d->writeChannelCount = 0;
1881 d->plainSocket->connectToHost(hostName, port, openMode, d->preferredNetworkLayerProtocol);
1882 d->cachedSocketDescriptor = d->plainSocket->socketDescriptor();
1883}
1884
1885/*!
1886 \reimp
1887*/
1888void QSslSocket::disconnectFromHost()
1889{
1890 Q_D(QSslSocket);
1891#ifdef QSSLSOCKET_DEBUG
1892 qCDebug(lcSsl) << "QSslSocket::disconnectFromHost()";
1893#endif
1894 if (!d->plainSocket)
1895 return;
1896 if (d->state == UnconnectedState)
1897 return;
1898 if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
1899 d->plainSocket->disconnectFromHost();
1900 return;
1901 }
1902 if (d->state <= ConnectingState) {
1903 d->pendingClose = true;
1904 return;
1905 }
1906 // Make sure we don't process any signal from the CA fetcher
1907 // (Windows):
1908 if (auto *backend = d->backend.get())
1909 backend->cancelCAFetch();
1910
1911 // Perhaps emit closing()
1912 if (d->state != ClosingState) {
1913 d->state = ClosingState;
1914 emit stateChanged(d->state);
1915 }
1916
1917 if (!d->writeBuffer.isEmpty()) {
1918 d->pendingClose = true;
1919 return;
1920 }
1921
1922 if (d->mode == UnencryptedMode) {
1923 d->plainSocket->disconnectFromHost();
1924 } else {
1925 d->disconnectFromHost();
1926 }
1927}
1928
1929/*!
1930 \reimp
1931*/
1932qint64 QSslSocket::readData(char *data, qint64 maxlen)
1933{
1934 Q_D(QSslSocket);
1935 qint64 readBytes = 0;
1936
1937 if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
1938 readBytes = d->plainSocket->read(data, maxlen);
1939#ifdef QSSLSOCKET_DEBUG
1940 qCDebug(lcSsl) << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") =="
1941 << readBytes;
1942#endif
1943 } else {
1944 // possibly trigger another transmit() to decrypt more data from the socket
1945 if (d->plainSocket->bytesAvailable() || d->hasUndecryptedData())
1946 QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
1947 else if (d->state != QAbstractSocket::ConnectedState)
1948 return maxlen ? qint64(-1) : qint64(0);
1949 }
1950
1951 return readBytes;
1952}
1953
1954/*!
1955 \reimp
1956*/
1957qint64 QSslSocket::writeData(const char *data, qint64 len)
1958{
1959 Q_D(QSslSocket);
1960#ifdef QSSLSOCKET_DEBUG
1961 qCDebug(lcSsl) << "QSslSocket::writeData(" << (void *)data << ',' << len << ')';
1962#endif
1963 if (d->mode == UnencryptedMode && !d->autoStartHandshake)
1964 return d->plainSocket->write(data, len);
1965
1966 d->write(data, len);
1967
1968 // make sure we flush to the plain socket's buffer
1969 if (!d->flushTriggered) {
1970 d->flushTriggered = true;
1971 QMetaObject::invokeMethod(this, "_q_flushWriteBuffer", Qt::QueuedConnection);
1972 }
1973
1974 return len;
1975}
1976
1977bool QSslSocketPrivate::s_loadRootCertsOnDemand = false;
1978
1979/*!
1980 \internal
1981*/
1982QSslSocketPrivate::QSslSocketPrivate()
1983 : initialized(false)
1984 , mode(QSslSocket::UnencryptedMode)
1985 , autoStartHandshake(false)
1986 , connectionEncrypted(false)
1987 , ignoreAllSslErrors(false)
1988 , readyReadEmittedPointer(nullptr)
1989 , allowRootCertOnDemandLoading(true)
1990 , plainSocket(nullptr)
1991 , paused(false)
1992 , flushTriggered(false)
1993{
1994 QSslConfigurationPrivate::deepCopyDefaultConfiguration(&configuration);
1995 // If the global configuration doesn't allow root certificates to be loaded
1996 // on demand then we have to disable it for this socket as well.
1997 if (!configuration.allowRootCertOnDemandLoading)
1998 allowRootCertOnDemandLoading = false;
1999
2000 const auto *tlsBackend = tlsBackendInUse();
2001 if (!tlsBackend) {
2002 qCWarning(lcSsl, "No TLS backend is available");
2003 return;
2004 }
2005 backend.reset(tlsBackend->createTlsCryptograph());
2006 if (!backend.get()) {
2007 qCWarning(lcSsl) << "The backend named" << tlsBackend->backendName()
2008 << "does not support TLS";
2009 }
2010}
2011
2012/*!
2013 \internal
2014*/
2015QSslSocketPrivate::~QSslSocketPrivate()
2016{
2017}
2018
2019/*!
2020 \internal
2021*/
2022bool QSslSocketPrivate::supportsSsl()
2023{
2024 if (const auto *tlsBackend = tlsBackendInUse())
2025 return tlsBackend->implementedClasses().contains(QSsl::ImplementedClass::Socket);
2026 return false;
2027}
2028
2029/*!
2030 \internal
2031
2032 Declared static in QSslSocketPrivate, makes sure the SSL libraries have
2033 been initialized.
2034*/
2035void QSslSocketPrivate::ensureInitialized()
2036{
2037 if (!supportsSsl())
2038 return;
2039
2040 const auto *tlsBackend = tlsBackendInUse();
2041 Q_ASSERT(tlsBackend);
2042 tlsBackend->ensureInitialized();
2043}
2044
2045/*!
2046 \internal
2047*/
2048void QSslSocketPrivate::init()
2049{
2050 // TLSTODO: delete those data members.
2051 mode = QSslSocket::UnencryptedMode;
2052 autoStartHandshake = false;
2053 connectionEncrypted = false;
2054 ignoreAllSslErrors = false;
2055 abortCalled = false;
2056 pendingClose = false;
2057 flushTriggered = false;
2058 // We don't want to clear the ignoreErrorsList, so
2059 // that it is possible setting it before connecting.
2060
2061 buffer.clear();
2062 writeBuffer.clear();
2063 configuration.peerCertificate.clear();
2064 configuration.peerCertificateChain.clear();
2065
2066 if (backend.get()) {
2067 Q_ASSERT(q_ptr);
2068 backend->init(static_cast<QSslSocket *>(q_ptr), this);
2069 }
2070}
2071
2072/*!
2073 \internal
2074*/
2075bool QSslSocketPrivate::verifyProtocolSupported(const char *where)
2076{
2077 auto protocolName = "DTLS"_L1;
2078 switch (configuration.protocol) {
2079 case QSsl::UnknownProtocol:
2080 // UnknownProtocol, according to our docs, is for cipher whose protocol is unknown.
2081 // Should not be used when configuring QSslSocket.
2082 protocolName = "UnknownProtocol"_L1;
2083 Q_FALLTHROUGH();
2084QT_WARNING_PUSH
2085QT_WARNING_DISABLE_DEPRECATED
2086 case QSsl::DtlsV1_0:
2087 case QSsl::DtlsV1_2:
2088 case QSsl::DtlsV1_0OrLater:
2089 case QSsl::DtlsV1_2OrLater:
2090 qCWarning(lcSsl) << where << "QSslConfiguration with unexpected protocol" << protocolName;
2091 setErrorAndEmit(QAbstractSocket::SslInvalidUserDataError,
2092 QSslSocket::tr("Attempted to use an unsupported protocol."));
2093 return false;
2094QT_WARNING_POP
2095 default:
2096 return true;
2097 }
2098}
2099
2100/*!
2101 \internal
2102*/
2103QList<QSslCipher> QSslSocketPrivate::defaultCiphers()
2104{
2105 QSslSocketPrivate::ensureInitialized();
2106 QMutexLocker locker(&globalData()->mutex);
2107 return globalData()->config->ciphers;
2108}
2109
2110/*!
2111 \internal
2112*/
2113QList<QSslCipher> QSslSocketPrivate::supportedCiphers()
2114{
2115 QSslSocketPrivate::ensureInitialized();
2116 QMutexLocker locker(&globalData()->mutex);
2117 return globalData()->supportedCiphers;
2118}
2119
2120/*!
2121 \internal
2122*/
2123void QSslSocketPrivate::setDefaultCiphers(const QList<QSslCipher> &ciphers)
2124{
2125 QMutexLocker locker(&globalData()->mutex);
2126 globalData()->config.detach();
2127 globalData()->config->ciphers = ciphers;
2128}
2129
2130/*!
2131 \internal
2132*/
2133void QSslSocketPrivate::setDefaultSupportedCiphers(const QList<QSslCipher> &ciphers)
2134{
2135 QMutexLocker locker(&globalData()->mutex);
2136 globalData()->config.detach();
2137 globalData()->supportedCiphers = ciphers;
2138}
2139
2140/*!
2141 \internal
2142*/
2143void QSslSocketPrivate::resetDefaultEllipticCurves()
2144{
2145 const auto *tlsBackend = tlsBackendInUse();
2146 if (!tlsBackend)
2147 return;
2148
2149 auto ids = tlsBackend->ellipticCurvesIds();
2150 if (!ids.size())
2151 return;
2152
2153 QList<QSslEllipticCurve> curves;
2154 curves.reserve(ids.size());
2155 for (int id : ids) {
2156 QSslEllipticCurve curve;
2157 curve.id = id;
2158 curves.append(curve);
2159 }
2160
2161 // Set the list of supported ECs, but not the list
2162 // of *default* ECs. OpenSSL doesn't like forcing an EC for the wrong
2163 // ciphersuite, so don't try it -- leave the empty list to mean
2164 // "the implementation will choose the most suitable one".
2165 setDefaultSupportedEllipticCurves(curves);
2166}
2167
2168/*!
2169 \internal
2170*/
2171void QSslSocketPrivate::setDefaultDtlsCiphers(const QList<QSslCipher> &ciphers)
2172{
2173 QMutexLocker locker(&globalData()->mutex);
2174 globalData()->dtlsConfig.detach();
2175 globalData()->dtlsConfig->ciphers = ciphers;
2176}
2177
2178/*!
2179 \internal
2180*/
2181QList<QSslCipher> QSslSocketPrivate::defaultDtlsCiphers()
2182{
2183 QSslSocketPrivate::ensureInitialized();
2184 QMutexLocker locker(&globalData()->mutex);
2185 return globalData()->dtlsConfig->ciphers;
2186}
2187
2188/*!
2189 \internal
2190*/
2191QList<QSslEllipticCurve> QSslSocketPrivate::supportedEllipticCurves()
2192{
2193 QSslSocketPrivate::ensureInitialized();
2194 const QMutexLocker locker(&globalData()->mutex);
2195 return globalData()->supportedEllipticCurves;
2196}
2197
2198/*!
2199 \internal
2200*/
2201void QSslSocketPrivate::setDefaultSupportedEllipticCurves(const QList<QSslEllipticCurve> &curves)
2202{
2203 const QMutexLocker locker(&globalData()->mutex);
2204 globalData()->config.detach();
2205 globalData()->dtlsConfig.detach();
2206 globalData()->supportedEllipticCurves = curves;
2207}
2208
2209/*!
2210 \internal
2211*/
2212QList<QSslCertificate> QSslSocketPrivate::defaultCaCertificates()
2213{
2214 QSslSocketPrivate::ensureInitialized();
2215 QMutexLocker locker(&globalData()->mutex);
2216 return globalData()->config->caCertificates;
2217}
2218
2219/*!
2220 \internal
2221*/
2222void QSslSocketPrivate::setDefaultCaCertificates(const QList<QSslCertificate> &certs)
2223{
2224 QSslSocketPrivate::ensureInitialized();
2225 QMutexLocker locker(&globalData()->mutex);
2226 globalData()->config.detach();
2227 globalData()->config->caCertificates = certs;
2228 globalData()->dtlsConfig.detach();
2229 globalData()->dtlsConfig->caCertificates = certs;
2230 // when the certificates are set explicitly, we do not want to
2231 // load the system certificates on demand
2232 s_loadRootCertsOnDemand = false;
2233}
2234
2235/*!
2236 \internal
2237*/
2238void QSslSocketPrivate::addDefaultCaCertificate(const QSslCertificate &cert)
2239{
2240 QSslSocketPrivate::ensureInitialized();
2241 QMutexLocker locker(&globalData()->mutex);
2242 if (globalData()->config->caCertificates.contains(cert))
2243 return;
2244 globalData()->config.detach();
2245 globalData()->config->caCertificates += cert;
2246 globalData()->dtlsConfig.detach();
2247 globalData()->dtlsConfig->caCertificates += cert;
2248}
2249
2250/*!
2251 \internal
2252*/
2253void QSslSocketPrivate::addDefaultCaCertificates(const QList<QSslCertificate> &certs)
2254{
2255 QSslSocketPrivate::ensureInitialized();
2256 QMutexLocker locker(&globalData()->mutex);
2257 globalData()->config.detach();
2258 globalData()->config->caCertificates += certs;
2259 globalData()->dtlsConfig.detach();
2260 globalData()->dtlsConfig->caCertificates += certs;
2261}
2262
2263/*!
2264 \internal
2265*/
2266QSslConfiguration QSslConfigurationPrivate::defaultConfiguration()
2267{
2268 QSslSocketPrivate::ensureInitialized();
2269 QMutexLocker locker(&globalData()->mutex);
2270 return QSslConfiguration(globalData()->config.data());
2271}
2272
2273/*!
2274 \internal
2275*/
2276void QSslConfigurationPrivate::setDefaultConfiguration(const QSslConfiguration &configuration)
2277{
2278 QSslSocketPrivate::ensureInitialized();
2279 QMutexLocker locker(&globalData()->mutex);
2280 if (globalData()->config == configuration.d)
2281 return; // nothing to do
2282
2283 globalData()->config = const_cast<QSslConfigurationPrivate*>(configuration.d.constData());
2284}
2285
2286/*!
2287 \internal
2288*/
2289void QSslConfigurationPrivate::deepCopyDefaultConfiguration(QSslConfigurationPrivate *ptr)
2290{
2291 QSslSocketPrivate::ensureInitialized();
2292 QMutexLocker locker(&globalData()->mutex);
2293 const QSslConfigurationPrivate *global = globalData()->config.constData();
2294
2295 if (!global)
2296 return;
2297
2298 ptr->ref.storeRelaxed(1);
2299 ptr->peerCertificate = global->peerCertificate;
2300 ptr->peerCertificateChain = global->peerCertificateChain;
2301 ptr->localCertificateChain = global->localCertificateChain;
2302 ptr->privateKey = global->privateKey;
2303 ptr->sessionCipher = global->sessionCipher;
2304 ptr->sessionProtocol = global->sessionProtocol;
2305 ptr->ciphers = global->ciphers;
2306 ptr->caCertificates = global->caCertificates;
2307 ptr->allowRootCertOnDemandLoading = global->allowRootCertOnDemandLoading;
2308 ptr->protocol = global->protocol;
2309 ptr->peerVerifyMode = global->peerVerifyMode;
2310 ptr->peerVerifyDepth = global->peerVerifyDepth;
2311 ptr->sslOptions = global->sslOptions;
2312 ptr->ellipticCurves = global->ellipticCurves;
2313 ptr->backendConfig = global->backendConfig;
2314#if QT_CONFIG(dtls)
2315 ptr->dtlsCookieEnabled = global->dtlsCookieEnabled;
2316#endif
2317#if QT_CONFIG(ocsp)
2318 ptr->ocspStaplingEnabled = global->ocspStaplingEnabled;
2319#endif
2320#if QT_CONFIG(openssl)
2321 ptr->reportFromCallback = global->reportFromCallback;
2322 ptr->missingCertIsFatal = global->missingCertIsFatal;
2323#endif
2324}
2325
2326/*!
2327 \internal
2328*/
2329QSslConfiguration QSslConfigurationPrivate::defaultDtlsConfiguration()
2330{
2331 QSslSocketPrivate::ensureInitialized();
2332 QMutexLocker locker(&globalData()->mutex);
2333
2334 return QSslConfiguration(globalData()->dtlsConfig.data());
2335}
2336
2337/*!
2338 \internal
2339*/
2340void QSslConfigurationPrivate::setDefaultDtlsConfiguration(const QSslConfiguration &configuration)
2341{
2342 QSslSocketPrivate::ensureInitialized();
2343 QMutexLocker locker(&globalData()->mutex);
2344 if (globalData()->dtlsConfig == configuration.d)
2345 return; // nothing to do
2346
2347 globalData()->dtlsConfig = const_cast<QSslConfigurationPrivate*>(configuration.d.constData());
2348}
2349
2350/*!
2351 \internal
2352*/
2353void QSslSocketPrivate::createPlainSocket(QIODevice::OpenMode openMode)
2354{
2355 Q_Q(QSslSocket);
2356 q->setOpenMode(openMode); // <- from QIODevice
2357 q->setSocketState(QAbstractSocket::UnconnectedState);
2358 q->setSocketError(QAbstractSocket::UnknownSocketError);
2359 q->setLocalPort(0);
2360 q->setLocalAddress(QHostAddress());
2361 q->setPeerPort(0);
2362 q->setPeerAddress(QHostAddress());
2363 q->setPeerName(QString());
2364
2365 plainSocket = new QTcpSocket(q);
2366 q->connect(plainSocket, SIGNAL(connected()),
2367 q, SLOT(_q_connectedSlot()),
2368 Qt::DirectConnection);
2369 q->connect(plainSocket, SIGNAL(hostFound()),
2370 q, SLOT(_q_hostFoundSlot()),
2371 Qt::DirectConnection);
2372 q->connect(plainSocket, SIGNAL(disconnected()),
2373 q, SLOT(_q_disconnectedSlot()),
2374 Qt::DirectConnection);
2375 q->connect(plainSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
2376 q, SLOT(_q_stateChangedSlot(QAbstractSocket::SocketState)),
2377 Qt::DirectConnection);
2378 q->connect(plainSocket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)),
2379 q, SLOT(_q_errorSlot(QAbstractSocket::SocketError)),
2380 Qt::DirectConnection);
2381 q->connect(plainSocket, SIGNAL(readyRead()),
2382 q, SLOT(_q_readyReadSlot()),
2383 Qt::DirectConnection);
2384 q->connect(plainSocket, SIGNAL(channelReadyRead(int)),
2385 q, SLOT(_q_channelReadyReadSlot(int)),
2386 Qt::DirectConnection);
2387 q->connect(plainSocket, SIGNAL(bytesWritten(qint64)),
2388 q, SLOT(_q_bytesWrittenSlot(qint64)),
2389 Qt::DirectConnection);
2390 q->connect(plainSocket, SIGNAL(channelBytesWritten(int,qint64)),
2391 q, SLOT(_q_channelBytesWrittenSlot(int,qint64)),
2392 Qt::DirectConnection);
2393 q->connect(plainSocket, SIGNAL(readChannelFinished()),
2394 q, SLOT(_q_readChannelFinishedSlot()),
2395 Qt::DirectConnection);
2396#ifndef QT_NO_NETWORKPROXY
2397 q->connect(plainSocket, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
2398 q, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
2399#endif
2400
2401 buffer.clear();
2402 writeBuffer.clear();
2403 connectionEncrypted = false;
2404 configuration.peerCertificate.clear();
2405 configuration.peerCertificateChain.clear();
2406 mode = QSslSocket::UnencryptedMode;
2407 q->setReadBufferSize(readBufferMaxSize);
2408}
2409
2410void QSslSocketPrivate::pauseSocketNotifiers(QSslSocket *socket)
2411{
2412 if (!socket->d_func()->plainSocket)
2413 return;
2414 QAbstractSocketPrivate::pauseSocketNotifiers(socket->d_func()->plainSocket);
2415}
2416
2417void QSslSocketPrivate::resumeSocketNotifiers(QSslSocket *socket)
2418{
2419 if (!socket->d_func()->plainSocket)
2420 return;
2421 QAbstractSocketPrivate::resumeSocketNotifiers(socket->d_func()->plainSocket);
2422}
2423
2424bool QSslSocketPrivate::isPaused() const
2425{
2426 return paused;
2427}
2428
2429void QSslSocketPrivate::setPaused(bool p)
2430{
2431 paused = p;
2432}
2433
2434bool QSslSocketPrivate::bind(const QHostAddress &address, quint16 port, QAbstractSocket::BindMode mode,
2435 const QNetworkInterface *iface)
2436{
2437 Q_UNUSED(iface); // only relevant for QUdpSocket for now
2438 // this function is called from QAbstractSocket::bind
2439 if (!initialized)
2440 init();
2441 initialized = false;
2442
2443#ifdef QSSLSOCKET_DEBUG
2444 qCDebug(lcSsl) << "QSslSocket::bind(" << address << ',' << port << ',' << mode << ')';
2445#endif
2446 if (!plainSocket) {
2447#ifdef QSSLSOCKET_DEBUG
2448 qCDebug(lcSsl) << "\tcreating internal plain socket";
2449#endif
2450 createPlainSocket(QIODevice::ReadWrite);
2451 }
2452 bool ret = plainSocket->bind(address, port, mode);
2453 localPort = plainSocket->localPort();
2454 localAddress = plainSocket->localAddress();
2455 cachedSocketDescriptor = plainSocket->socketDescriptor();
2456 readChannelCount = writeChannelCount = 0;
2457 return ret;
2458}
2459
2460/*!
2461 \internal
2462*/
2463void QSslSocketPrivate::_q_connectedSlot()
2464{
2465 Q_Q(QSslSocket);
2466 q->setLocalPort(plainSocket->localPort());
2467 q->setLocalAddress(plainSocket->localAddress());
2468 q->setPeerPort(plainSocket->peerPort());
2469 q->setPeerAddress(plainSocket->peerAddress());
2470 q->setPeerName(plainSocket->peerName());
2471 cachedSocketDescriptor = plainSocket->socketDescriptor();
2472 readChannelCount = plainSocket->readChannelCount();
2473 writeChannelCount = plainSocket->writeChannelCount();
2474
2475#ifdef QSSLSOCKET_DEBUG
2476 qCDebug(lcSsl) << "QSslSocket::_q_connectedSlot()";
2477 qCDebug(lcSsl) << "\tstate =" << q->state();
2478 qCDebug(lcSsl) << "\tpeer =" << q->peerName() << q->peerAddress() << q->peerPort();
2479 qCDebug(lcSsl) << "\tlocal =" << QHostInfo::fromName(q->localAddress().toString()).hostName()
2480 << q->localAddress() << q->localPort();
2481#endif
2482
2483 if (autoStartHandshake)
2484 q->startClientEncryption();
2485
2486 emit q->connected();
2487
2488 if (pendingClose && !autoStartHandshake) {
2489 pendingClose = false;
2490 q->disconnectFromHost();
2491 }
2492}
2493
2494/*!
2495 \internal
2496*/
2497void QSslSocketPrivate::_q_hostFoundSlot()
2498{
2499 Q_Q(QSslSocket);
2500#ifdef QSSLSOCKET_DEBUG
2501 qCDebug(lcSsl) << "QSslSocket::_q_hostFoundSlot()";
2502 qCDebug(lcSsl) << "\tstate =" << q->state();
2503#endif
2504 emit q->hostFound();
2505}
2506
2507/*!
2508 \internal
2509*/
2510void QSslSocketPrivate::_q_disconnectedSlot()
2511{
2512 Q_Q(QSslSocket);
2513#ifdef QSSLSOCKET_DEBUG
2514 qCDebug(lcSsl) << "QSslSocket::_q_disconnectedSlot()";
2515 qCDebug(lcSsl) << "\tstate =" << q->state();
2516#endif
2517 disconnected();
2518 emit q->disconnected();
2519
2520 q->setLocalPort(0);
2521 q->setLocalAddress(QHostAddress());
2522 q->setPeerPort(0);
2523 q->setPeerAddress(QHostAddress());
2524 q->setPeerName(QString());
2525 cachedSocketDescriptor = -1;
2526}
2527
2528/*!
2529 \internal
2530*/
2531void QSslSocketPrivate::_q_stateChangedSlot(QAbstractSocket::SocketState state)
2532{
2533 Q_Q(QSslSocket);
2534#ifdef QSSLSOCKET_DEBUG
2535 qCDebug(lcSsl) << "QSslSocket::_q_stateChangedSlot(" << state << ')';
2536#endif
2537 q->setSocketState(state);
2538 emit q->stateChanged(state);
2539}
2540
2541/*!
2542 \internal
2543*/
2544void QSslSocketPrivate::_q_errorSlot(QAbstractSocket::SocketError error)
2545{
2546 Q_UNUSED(error);
2547#ifdef QSSLSOCKET_DEBUG
2548 Q_Q(QSslSocket);
2549 qCDebug(lcSsl) << "QSslSocket::_q_errorSlot(" << error << ')';
2550 qCDebug(lcSsl) << "\tstate =" << q->state();
2551 qCDebug(lcSsl) << "\terrorString =" << q->errorString();
2552#endif
2553 // this moves encrypted bytes from plain socket into our buffer
2554 if (plainSocket->bytesAvailable() && mode != QSslSocket::UnencryptedMode) {
2555 qint64 tmpReadBufferMaxSize = readBufferMaxSize;
2556 readBufferMaxSize = 0; // reset temporarily so the plain sockets completely drained drained
2557 transmit();
2558 readBufferMaxSize = tmpReadBufferMaxSize;
2559 }
2560
2561 setErrorAndEmit(plainSocket->error(), plainSocket->errorString());
2562}
2563
2564/*!
2565 \internal
2566*/
2567void QSslSocketPrivate::_q_readyReadSlot()
2568{
2569 Q_Q(QSslSocket);
2570#ifdef QSSLSOCKET_DEBUG
2571 qCDebug(lcSsl) << "QSslSocket::_q_readyReadSlot() -" << plainSocket->bytesAvailable() << "bytes available";
2572#endif
2573 if (mode == QSslSocket::UnencryptedMode) {
2574 if (readyReadEmittedPointer)
2575 *readyReadEmittedPointer = true;
2576 emit q->readyRead();
2577 return;
2578 }
2579
2580 transmit();
2581}
2582
2583/*!
2584 \internal
2585*/
2586void QSslSocketPrivate::_q_channelReadyReadSlot(int channel)
2587{
2588 Q_Q(QSslSocket);
2589 if (mode == QSslSocket::UnencryptedMode)
2590 emit q->channelReadyRead(channel);
2591}
2592
2593/*!
2594 \internal
2595*/
2596void QSslSocketPrivate::_q_bytesWrittenSlot(qint64 written)
2597{
2598 Q_Q(QSslSocket);
2599#ifdef QSSLSOCKET_DEBUG
2600 qCDebug(lcSsl) << "QSslSocket::_q_bytesWrittenSlot(" << written << ')';
2601#endif
2602
2603 if (mode == QSslSocket::UnencryptedMode)
2604 emit q->bytesWritten(written);
2605 else
2606 emit q->encryptedBytesWritten(written);
2607 if (state == QAbstractSocket::ClosingState && writeBuffer.isEmpty())
2608 q->disconnectFromHost();
2609}
2610
2611/*!
2612 \internal
2613*/
2614void QSslSocketPrivate::_q_channelBytesWrittenSlot(int channel, qint64 written)
2615{
2616 Q_Q(QSslSocket);
2617 if (mode == QSslSocket::UnencryptedMode)
2618 emit q->channelBytesWritten(channel, written);
2619}
2620
2621/*!
2622 \internal
2623*/
2624void QSslSocketPrivate::_q_readChannelFinishedSlot()
2625{
2626 Q_Q(QSslSocket);
2627 emit q->readChannelFinished();
2628}
2629
2630/*!
2631 \internal
2632*/
2633void QSslSocketPrivate::_q_flushWriteBuffer()
2634{
2635 Q_Q(QSslSocket);
2636
2637 // need to notice if knock-on effects of this flush (e.g. a readReady() via transmit())
2638 // make another necessary, so clear flag before calling:
2639 flushTriggered = false;
2640 if (!writeBuffer.isEmpty())
2641 q->flush();
2642}
2643
2644/*!
2645 \internal
2646*/
2647void QSslSocketPrivate::_q_flushReadBuffer()
2648{
2649 // trigger a read from the plainSocket into SSL
2650 if (mode != QSslSocket::UnencryptedMode)
2651 transmit();
2652}
2653
2654/*!
2655 \internal
2656*/
2657void QSslSocketPrivate::_q_resumeImplementation()
2658{
2659 if (plainSocket)
2660 plainSocket->resume();
2661 paused = false;
2662 if (!connectionEncrypted) {
2663 if (verifyErrorsHaveBeenIgnored()) {
2664 continueHandshake();
2665 } else {
2666 const auto sslErrors = backend->tlsErrors();
2667 Q_ASSERT(!sslErrors.isEmpty());
2668 setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.constFirst().errorString());
2669 plainSocket->disconnectFromHost();
2670 return;
2671 }
2672 }
2673 transmit();
2674}
2675
2676/*!
2677 \internal
2678*/
2679bool QSslSocketPrivate::verifyErrorsHaveBeenIgnored()
2680{
2681 Q_ASSERT(backend.get());
2682
2683 bool doEmitSslError;
2684 if (!ignoreErrorsList.empty()) {
2685 // check whether the errors we got are all in the list of expected errors
2686 // (applies only if the method QSslSocket::ignoreSslErrors(const QList<QSslError> &errors)
2687 // was called)
2688 const auto &sslErrors = backend->tlsErrors();
2689 doEmitSslError = false;
2690 for (int a = 0; a < sslErrors.size(); a++) {
2691 if (!ignoreErrorsList.contains(sslErrors.at(a))) {
2692 doEmitSslError = true;
2693 break;
2694 }
2695 }
2696 } else {
2697 // if QSslSocket::ignoreSslErrors(const QList<QSslError> &errors) was not called and
2698 // we get an SSL error, emit a signal unless we ignored all errors (by calling
2699 // QSslSocket::ignoreSslErrors() )
2700 doEmitSslError = !ignoreAllSslErrors;
2701 }
2702 return !doEmitSslError;
2703}
2704
2705/*!
2706 \internal
2707*/
2708bool QSslSocketPrivate::isAutoStartingHandshake() const
2709{
2710 return autoStartHandshake;
2711}
2712
2713/*!
2714 \internal
2715*/
2716bool QSslSocketPrivate::isPendingClose() const
2717{
2718 return pendingClose;
2719}
2720
2721/*!
2722 \internal
2723*/
2724void QSslSocketPrivate::setPendingClose(bool pc)
2725{
2726 pendingClose = pc;
2727}
2728
2729/*!
2730 \internal
2731*/
2732qint64 QSslSocketPrivate::maxReadBufferSize() const
2733{
2734 return readBufferMaxSize;
2735}
2736
2737/*!
2738 \internal
2739*/
2740void QSslSocketPrivate::setMaxReadBufferSize(qint64 maxSize)
2741{
2742 readBufferMaxSize = maxSize;
2743}
2744
2745/*!
2746 \internal
2747*/
2748void QSslSocketPrivate::setEncrypted(bool enc)
2749{
2750 connectionEncrypted = enc;
2751}
2752
2753/*!
2754 \internal
2755*/
2756QIODevicePrivate::QRingBufferRef &QSslSocketPrivate::tlsWriteBuffer()
2757{
2758 return writeBuffer;
2759}
2760
2761/*!
2762 \internal
2763*/
2764QIODevicePrivate::QRingBufferRef &QSslSocketPrivate::tlsBuffer()
2765{
2766 return buffer;
2767}
2768
2769/*!
2770 \internal
2771*/
2772bool &QSslSocketPrivate::tlsEmittedBytesWritten()
2773{
2774 return emittedBytesWritten;
2775}
2776
2777/*!
2778 \internal
2779*/
2780bool *QSslSocketPrivate::readyReadPointer()
2781{
2782 return readyReadEmittedPointer;
2783}
2784
2785bool QSslSocketPrivate::hasUndecryptedData() const
2786{
2787 return backend.get() && backend->hasUndecryptedData();
2788}
2789
2790/*!
2791 \internal
2792*/
2793qint64 QSslSocketPrivate::peek(char *data, qint64 maxSize)
2794{
2795 if (mode == QSslSocket::UnencryptedMode && !autoStartHandshake) {
2796 //unencrypted mode - do not use QIODevice::peek, as it reads ahead data from the plain socket
2797 //peek at data already in the QIODevice buffer (from a previous read)
2798 qint64 r = buffer.peek(data, maxSize, transactionPos);
2799 if (r == maxSize)
2800 return r;
2801 data += r;
2802 //peek at data in the plain socket
2803 if (plainSocket) {
2804 qint64 r2 = plainSocket->peek(data, maxSize - r);
2805 if (r2 < 0)
2806 return (r > 0 ? r : r2);
2807 return r + r2;
2808 }
2809
2810 return -1;
2811 } else {
2812 //encrypted mode - the socket engine will read and decrypt data into the QIODevice buffer
2813 return QTcpSocketPrivate::peek(data, maxSize);
2814 }
2815}
2816
2817/*!
2818 \internal
2819*/
2820QByteArray QSslSocketPrivate::peek(qint64 maxSize)
2821{
2822 if (mode == QSslSocket::UnencryptedMode && !autoStartHandshake) {
2823 //unencrypted mode - do not use QIODevice::peek, as it reads ahead data from the plain socket
2824 //peek at data already in the QIODevice buffer (from a previous read)
2825 QByteArray ret;
2826 ret.reserve(maxSize);
2827 ret.resize(buffer.peek(ret.data(), maxSize, transactionPos));
2828 if (ret.size() == maxSize)
2829 return ret;
2830 //peek at data in the plain socket
2831 if (plainSocket)
2832 return ret + plainSocket->peek(maxSize - ret.size());
2833
2834 return QByteArray();
2835 } else {
2836 //encrypted mode - the socket engine will read and decrypt data into the QIODevice buffer
2837 return QTcpSocketPrivate::peek(maxSize);
2838 }
2839}
2840
2841/*!
2842 \reimp
2843*/
2844qint64 QSslSocket::skipData(qint64 maxSize)
2845{
2846 Q_D(QSslSocket);
2847
2848 if (d->mode == QSslSocket::UnencryptedMode && !d->autoStartHandshake)
2849 return d->plainSocket->skip(maxSize);
2850
2851 // In encrypted mode, the SSL backend writes decrypted data directly into the
2852 // QIODevice's read buffer. As this buffer is always emptied by the caller,
2853 // we need to wait for more incoming data.
2854 return (d->state == QAbstractSocket::ConnectedState) ? Q_INT64_C(0) : Q_INT64_C(-1);
2855}
2856
2857/*!
2858 \internal
2859*/
2860bool QSslSocketPrivate::flush()
2861{
2862#ifdef QSSLSOCKET_DEBUG
2863 qCDebug(lcSsl) << "QSslSocketPrivate::flush()";
2864#endif
2865 if (mode != QSslSocket::UnencryptedMode) {
2866 // encrypt any unencrypted bytes in our buffer
2867 transmit();
2868 }
2869
2870 return plainSocket && plainSocket->flush();
2871}
2872
2873/*!
2874 \internal
2875*/
2876void QSslSocketPrivate::startClientEncryption()
2877{
2878 if (backend.get())
2879 backend->startClientEncryption();
2880}
2881
2882/*!
2883 \internal
2884*/
2885void QSslSocketPrivate::startServerEncryption()
2886{
2887 if (backend.get())
2888 backend->startServerEncryption();
2889}
2890
2891/*!
2892 \internal
2893*/
2894void QSslSocketPrivate::transmit()
2895{
2896 if (backend.get())
2897 backend->transmit();
2898}
2899
2900/*!
2901 \internal
2902*/
2903void QSslSocketPrivate::disconnectFromHost()
2904{
2905 if (backend.get())
2906 backend->disconnectFromHost();
2907}
2908
2909/*!
2910 \internal
2911*/
2912void QSslSocketPrivate::disconnected()
2913{
2914 if (backend.get())
2915 backend->disconnected();
2916}
2917
2918/*!
2919 \internal
2920*/
2921QSslCipher QSslSocketPrivate::sessionCipher() const
2922{
2923 if (backend.get())
2924 return backend->sessionCipher();
2925
2926 return {};
2927}
2928
2929/*!
2930 \internal
2931*/
2932QSsl::SslProtocol QSslSocketPrivate::sessionProtocol() const
2933{
2934 if (backend.get())
2935 return backend->sessionProtocol();
2936
2937 return QSsl::UnknownProtocol;
2938}
2939
2940/*!
2941 \internal
2942*/
2943void QSslSocketPrivate::continueHandshake()
2944{
2945 if (backend.get())
2946 backend->continueHandshake();
2947}
2948
2949/*!
2950 \internal
2951*/
2952bool QSslSocketPrivate::rootCertOnDemandLoadingSupported()
2953{
2954 return s_loadRootCertsOnDemand;
2955}
2956
2957/*!
2958 \internal
2959*/
2960void QSslSocketPrivate::setRootCertOnDemandLoadingSupported(bool supported)
2961{
2962 s_loadRootCertsOnDemand = supported;
2963}
2964
2965/*!
2966 \internal
2967*/
2968QList<QByteArray> QSslSocketPrivate::unixRootCertDirectories()
2969{
2970 const auto ba = [](const auto &cstr) constexpr {
2971 return QByteArray::fromRawData(std::begin(cstr), std::size(cstr) - 1);
2972 };
2973 static const QByteArray dirs[] = {
2974 ba("/etc/ssl/certs/"), // (K)ubuntu, OpenSUSE, Mandriva ...
2975 ba("/usr/lib/ssl/certs/"), // Gentoo, Mandrake
2976 ba("/usr/share/ssl/"), // Red Hat pre-2004, SuSE
2977 ba("/etc/pki/ca-trust/extracted/pem/directory-hash/"), // Red Hat 2021+
2978 ba("/usr/local/ssl/"), // Normal OpenSSL Tarball
2979 ba("/var/ssl/certs/"), // AIX
2980 ba("/usr/local/ssl/certs/"), // Solaris
2981 ba("/etc/openssl/certs/"), // BlackBerry
2982 ba("/opt/openssl/certs/"), // HP-UX
2983 ba("/etc/ssl/"), // OpenBSD
2984 ba("/etc/security/certificates/"), // HarmonyOS
2985 };
2986 QList<QByteArray> result = QList<QByteArray>::fromReadOnlyData(dirs);
2987 if constexpr (isVxworks) {
2988 static QByteArray vxworksCertsDir = qgetenv("VXWORKS_CERTS_DIR");
2989 if (!vxworksCertsDir.isEmpty())
2990 result.push_back(vxworksCertsDir);
2991 }
2992 return result;
2993}
2994
2995/*!
2996 \internal
2997*/
2998void QSslSocketPrivate::checkSettingSslContext(QSslSocket* socket, std::shared_ptr<QSslContext> tlsContext)
2999{
3000 if (!socket)
3001 return;
3002
3003 if (auto *backend = socket->d_func()->backend.get())
3004 backend->checkSettingSslContext(tlsContext);
3005}
3006
3007/*!
3008 \internal
3009*/
3010std::shared_ptr<QSslContext> QSslSocketPrivate::sslContext(QSslSocket *socket)
3011{
3012 if (!socket)
3013 return {};
3014
3015 if (const auto *backend = socket->d_func()->backend.get())
3016 return backend->sslContext();
3017
3018 return {};
3019}
3020
3021bool QSslSocketPrivate::isMatchingHostname(const QSslCertificate &cert, const QString &peerName)
3022{
3023 QHostAddress hostAddress(peerName);
3024 if (!hostAddress.isNull()) {
3025 const auto subjectAlternativeNames = cert.subjectAlternativeNames();
3026 const auto ipAddresses = subjectAlternativeNames.equal_range(QSsl::AlternativeNameEntryType::IpAddressEntry);
3027
3028 for (auto it = ipAddresses.first; it != ipAddresses.second; it++) {
3029 if (QHostAddress(*it).isEqual(hostAddress, QHostAddress::StrictConversion))
3030 return true;
3031 }
3032 }
3033
3034 const QString lowerPeerName = QString::fromLatin1(QUrl::toAce(peerName));
3035 const QStringList commonNames = cert.subjectInfo(QSslCertificate::CommonName);
3036
3037 for (const QString &commonName : commonNames) {
3038 if (isMatchingHostname(commonName, lowerPeerName))
3039 return true;
3040 }
3041
3042 const auto subjectAlternativeNames = cert.subjectAlternativeNames();
3043 const auto altNames = subjectAlternativeNames.equal_range(QSsl::DnsEntry);
3044 for (auto it = altNames.first; it != altNames.second; ++it) {
3045 if (isMatchingHostname(*it, lowerPeerName))
3046 return true;
3047 }
3048
3049 return false;
3050}
3051
3052/*! \internal
3053 Checks if the certificate's name \a cn matches the \a hostname.
3054 \a hostname must be normalized in ASCII-Compatible Encoding, but \a cn is not normalized
3055 */
3056bool QSslSocketPrivate::isMatchingHostname(const QString &cn, const QString &hostname)
3057{
3058 qsizetype wildcard = cn.indexOf(u'*');
3059
3060 // Check this is a wildcard cert, if not then just compare the strings
3061 if (wildcard < 0)
3062 return QLatin1StringView(QUrl::toAce(cn)) == hostname;
3063
3064 qsizetype firstCnDot = cn.indexOf(u'.');
3065 qsizetype secondCnDot = cn.indexOf(u'.', firstCnDot+1);
3066
3067 // Check at least 3 components
3068 if ((-1 == secondCnDot) || (secondCnDot+1 >= cn.size()))
3069 return false;
3070
3071 // Check * is last character of 1st component (ie. there's a following .)
3072 if (wildcard+1 != firstCnDot)
3073 return false;
3074
3075 // Check only one star
3076 if (cn.lastIndexOf(u'*') != wildcard)
3077 return false;
3078
3079 // Reject wildcard character embedded within the A-labels or U-labels of an internationalized
3080 // domain name (RFC6125 section 7.2)
3081 if (cn.startsWith("xn--"_L1, Qt::CaseInsensitive))
3082 return false;
3083
3084 // Check characters preceding * (if any) match
3085 if (wildcard && QStringView{hostname}.left(wildcard).compare(QStringView{cn}.left(wildcard), Qt::CaseInsensitive) != 0)
3086 return false;
3087
3088 // Check characters following first . match
3089 qsizetype hnDot = hostname.indexOf(u'.');
3090 if (QStringView{hostname}.mid(hnDot + 1) != QStringView{cn}.mid(firstCnDot + 1)
3091 && QStringView{hostname}.mid(hnDot + 1) != QLatin1StringView(QUrl::toAce(cn.mid(firstCnDot + 1)))) {
3092 return false;
3093 }
3094
3095 // Check if the hostname is an IP address, if so then wildcards are not allowed
3096 QHostAddress addr(hostname);
3097 if (!addr.isNull())
3098 return false;
3099
3100 // Ok, I guess this was a wildcard CN and the hostname matches.
3101 return true;
3102}
3103
3104/*!
3105 \internal
3106*/
3107QTlsBackend *QSslSocketPrivate::tlsBackendInUse()
3108{
3109 const QMutexLocker locker(&backendMutex);
3110 if (tlsBackend)
3111 return tlsBackend;
3112
3113 if (!activeBackendName.size())
3114 activeBackendName = QTlsBackend::defaultBackendName();
3115
3116 if (!activeBackendName.size()) {
3117 qCWarning(lcSsl, "No functional TLS backend was found");
3118 return nullptr;
3119 }
3120
3121 tlsBackend = QTlsBackend::findBackend(activeBackendName);
3122 if (tlsBackend) {
3123 QObject::connect(tlsBackend, &QObject::destroyed, tlsBackend, [] {
3124 const QMutexLocker locker(&backendMutex);
3125 tlsBackend = nullptr;
3126 },
3127 Qt::DirectConnection);
3128 }
3129 return tlsBackend;
3130}
3131
3132/*!
3133 \internal
3134*/
3135QSslSocket::SslMode QSslSocketPrivate::tlsMode() const
3136{
3137 return mode;
3138}
3139
3140/*!
3141 \internal
3142*/
3143bool QSslSocketPrivate::isRootsOnDemandAllowed() const
3144{
3145 return allowRootCertOnDemandLoading;
3146}
3147
3148/*!
3149 \internal
3150*/
3151QString QSslSocketPrivate::verificationName() const
3152{
3153 return verificationPeerName;
3154}
3155
3156/*!
3157 \internal
3158*/
3159QString QSslSocketPrivate::tlsHostName() const
3160{
3161 return hostName;
3162}
3163
3164QTcpSocket *QSslSocketPrivate::plainTcpSocket() const
3165{
3166 return plainSocket;
3167}
3168
3169/*!
3170 \internal
3171*/
3172QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
3173{
3174 if (const auto *tlsBackend = tlsBackendInUse())
3175 return tlsBackend->systemCaCertificates();
3176 return {};
3177}
3178
3179QT_END_NAMESPACE
3180
3181#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