Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qtlskey_base.cpp
Go to the documentation of this file.
1
// Copyright (C) 2021 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
include
"qtlskey_base_p.h"
6
#
include
"qasn1element_p.h"
7
8
QT_BEGIN_NAMESPACE
9
10
namespace
QTlsPrivate
{
11
12
QByteArray
TlsKeyBase
::
pemFromDer
(
const
QByteArray &der,
const
QMap<QByteArray, QByteArray> &headers)
const
13
{
14
QByteArray pem(der.toBase64());
15
16
const
int
lineWidth = 64;
// RFC 1421
17
const
int
newLines = pem.size() / lineWidth;
18
const
bool
rem = pem.size() % lineWidth;
19
20
for
(
int
i = 0; i < newLines; ++i)
21
pem.insert((i + 1) * lineWidth + i,
'\n'
);
22
if
(rem)
23
pem.append(
'\n'
);
24
25
QByteArray extra;
26
if
(!headers.isEmpty()) {
27
QMap<QByteArray, QByteArray>::const_iterator it = headers.constEnd();
28
do
{
29
--it;
30
extra += it.key() +
": "
+ it.value() +
'\n'
;
31
}
while
(it != headers.constBegin());
32
extra +=
'\n'
;
33
}
34
35
if
(isEncryptedPkcs8(der)) {
36
pem.prepend(pkcs8Header(
true
) +
'\n'
+ extra);
37
pem.append(pkcs8Footer(
true
) +
'\n'
);
38
}
else
if
(
isPkcs8
(
)
) {
39
pem.prepend(pkcs8Header(
false
) +
'\n'
+ extra);
40
pem.append(pkcs8Footer(
false
) +
'\n'
);
41
}
else
{
42
pem.prepend(pemHeader() +
'\n'
+ extra);
43
pem.append(pemFooter() +
'\n'
);
44
}
45
46
return
pem;
47
}
48
49
QByteArray
TlsKeyBase
::pkcs8Header(
bool
encrypted)
50
{
51
return
encrypted
52
? QByteArrayLiteral(
"-----BEGIN ENCRYPTED PRIVATE KEY-----"
)
53
: QByteArrayLiteral(
"-----BEGIN PRIVATE KEY-----"
);
54
}
55
56
QByteArray
TlsKeyBase
::pkcs8Footer(
bool
encrypted)
57
{
58
return
encrypted
59
? QByteArrayLiteral(
"-----END ENCRYPTED PRIVATE KEY-----"
)
60
: QByteArrayLiteral(
"-----END PRIVATE KEY-----"
);
61
}
62
63
bool
TlsKeyBase
::isEncryptedPkcs8(
const
QByteArray &der)
64
{
65
static
const
QList<QByteArray> pbes1OIds {
66
// PKCS5
67
{
PKCS5_MD2_DES_CBC_OID
}, {
PKCS5_MD2_RC2_CBC_OID
}, {
PKCS5_MD5_DES_CBC_OID
},
68
{
PKCS5_MD5_RC2_CBC_OID
}, {
PKCS5_SHA1_DES_CBC_OID
}, {
PKCS5_SHA1_RC2_CBC_OID
},
69
};
70
QAsn1Element
elem;
71
if
(!elem.read(der) || elem.type() !=
QAsn1Element
::
SequenceType
)
72
return
false
;
73
74
const
auto
items = elem.toList();
75
if
(items.size() != 2
76
|| items[0].type() !=
QAsn1Element
::
SequenceType
77
|| items[1].type() !=
QAsn1Element
::
OctetStringType
) {
78
return
false
;
79
}
80
81
const
auto
encryptionSchemeContainer = items[0].toList();
82
if
(encryptionSchemeContainer.size() != 2
83
|| encryptionSchemeContainer[0].type() !=
QAsn1Element
::
ObjectIdentifierType
84
|| encryptionSchemeContainer[1].type() !=
QAsn1Element
::
SequenceType
) {
85
return
false
;
86
}
87
88
const
QByteArray encryptionScheme = encryptionSchemeContainer[0].toObjectId();
89
return
encryptionScheme ==
PKCS5_PBES2_ENCRYPTION_OID
90
|| pbes1OIds.contains(encryptionScheme)
91
|| encryptionScheme.startsWith(
PKCS12_OID
);
92
}
93
94
}
// namespace QTlsPrivate
95
96
QT_END_NAMESPACE
QAsn1Element
Definition
qasn1element_p.h:92
QAsn1Element::OctetStringType
@ OctetStringType
Definition
qasn1element_p.h:99
QAsn1Element::SequenceType
@ SequenceType
Definition
qasn1element_p.h:107
QAsn1Element::ObjectIdentifierType
@ ObjectIdentifierType
Definition
qasn1element_p.h:101
QTlsPrivate::TlsKeyBase
Definition
qtlskey_base_p.h:32
QTlsPrivate::TlsKeyBase::isPkcs8
bool isPkcs8() const override
Definition
qtlskey_base_p.h:52
QTlsPrivate::TlsKeyBase::pemFromDer
QByteArray pemFromDer(const QByteArray &der, const QMap< QByteArray, QByteArray > &headers) const override
Definition
qtlskey_base.cpp:12
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QTlsPrivate
Namespace containing onternal types that TLS backends implement.
Definition
qocspresponse.h:41
PKCS5_MD2_DES_CBC_OID
#define PKCS5_MD2_DES_CBC_OID
Definition
qasn1element_p.h:49
PKCS5_MD5_DES_CBC_OID
#define PKCS5_MD5_DES_CBC_OID
Definition
qasn1element_p.h:51
PKCS12_OID
#define PKCS12_OID
Definition
qasn1element_p.h:46
PKCS5_PBES2_ENCRYPTION_OID
#define PKCS5_PBES2_ENCRYPTION_OID
Definition
qasn1element_p.h:66
PKCS5_SHA1_RC2_CBC_OID
#define PKCS5_SHA1_RC2_CBC_OID
Definition
qasn1element_p.h:54
PKCS5_MD2_RC2_CBC_OID
#define PKCS5_MD2_RC2_CBC_OID
Definition
qasn1element_p.h:50
PKCS5_MD5_RC2_CBC_OID
#define PKCS5_MD5_RC2_CBC_OID
Definition
qasn1element_p.h:52
PKCS5_SHA1_DES_CBC_OID
#define PKCS5_SHA1_DES_CBC_OID
Definition
qasn1element_p.h:53
qtbase
src
plugins
tls
shared
qtlskey_base.cpp
Generated on
for Qt by
1.18.0