1/****************************************************************************
2**
3** Copyright (C) 2017 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 QDTLS_P_H
41#define QDTLS_P_H
42
43#include <private/qtnetworkglobal_p.h>
44
45#include "qdtls.h"
46
47#include <private/qsslconfiguration_p.h>
48#include <private/qobject_p.h>
49
50#include <QtNetwork/qabstractsocket.h>
51#include <QtNetwork/qhostaddress.h>
52#include <QtNetwork/qsslsocket.h>
53#include <QtNetwork/qsslcipher.h>
54#include <QtNetwork/qssl.h>
55
56#include <QtCore/qcryptographichash.h>
57#include <QtCore/qbytearray.h>
58#include <QtCore/qstring.h>
59
60//
61// W A R N I N G
62// -------------
63//
64// This file is not part of the Qt API. It exists purely as an
65// implementation detail. This header file may change from version to
66// version without notice, or even be removed.
67//
68// We mean it.
69//
70
71QT_REQUIRE_CONFIG(dtls);
72
73QT_BEGIN_NAMESPACE
74
75class QHostAddress;
76
77class QDtlsBasePrivate : public QObjectPrivate
78{
79public:
80
81 void setDtlsError(QDtlsError code, const QString &description)
82 {
83 errorCode = code;
84 errorDescription = description;
85 }
86
87 void clearDtlsError()
88 {
89 errorCode = QDtlsError::NoError;
90 errorDescription.clear();
91 }
92
93 void setConfiguration(const QSslConfiguration &configuration);
94 QSslConfiguration configuration() const;
95
96 bool setCookieGeneratorParameters(QCryptographicHash::Algorithm alg,
97 const QByteArray &secret);
98
99 static bool isDtlsProtocol(QSsl::SslProtocol protocol);
100
101 QHostAddress remoteAddress;
102 quint16 remotePort = 0;
103 quint16 mtuHint = 0;
104
105 QDtlsError errorCode = QDtlsError::NoError;
106 QString errorDescription;
107 QSslConfigurationPrivate dtlsConfiguration;
108 QSslSocket::SslMode mode = QSslSocket::SslClientMode;
109 QSslCipher sessionCipher;
110 QSsl::SslProtocol sessionProtocol = QSsl::UnknownProtocol;
111 QString peerVerificationName;
112 QByteArray secret;
113
114#ifdef QT_CRYPTOGRAPHICHASH_ONLY_SHA1
115 QCryptographicHash::Algorithm hashAlgorithm = QCryptographicHash::Sha1;
116#else
117 QCryptographicHash::Algorithm hashAlgorithm = QCryptographicHash::Sha256;
118#endif
119};
120
121class QDtlsClientVerifierPrivate : public QDtlsBasePrivate
122{
123public:
124
125 QByteArray verifiedClientHello;
126
127 virtual bool verifyClient(QUdpSocket *socket, const QByteArray &dgram,
128 const QHostAddress &address, quint16 port) = 0;
129};
130
131class QDtlsPrivate : public QDtlsBasePrivate
132{
133public:
134
135 virtual bool startHandshake(QUdpSocket *socket, const QByteArray &dgram) = 0;
136 virtual bool handleTimeout(QUdpSocket *socket) = 0;
137 virtual bool continueHandshake(QUdpSocket *socket, const QByteArray &dgram) = 0;
138 virtual bool resumeHandshake(QUdpSocket *socket) = 0;
139 virtual void abortHandshake(QUdpSocket *socket) = 0;
140 virtual void sendShutdownAlert(QUdpSocket *socket) = 0;
141
142 virtual qint64 writeDatagramEncrypted(QUdpSocket *socket, const QByteArray &dgram) = 0;
143 virtual QByteArray decryptDatagram(QUdpSocket *socket, const QByteArray &dgram) = 0;
144
145 QDtls::HandshakeState handshakeState = QDtls::HandshakeNotStarted;
146
147 QVector<QSslError> tlsErrors;
148 QVector<QSslError> tlsErrorsToIgnore;
149
150 bool connectionEncrypted = false;
151};
152
153QT_END_NAMESPACE
154
155#endif // QDTLS_P_H
156

source code of qtbase/src/network/ssl/qdtls_p.h