24const wchar_t *
getName(QSslKeyPrivate::Cipher cipher)
27 case QTlsPrivate::Cipher::DesCbc:
28 return BCRYPT_DES_ALGORITHM;
29 case QTlsPrivate::Cipher::DesEde3Cbc:
30 return BCRYPT_3DES_ALGORITHM;
31 case QTlsPrivate::Cipher::Rc2Cbc:
32 return BCRYPT_RC2_ALGORITHM;
33 case QTlsPrivate::Cipher::Aes128Cbc:
34 case QTlsPrivate::Cipher::Aes192Cbc:
35 case QTlsPrivate::Cipher::Aes256Cbc:
36 return BCRYPT_AES_ALGORITHM;
59 const QByteArray &key)
61 BCRYPT_KEY_HANDLE keyHandle;
62 NTSTATUS status = BCryptGenerateSymmetricKey(
67 reinterpret_cast<
unsigned char *>(
const_cast<
char *>(key.data())),
72 qCWarning(lcTlsBackendSchannel,
"Failed to generate symmetric key (%ld)!", status);
76 status = BCryptSetProperty(
79 reinterpret_cast<UCHAR *>(
const_cast<
wchar_t *>(BCRYPT_CHAIN_MODE_CBC)),
80 ARRAYSIZE(BCRYPT_CHAIN_MODE_CBC),
84 BCryptDestroyKey(keyHandle);
85 qCWarning(lcTlsBackendSchannel,
"Failed to change the symmetric key's chaining mode (%ld)!",
92QByteArray doCrypt(QSslKeyPrivate::Cipher cipher,
const QByteArray &data,
const QByteArray &key,
93 const QByteArray &iv,
bool encrypt)
95 BCRYPT_ALG_HANDLE handle = getHandle(cipher);
98 auto handleDealloc = qScopeGuard([&handle]() {
99 BCryptCloseAlgorithmProvider(handle, 0);
102 BCRYPT_KEY_HANDLE keyHandle = generateSymmetricKey(handle, key);
105 auto keyHandleDealloc = qScopeGuard([&keyHandle]() {
106 BCryptDestroyKey(keyHandle);
109 QByteArray ivCopy = iv;
111 ULONG sizeNeeded = 0;
112 QVarLengthArray<
unsigned char> output;
113 auto cryptFunction = encrypt ? BCryptEncrypt : BCryptDecrypt;
114 for (
int i = 0; i < 2; i++) {
115 output.resize(
int(sizeNeeded));
116 auto input =
reinterpret_cast<
unsigned char *>(
const_cast<
char *>(data.data()));
118 NTSTATUS status = cryptFunction(
121 ULONG(data.length()),
123 reinterpret_cast<
unsigned char *>(ivCopy.data()),
124 ULONG(ivCopy.length()),
125 sizeNeeded ? output.data() :
nullptr,
126 ULONG(output.length()),
131 qCWarning(lcTlsBackendSchannel,
"%s failed (%ld)!", encrypt ?
"Encrypt" :
"Decrypt",
137 return QByteArray(
reinterpret_cast<
const char *>(output.constData()),
int(sizeNeeded));