4#include <QtNetwork/private/qssl_p.h>
9#include "../shared/qwincrypt_p.h"
11#include <QtNetwork/private/qtlsbackend_p.h>
12#include <QtNetwork/private/qsslkey_p.h>
14#include <QtNetwork/qsslkey.h>
16#include <QtCore/qscopeguard.h>
17#include <QtCore/qbytearray.h>
18#include <QtCore/qvarlengtharray.h>
27 return BCRYPT_DES_ALGORITHM;
29 return BCRYPT_3DES_ALGORITHM;
31 return BCRYPT_RC2_ALGORITHM;
35 return BCRYPT_AES_ALGORITHM;
43 NTSTATUS status = BCryptOpenAlgorithmProvider(
50 qCWarning(lcTlsBackendSchannel,
"Failed to open algorithm handle (%ld)!", status);
60 BCRYPT_KEY_HANDLE keyHandle;
61 NTSTATUS status = BCryptGenerateSymmetricKey(
66 reinterpret_cast<unsigned char *
>(
const_cast<char *
>(
key.data())),
71 qCWarning(lcTlsBackendSchannel,
"Failed to generate symmetric key (%ld)!", status);
75 status = BCryptSetProperty(
78 reinterpret_cast<UCHAR *
>(
const_cast<wchar_t *
>(BCRYPT_CHAIN_MODE_CBC)),
79 ARRAYSIZE(BCRYPT_CHAIN_MODE_CBC),
83 BCryptDestroyKey(keyHandle);
84 qCWarning(lcTlsBackendSchannel,
"Failed to change the symmetric key's chaining mode (%ld)!",
98 BCryptCloseAlgorithmProvider(
handle, 0);
104 auto keyHandleDealloc =
qScopeGuard([&keyHandle]() {
105 BCryptDestroyKey(keyHandle);
110 ULONG sizeNeeded = 0;
112 auto cryptFunction = encrypt ? BCryptEncrypt : BCryptDecrypt;
113 for (
int i = 0;
i < 2;
i++) {
114 output.resize(
int(sizeNeeded));
115 auto input =
reinterpret_cast<unsigned char *
>(
const_cast<char *
>(
data.data()));
117 NTSTATUS status = cryptFunction(
120 ULONG(
data.length()),
122 reinterpret_cast<unsigned char *
>(ivCopy.data()),
123 ULONG(ivCopy.length()),
124 sizeNeeded ?
output.data() :
nullptr,
130 qCWarning(lcTlsBackendSchannel,
"%s failed (%ld)!", encrypt ?
"Encrypt" :
"Decrypt",
136 return QByteArray(
reinterpret_cast<const char *
>(
output.constData()),
int(sizeNeeded));
QByteArray decrypt(Cipher cipher, const QByteArray &data, const QByteArray &key, const QByteArray &iv) const override
QByteArray encrypt(Cipher cipher, const QByteArray &data, const QByteArray &key, const QByteArray &iv) const override
Combined button and popup list for selecting options.
const wchar_t * getName(QSslKeyPrivate::Cipher cipher)
BCRYPT_ALG_HANDLE getHandle(QSslKeyPrivate::Cipher cipher)
BCRYPT_KEY_HANDLE generateSymmetricKey(BCRYPT_ALG_HANDLE handle, const QByteArray &key)
Namespace containing onternal types that TLS backends implement.
QByteArray doCrypt(QSslKeyPrivate::Cipher cipher, const QByteArray &data, const QByteArray &key, const QByteArray &iv, bool enc)
#define qCWarning(category,...)
GLuint64 GLenum void * handle
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLenum GLenum input
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
QT_BEGIN_NAMESPACE typedef uchar * output