QtBase  v6.3.1
qtlsbackend_p.h
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2021 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtNetwork module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QTLSBACKEND_P_H
41 #define QTLSBACKEND_P_H
42 
43 //
44 // W A R N I N G
45 // -------------
46 //
47 // This file is not part of the Qt API. It exists purely as an
48 // implementation detail. This header file may change from version to
49 // version without notice, or even be removed.
50 //
51 // We mean it.
52 //
53 
54 #include <QtNetwork/private/qtnetworkglobal_p.h>
55 
56 #include "qsslconfiguration.h"
57 #include "qsslerror.h"
58 #include "qssl_p.h"
59 
60 #if QT_CONFIG(dtls)
61 #include "qdtls.h"
62 #endif
63 
64 #include <QtNetwork/qsslcertificate.h>
65 #include <QtNetwork/qsslcipher.h>
66 #include <QtNetwork/qsslkey.h>
67 #include <QtNetwork/qssl.h>
68 
69 #include <QtCore/qloggingcategory.h>
70 #include <QtCore/qsharedpointer.h>
71 #include <QtCore/qnamespace.h>
72 #include <QtCore/qobject.h>
73 #include <QtCore/qglobal.h>
74 #include <QtCore/qstring.h>
75 #include <QtCore/qlist.h>
76 #include <QtCore/qmap.h>
77 
78 #include <memory>
79 
81 
83 class QSslSocketPrivate;
84 class QHostAddress;
85 class QSslContext;
86 
87 class QSslSocket;
88 class QByteArray;
89 class QSslCipher;
90 class QUdpSocket;
91 class QIODevice;
92 class QSslError;
93 class QSslKey;
94 
95 namespace QTlsPrivate {
96 
97 class Q_NETWORK_PRIVATE_EXPORT TlsKey {
98 public:
99  virtual ~TlsKey();
100 
103 
104  virtual void decodeDer(KeyType type, KeyAlgorithm algorithm, const QByteArray &der,
105  const QByteArray &passPhrase, bool deepClear) = 0;
106  virtual void decodePem(KeyType type, KeyAlgorithm algorithm, const QByteArray &pem,
107  const QByteArray &passPhrase, bool deepClear) = 0;
108 
109  virtual QByteArray toPem(const QByteArray &passPhrase) const = 0;
110  virtual QByteArray derFromPem(const QByteArray &pem, QMap<QByteArray, QByteArray> *headers) const = 0;
111  virtual QByteArray pemFromDer(const QByteArray &der, const QMap<QByteArray, QByteArray> &headers) const = 0;
112 
114  virtual Qt::HANDLE handle() const = 0;
115 
116  virtual bool isNull() const = 0;
117  virtual KeyType type() const = 0;
118  virtual KeyAlgorithm algorithm() const = 0;
119  virtual int length() const = 0;
120 
121  virtual void clear(bool deepClear) = 0;
122 
123  virtual bool isPkcs8() const = 0;
124 
125  virtual QByteArray decrypt(Cipher cipher, const QByteArray &data,
126  const QByteArray &passPhrase, const QByteArray &iv) const = 0;
127  virtual QByteArray encrypt(Cipher cipher, const QByteArray &data,
128  const QByteArray &key, const QByteArray &iv) const = 0;
129 
130  QByteArray pemHeader() const;
131  QByteArray pemFooter() const;
132 };
133 
134 class Q_NETWORK_PRIVATE_EXPORT X509Certificate
135 {
136 public:
137  virtual ~X509Certificate();
138 
139  virtual bool isEqual(const X509Certificate &other) const = 0;
140  virtual bool isNull() const = 0;
141  virtual bool isSelfSigned() const = 0;
142  virtual QByteArray version() const = 0;
143  virtual QByteArray serialNumber() const = 0;
145  virtual QStringList issuerInfo(const QByteArray &attribute) const = 0;
147  virtual QStringList subjectInfo(const QByteArray &attribute) const = 0;
148 
152  virtual QDateTime effectiveDate() const = 0;
153  virtual QDateTime expiryDate() const = 0;
154 
155  virtual TlsKey *publicKey() const;
156 
157  // Extensions. Plugins do not expose internal representation
158  // and cannot rely on QSslCertificate's internals. Thus,
159  // we provide this information 'in pieces':
160  virtual qsizetype numberOfExtensions() const = 0;
161  virtual QString oidForExtension(qsizetype i) const = 0;
162  virtual QString nameForExtension(qsizetype i) const = 0;
163  virtual QVariant valueForExtension(qsizetype i) const = 0;
164  virtual bool isExtensionCritical(qsizetype i) const = 0;
165  virtual bool isExtensionSupported(qsizetype i) const = 0;
166 
167  virtual QByteArray toPem() const = 0;
168  virtual QByteArray toDer() const = 0;
169  virtual QString toText() const = 0;
170 
171  virtual Qt::HANDLE handle() const = 0;
172 
173  virtual size_t hash(size_t seed) const noexcept = 0;
174 };
175 
176 // TLSTODO: consider making those into virtuals in QTlsBackend. After all, we ask the backend
177 // to return those pointers if the functionality is supported, but it's a bit odd to have
178 // this level of indirection. They are not parts of the classes above because ...
179 // you'd then have to ask backend to create a certificate to ... call those
180 // functions on a certificate.
182  const QString &hostName);
186  QList<QSslCertificate> *caCertificates,
187  const QByteArray &passPhrase);
188 
189 #if QT_CONFIG(ssl)
190 // TLS over TCP. Handshake, encryption/decryption.
191 class Q_NETWORK_PRIVATE_EXPORT TlsCryptograph : public QObject
192 {
193 public:
194  virtual ~TlsCryptograph();
195 
196  virtual void init(QSslSocket *q, QSslSocketPrivate *d) = 0;
197  virtual void checkSettingSslContext(std::shared_ptr<QSslContext> tlsContext);
198  virtual std::shared_ptr<QSslContext> sslContext() const;
199 
200  virtual QList<QSslError> tlsErrors() const = 0;
201 
202  virtual void startClientEncryption() = 0;
203  virtual void startServerEncryption() = 0;
204  virtual void continueHandshake() = 0;
205  virtual void enableHandshakeContinuation();
206  virtual void disconnectFromHost() = 0;
207  virtual void disconnected() = 0;
208  virtual void cancelCAFetch();
209  virtual QSslCipher sessionCipher() const = 0;
210  virtual QSsl::SslProtocol sessionProtocol() const = 0;
211 
212  virtual void transmit() = 0;
213  virtual bool hasUndecryptedData() const;
214  virtual QList<QOcspResponse> ocsps() const;
215 
216  static bool isMatchingHostname(const QSslCertificate &cert, const QString &peerName);
217 
218  void setErrorAndEmit(QSslSocketPrivate *d, QAbstractSocket::SocketError errorCode,
219  const QString &errorDescription) const;
220 };
221 #else
222 class TlsCryptograph;
223 #endif // QT_CONFIG(ssl)
224 
225 #if QT_CONFIG(dtls)
226 
227 class Q_NETWORK_PRIVATE_EXPORT DtlsBase
228 {
229 public:
230  virtual ~DtlsBase();
231 
232  virtual void setDtlsError(QDtlsError code, const QString &description) = 0;
233 
234  virtual QDtlsError error() const = 0;
235  virtual QString errorString() const = 0;
236 
237  virtual void clearDtlsError() = 0;
238 
239  virtual void setConfiguration(const QSslConfiguration &configuration) = 0;
240  virtual QSslConfiguration configuration() const = 0;
241 
243  virtual bool setCookieGeneratorParameters(const GenParams &params) = 0;
244  virtual GenParams cookieGeneratorParameters() const = 0;
245 };
246 
247 // DTLS cookie: generation and verification.
248 class Q_NETWORK_EXPORT DtlsCookieVerifier : virtual public DtlsBase
249 {
250 public:
251  virtual bool verifyClient(QUdpSocket *socket, const QByteArray &dgram,
252  const QHostAddress &address, quint16 port) = 0;
253  virtual QByteArray verifiedHello() const = 0;
254 };
255 
256 // TLS over UDP. Handshake, encryption/decryption.
257 class Q_NETWORK_PRIVATE_EXPORT DtlsCryptograph : virtual public DtlsBase
258 {
259 public:
260 
261  virtual QSslSocket::SslMode cryptographMode() const = 0;
262  virtual void setPeer(const QHostAddress &addr, quint16 port, const QString &name) = 0;
263  virtual QHostAddress peerAddress() const = 0;
264  virtual quint16 peerPort() const = 0;
265  virtual void setPeerVerificationName(const QString &name) = 0;
266  virtual QString peerVerificationName() const = 0;
267 
268  virtual void setDtlsMtuHint(quint16 mtu) = 0;
269  virtual quint16 dtlsMtuHint() const = 0;
270 
271  virtual QDtls::HandshakeState state() const = 0;
272  virtual bool isConnectionEncrypted() const = 0;
273 
274  virtual bool startHandshake(QUdpSocket *socket, const QByteArray &dgram) = 0;
275  virtual bool handleTimeout(QUdpSocket *socket) = 0;
276  virtual bool continueHandshake(QUdpSocket *socket, const QByteArray &dgram) = 0;
277  virtual bool resumeHandshake(QUdpSocket *socket) = 0;
278  virtual void abortHandshake(QUdpSocket *socket) = 0;
279  virtual void sendShutdownAlert(QUdpSocket *socket) = 0;
280 
281  virtual QList<QSslError> peerVerificationErrors() const = 0;
282  virtual void ignoreVerificationErrors(const QList<QSslError> &errorsToIgnore) = 0;
283 
284  virtual QSslCipher dtlsSessionCipher() const = 0;
285  virtual QSsl::SslProtocol dtlsSessionProtocol() const = 0;
286 
287  virtual qint64 writeDatagramEncrypted(QUdpSocket *socket, const QByteArray &dgram) = 0;
288  virtual QByteArray decryptDatagram(QUdpSocket *socket, const QByteArray &dgram) = 0;
289 };
290 
291 #else
292 
293 class DtlsCookieVerifier;
294 class DtlsCryptograph;
295 
296 #endif // QT_CONFIG(dtls)
297 
298 } // namespace QTlsPrivate
299 
300 // Factory, creating back-end specific implementations of
301 // different entities QSslSocket is using.
302 class Q_NETWORK_EXPORT QTlsBackend : public QObject
303 {
304  Q_OBJECT
305 public:
306  QTlsBackend();
307  ~QTlsBackend() override;
308 
309  virtual bool isValid() const;
310  virtual long tlsLibraryVersionNumber() const;
311  virtual QString tlsLibraryVersionString() const;
312  virtual long tlsLibraryBuildVersionNumber() const;
313  virtual QString tlsLibraryBuildVersionString() const;
314  virtual void ensureInitialized() const;
315 
316  virtual QString backendName() const = 0;
320 
321  // X509 and keys:
322  virtual QTlsPrivate::TlsKey *createKey() const;
323  virtual QTlsPrivate::X509Certificate *createCertificate() const;
324 
326 
327  // TLS and DTLS:
328  virtual QTlsPrivate::TlsCryptograph *createTlsCryptograph() const;
329  virtual QTlsPrivate::DtlsCryptograph *createDtlsCryptograph(class QDtls *qObject, int mode) const;
330  virtual QTlsPrivate::DtlsCookieVerifier *createDtlsCookieVerifier() const;
331 
332  // TLSTODO - get rid of these function pointers, make them virtuals in
333  // the backend itself. X509 machinery:
334  virtual QTlsPrivate::X509ChainVerifyPtr X509Verifier() const;
335  virtual QTlsPrivate::X509PemReaderPtr X509PemReader() const;
336  virtual QTlsPrivate::X509DerReaderPtr X509DerReader() const;
337  virtual QTlsPrivate::X509Pkcs12ReaderPtr X509Pkcs12Reader() const;
338 
339  // Elliptic curves:
340  virtual QList<int> ellipticCurvesIds() const;
341  virtual int curveIdFromShortName(const QString &name) const;
342  virtual int curveIdFromLongName(const QString &name) const;
343  virtual QString shortNameForId(int cid) const;
344  virtual QString longNameForId(int cid) const;
345  virtual bool isTlsNamedCurve(int cid) const;
346 
347  // Note: int and not QSslDiffieHellmanParameter::Error - because this class and
348  // its enum are QT_CONFIG(ssl)-conditioned. But not QTlsBackend and
349  // its virtual functions. DH decoding:
350  virtual int dhParametersFromDer(const QByteArray &derData, QByteArray *data) const;
351  virtual int dhParametersFromPem(const QByteArray &pemData, QByteArray *data) const;
352 
353  static QList<QString> availableBackendNames();
354  static QString defaultBackendName();
355  static QTlsBackend *findBackend(const QString &backendName);
356  static QTlsBackend *activeOrAnyBackend();
357 
358  static QList<QSsl::SslProtocol> supportedProtocols(const QString &backendName);
359  static QList<QSsl::SupportedFeature> supportedFeatures(const QString &backendName);
360  static QList<QSsl::ImplementedClass> implementedClasses(const QString &backendName);
361 
362  // Built-in, this is what Qt provides out of the box (depending on OS):
363  static constexpr const int nameIndexSchannel = 0;
364  static constexpr const int nameIndexSecureTransport = 1;
365  static constexpr const int nameIndexOpenSSL = 2;
366  static constexpr const int nameIndexCertOnly = 3;
367 
368  static const QString builtinBackendNames[];
369 
370  template<class DynamicType, class TLSObject>
371  static DynamicType *backend(const TLSObject &o)
372  {
373  return static_cast<DynamicType *>(o.d->backend.get());
374  }
375 
376  static void resetBackend(QSslKey &key, QTlsPrivate::TlsKey *keyBackend);
377 
378  static void setupClientPskAuth(QSslPreSharedKeyAuthenticator *auth, const char *hint,
379  int hintLength, unsigned maxIdentityLen, unsigned maxPskLen);
380  static void setupServerPskAuth(QSslPreSharedKeyAuthenticator *auth, const char *identity,
381  const QByteArray &identityHint, unsigned maxPskLen);
382 #if QT_CONFIG(ssl)
383  static QSslCipher createCiphersuite(const QString &description, int bits, int supportedBits);
384  static QSslCipher createCiphersuite(const QString &suiteName, QSsl::SslProtocol protocol,
385  const QString &protocolString);
386  static QSslCipher createCipher(const QString &name, QSsl::SslProtocol protocol,
387  const QString &protocolString);
388 
389  // Those statics are implemented using QSslSocketPrivate (which is not exported,
390  // unlike QTlsBackend).
392  static QList<QSslCipher> defaultDtlsCiphers();
393 
394  static void setDefaultCiphers(const QList<QSslCipher> &ciphers);
395  static void setDefaultDtlsCiphers(const QList<QSslCipher> &ciphers);
396  static void setDefaultSupportedCiphers(const QList<QSslCipher> &ciphers);
397 
398  static void resetDefaultEllipticCurves();
399 
400  static void setDefaultCaCertificates(const QList<QSslCertificate> &certs);
401 
402  // Many thanks to people who designed QSslConfiguration with hidden
403  // data-members, that sneakily set by some 'friend' classes, having
404  // some twisted logic.
405  static bool rootLoadingOnDemandAllowed(const QSslConfiguration &configuration);
406  static void storePeerCertificate(QSslConfiguration &configuration, const QSslCertificate &peerCert);
407  static void storePeerCertificateChain(QSslConfiguration &configuration,
408  const QList<QSslCertificate> &peerCertificateChain);
409  static void clearPeerCertificates(QSslConfiguration &configuration);
410  // And those are even worse, this is where we don't have the original configuration,
411  // and can have only a copy. So instead we go to d->privateConfiguration.someMember:
412  static void clearPeerCertificates(QSslSocketPrivate *d);
413  static void setPeerSessionShared(QSslSocketPrivate *d, bool shared);
414  static void setSessionAsn1(QSslSocketPrivate *d, const QByteArray &asn1);
415  static void setSessionLifetimeHint(QSslSocketPrivate *d, int hint);
416  using AlpnNegotiationStatus = QSslConfiguration::NextProtocolNegotiationStatus;
417  static void setAlpnStatus(QSslSocketPrivate *d, AlpnNegotiationStatus st);
418  static void setNegotiatedProtocol(QSslSocketPrivate *d, const QByteArray &protocol);
419  static void storePeerCertificate(QSslSocketPrivate *d, const QSslCertificate &peerCert);
420  static void storePeerCertificateChain(QSslSocketPrivate *d, const QList<QSslCertificate> &peerChain);
421  static void addTustedRoot(QSslSocketPrivate *d, const QSslCertificate &rootCert);// TODO: "addTrusted..."
422  // The next one - is a "very important" feature! Kidding ...
423  static void setEphemeralKey(QSslSocketPrivate *d, const QSslKey &key);
424 
425  virtual void forceAutotestSecurityLevel();
426 #endif // QT_CONFIG(ssl)
427 
429 };
430 
431 #define QTlsBackend_iid "org.qt-project.Qt.QTlsBackend"
433 
435 
436 #endif // QTLSBACKEND_P_H
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
FT_Error error
Definition: cffdrivr.c:657
The QByteArray class provides an array of bytes.
Definition: qbytearray.h:85
The QDateTime class provides date and time functions.
Definition: qdatetime.h:238
This class provides encryption for UDP sockets.
Definition: qdtls.h:119
HandshakeState
Describes the current state of DTLS handshake.
Definition: qdtls.h:125
The QHostAddress class provides an IP address.\inmodule QtNetwork.
Definition: qhostaddress.h:74
The QIODevice class is the base interface class of all I/O devices in Qt.
Definition: qiodevice.h:70
The QObject class is the base class of all Qt objects.
Definition: qobject.h:125
The QSslCertificate class provides a convenient API for an X509 certificate.
The QSslCipher class represents an SSL cryptographic cipher.
Definition: qsslcipher.h:58
The QSslConfiguration class holds the configuration and state of an SSL connection.
The QSslError class provides an SSL error.
Definition: qsslerror.h:57
The QSslKey class provides an interface for private and public keys.
Definition: qsslkey.h:59
The QSslPreSharedKeyAuthenticator class provides authentication data for pre shared keys (PSK) cipher...
The QSslSocket class provides an SSL encrypted socket for both clients and servers.
Definition: qsslsocket.h:65
The QString class provides a Unicode character string.
Definition: qstring.h:388
The QStringList class provides a list of strings.
virtual QString backendName() const =0
static DynamicType * backend(const TLSObject &o)
virtual QList< QSsl::SupportedFeature > supportedFeatures() const =0
virtual QList< QSsl::ImplementedClass > implementedClasses() const =0
virtual QList< QSsl::SslProtocol > supportedProtocols() const =0
virtual void clear(bool deepClear)=0
virtual QByteArray derFromPem(const QByteArray &pem, QMap< QByteArray, QByteArray > *headers) const =0
virtual void fromHandle(Qt::HANDLE handle, KeyType type)=0
virtual void decodeDer(KeyType type, KeyAlgorithm algorithm, const QByteArray &der, const QByteArray &passPhrase, bool deepClear)=0
virtual QByteArray encrypt(Cipher cipher, const QByteArray &data, const QByteArray &key, const QByteArray &iv) const =0
virtual Qt::HANDLE handle() const =0
virtual bool isNull() const =0
virtual KeyType type() const =0
virtual QByteArray pemFromDer(const QByteArray &der, const QMap< QByteArray, QByteArray > &headers) const =0
virtual KeyAlgorithm algorithm() const =0
virtual int length() const =0
virtual bool isPkcs8() const =0
virtual QByteArray decrypt(Cipher cipher, const QByteArray &data, const QByteArray &passPhrase, const QByteArray &iv) const =0
virtual void decodePem(KeyType type, KeyAlgorithm algorithm, const QByteArray &pem, const QByteArray &passPhrase, bool deepClear)=0
virtual QByteArray toPem(const QByteArray &passPhrase) const =0
virtual QMultiMap< QSsl::AlternativeNameEntryType, QString > subjectAlternativeNames() const =0
virtual QDateTime expiryDate() const =0
virtual QList< QByteArray > issuerInfoAttributes() const =0
virtual QStringList subjectInfo(const QByteArray &attribute) const =0
virtual bool isExtensionSupported(qsizetype i) const =0
virtual QStringList issuerInfo(const QByteArray &attribute) const =0
virtual size_t hash(size_t seed) const noexcept=0
virtual bool isNull() const =0
virtual QByteArray version() const =0
virtual QString oidForExtension(qsizetype i) const =0
virtual Qt::HANDLE handle() const =0
virtual QList< QByteArray > subjectInfoAttributes() const =0
virtual bool isEqual(const X509Certificate &other) const =0
virtual QByteArray toPem() const =0
virtual QString toText() const =0
virtual QVariant valueForExtension(qsizetype i) const =0
virtual QString nameForExtension(qsizetype i) const =0
virtual QStringList issuerInfo(QSslCertificate::SubjectInfo subject) const =0
virtual bool isSelfSigned() const =0
virtual QStringList subjectInfo(QSslCertificate::SubjectInfo subject) const =0
virtual QDateTime effectiveDate() const =0
virtual qsizetype numberOfExtensions() const =0
virtual QByteArray serialNumber() const =0
virtual QByteArray toDer() const =0
virtual bool isExtensionCritical(qsizetype i) const =0
The QUdpSocket class provides a UDP socket.
Definition: qudpsocket.h:57
The QVariant class acts like a union for the most common Qt data types.
Definition: qvariant.h:95
else opt state
[0]
KeyType
Definition: qssl.h:51
KeyAlgorithm
Definition: qssl.h:61
SslProtocol
Definition: qssl.h:75
QList< QSslCipher > defaultCiphers()
QList< QSslCertificate > systemCaCertificates()
bool(*)(QIODevice *device, QSslKey *key, QSslCertificate *cert, QList< QSslCertificate > *caCertificates, const QByteArray &passPhrase) X509Pkcs12ReaderPtr
QList< QSslCertificate >(*)(const QByteArray &pem, int count) X509PemReaderPtr
void * HANDLE
Definition: qnamespace.h:1561
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro vuzp8 reg2 vuzp d d &reg2 endm macro vzip8 reg2 vzip d d &reg2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld init[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1 beq endif SRC MASK if dst_r_bpp DST_R else add endif PF add sub src_basereg pixdeinterleave mask_basereg pixdeinterleave dst_r_basereg process_pixblock_head pixblock_size cache_preload_simple process_pixblock_tail pixinterleave dst_w_basereg irp beq endif process_pixblock_tail_head tst beq irp if pixblock_size chunk_size tst beq pixld SRC pixld MASK if DST_R else pixld DST_R endif if src_basereg pixdeinterleave mask_basereg pixdeinterleave dst_r_basereg process_pixblock_head if pixblock_size cache_preload_simple endif process_pixblock_tail pixinterleave dst_w_basereg irp if pixblock_size chunk_size tst beq if DST_W else pixst DST_W else mov ORIG_W endif add lsl if lsl endif if lsl endif lsl endif lsl endif lsl endif subs mov DST_W if regs_shortage str endif bge start_of_loop_label endm macro generate_composite_function
QDtlsError
Definition: qdtls.h:61
EGLOutputPortEXT port
EGLOutputLayerEXT EGLint attribute
#define Q_DISABLE_COPY_MOVE(Class)
Definition: qglobal.h:519
unsigned short quint16
Definition: qglobal.h:286
ptrdiff_t qsizetype
Definition: qglobal.h:308
long long qint64
Definition: qglobal.h:298
GLenum type
Definition: qopengl.h:270
GLuint64 GLenum void * handle
GLenum mode
GLuint64 key
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint name
void ** params
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
Definition: qopenglext.h:6904
GLuint GLuint64EXT address
Definition: qopenglext.h:11428
GLdouble GLdouble GLdouble GLdouble q
Definition: qopenglext.h:259
#define QTlsBackend_iid
Q_DECLARE_INTERFACE(QTlsBackend, QTlsBackend_iid)
#define Q_OBJECT
Definition: qtmetamacros.h:158
QTcpSocket * socket
[1]
QSharedPointer< T > other(t)
[5]
QList< QSslCertificate > cert
[0]
socket disconnectFromHost()
[0]
clientDtls setPeer(address, port, peerName)
dtls ignoreVerificationErrors(expectedSslErrors)
const auto certs
[1]
This class defines parameters for DTLS cookie generator.
Definition: qdtls.h:89
Definition: inftrees.h:24