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
qtlskey_st.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// Copyright (C) 2014 Jeremy Lainé <jeremy.laine@m4x.org>
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:critical reason:cryptography
5
6#include "qtlskey_st_p.h"
7
8#include <QtNetwork/private/qsslkey_p.h>
9
10#include <QtCore/qbytearray.h>
11
12#include <CommonCrypto/CommonCrypto.h>
13
14#include <cstddef>
15
16QT_BEGIN_NAMESPACE
17
18namespace QTlsPrivate {
19namespace {
20
21// Before this code was located in qsslkey_mac.cpp.
22QByteArray wrapCCCrypt(CCOperation ccOp, QSslKeyPrivate::Cipher cipher,
23 const QByteArray &data, const QByteArray &key,
24 const QByteArray &iv)
25{
26 int blockSize = {};
27 CCAlgorithm ccAlgorithm = {};
28 switch (cipher) {
29 case Cipher::DesCbc:
30 blockSize = kCCBlockSizeDES;
31 ccAlgorithm = kCCAlgorithmDES;
32 break;
33 case Cipher::DesEde3Cbc:
34 blockSize = kCCBlockSize3DES;
35 ccAlgorithm = kCCAlgorithm3DES;
36 break;
37 case Cipher::Rc2Cbc:
38 blockSize = kCCBlockSizeRC2;
39 ccAlgorithm = kCCAlgorithmRC2;
40 break;
41 case Cipher::Aes128Cbc:
42 case Cipher::Aes192Cbc:
43 case Cipher::Aes256Cbc:
44 blockSize = kCCBlockSizeAES128;
45 ccAlgorithm = kCCAlgorithmAES;
46 break;
47 }
48 std::size_t plainLength = 0;
49 QByteArray plain(data.size() + blockSize, 0);
50 CCCryptorStatus status = CCCrypt(ccOp, ccAlgorithm, kCCOptionPKCS7Padding,
51 key.constData(), std::size_t(key.size()),
52 iv.constData(), data.constData(), std::size_t(data.size()),
53 plain.data(), std::size_t(plain.size()), &plainLength);
54 if (status == kCCSuccess)
55 return plain.left(int(plainLength));
56
57 return {};
58}
59
60} // Unnamed namespace.
61
62QByteArray TlsKeySecureTransport::decrypt(Cipher cipher, const QByteArray &data,
63 const QByteArray &key, const QByteArray &iv) const
64{
65 return wrapCCCrypt(kCCDecrypt, cipher, data, key, iv);
66}
67
68QByteArray TlsKeySecureTransport::encrypt(Cipher cipher, const QByteArray &data,
69 const QByteArray &key, const QByteArray &iv) const
70{
71 return wrapCCCrypt(kCCEncrypt, cipher, data, key, iv);
72}
73
74} // namespace QTlsPrivate
75
76QT_END_NAMESPACE
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
Namespace containing onternal types that TLS backends implement.