1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2014 Jeremy Lainé <jeremy.laine@m4x.org> |
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 | |
41 | #ifndef QASN1ELEMENT_P_H |
42 | #define QASN1ELEMENT_P_H |
43 | |
44 | // |
45 | // W A R N I N G |
46 | // ------------- |
47 | // |
48 | // This file is not part of the Qt API. It exists purely as an |
49 | // implementation detail. This header file may change from version to |
50 | // version without notice, or even be removed. |
51 | // |
52 | // We mean it. |
53 | // |
54 | |
55 | #include <QtNetwork/private/qtnetworkglobal_p.h> |
56 | #include <QtCore/qdatetime.h> |
57 | #include <QtCore/qmap.h> |
58 | |
59 | QT_BEGIN_NAMESPACE |
60 | |
61 | // General |
62 | #define RSADSI_OID "1.2.840.113549." |
63 | |
64 | #define RSA_ENCRYPTION_OID QByteArrayLiteral(RSADSI_OID "1.1.1") |
65 | #define DSA_ENCRYPTION_OID QByteArrayLiteral("1.2.840.10040.4.1") |
66 | #define EC_ENCRYPTION_OID QByteArrayLiteral("1.2.840.10045.2.1") |
67 | #define DH_ENCRYPTION_OID QByteArrayLiteral(RSADSI_OID "1.3.1") |
68 | |
69 | // These are mostly from the RFC for PKCS#5 |
70 | // PKCS#5: https://tools.ietf.org/html/rfc8018#appendix-B |
71 | #define PKCS5_OID RSADSI_OID "1.5." |
72 | // PKCS#12: https://tools.ietf.org/html/rfc7292#appendix-D) |
73 | #define PKCS12_OID RSADSI_OID "1.12." |
74 | |
75 | // -PBES1 |
76 | #define PKCS5_MD2_DES_CBC_OID QByteArrayLiteral(PKCS5_OID "1") // Not (yet) implemented |
77 | #define PKCS5_MD2_RC2_CBC_OID QByteArrayLiteral(PKCS5_OID "4") // Not (yet) implemented |
78 | #define PKCS5_MD5_DES_CBC_OID QByteArrayLiteral(PKCS5_OID "3") |
79 | #define PKCS5_MD5_RC2_CBC_OID QByteArrayLiteral(PKCS5_OID "6") |
80 | #define PKCS5_SHA1_DES_CBC_OID QByteArrayLiteral(PKCS5_OID "10") |
81 | #define PKCS5_SHA1_RC2_CBC_OID QByteArrayLiteral(PKCS5_OID "11") |
82 | #define PKCS12_SHA1_RC4_128_OID QByteArrayLiteral(PKCS12_OID "1.1") // Not (yet) implemented |
83 | #define PKCS12_SHA1_RC4_40_OID QByteArrayLiteral(PKCS12_OID "1.2") // Not (yet) implemented |
84 | #define PKCS12_SHA1_3KEY_3DES_CBC_OID QByteArrayLiteral(PKCS12_OID "1.3") |
85 | #define PKCS12_SHA1_2KEY_3DES_CBC_OID QByteArrayLiteral(PKCS12_OID "1.4") |
86 | #define PKCS12_SHA1_RC2_128_CBC_OID QByteArrayLiteral(PKCS12_OID "1.5") |
87 | #define PKCS12_SHA1_RC2_40_CBC_OID QByteArrayLiteral(PKCS12_OID "1.6") |
88 | |
89 | // -PBKDF2 |
90 | #define PKCS5_PBKDF2_ENCRYPTION_OID QByteArrayLiteral(PKCS5_OID "12") |
91 | |
92 | // -PBES2 |
93 | #define PKCS5_PBES2_ENCRYPTION_OID QByteArrayLiteral(PKCS5_OID "13") |
94 | |
95 | // Digest |
96 | #define DIGEST_ALGORITHM_OID RSADSI_OID "2." |
97 | // -HMAC-SHA-1 |
98 | #define HMAC_WITH_SHA1 QByteArrayLiteral(DIGEST_ALGORITHM_OID "7") |
99 | // -HMAC-SHA-2 |
100 | #define HMAC_WITH_SHA224 QByteArrayLiteral(DIGEST_ALGORITHM_OID "8") |
101 | #define HMAC_WITH_SHA256 QByteArrayLiteral(DIGEST_ALGORITHM_OID "9") |
102 | #define HMAC_WITH_SHA384 QByteArrayLiteral(DIGEST_ALGORITHM_OID "10") |
103 | #define HMAC_WITH_SHA512 QByteArrayLiteral(DIGEST_ALGORITHM_OID "11") |
104 | #define HMAC_WITH_SHA512_224 QByteArrayLiteral(DIGEST_ALGORITHM_OID "12") |
105 | #define HMAC_WITH_SHA512_256 QByteArrayLiteral(DIGEST_ALGORITHM_OID "13") |
106 | |
107 | // Encryption algorithms |
108 | #define ENCRYPTION_ALGORITHM_OID RSADSI_OID "3." |
109 | #define DES_CBC_ENCRYPTION_OID QByteArrayLiteral("1.3.14.3.2.7") |
110 | #define DES_EDE3_CBC_ENCRYPTION_OID QByteArrayLiteral(ENCRYPTION_ALGORITHM_OID "7") |
111 | #define RC2_CBC_ENCRYPTION_OID QByteArrayLiteral(ENCRYPTION_ALGORITHM_OID "2") |
112 | #define RC5_CBC_ENCRYPTION_OID QByteArrayLiteral(ENCRYPTION_ALGORITHM_OID "9") // Not (yet) implemented |
113 | #define AES_OID "2.16.840.1.101.3.4.1." |
114 | #define AES128_CBC_ENCRYPTION_OID QByteArrayLiteral(AES_OID "2") |
115 | #define AES192_CBC_ENCRYPTION_OID QByteArrayLiteral(AES_OID "22") // Not (yet) implemented |
116 | #define AES256_CBC_ENCRYPTION_OID QByteArrayLiteral(AES_OID "42") // Not (yet) implemented |
117 | |
118 | class Q_AUTOTEST_EXPORT QAsn1Element |
119 | { |
120 | public: |
121 | enum ElementType { |
122 | // universal |
123 | BooleanType = 0x01, |
124 | IntegerType = 0x02, |
125 | BitStringType = 0x03, |
126 | OctetStringType = 0x04, |
127 | NullType = 0x05, |
128 | ObjectIdentifierType = 0x06, |
129 | Utf8StringType = 0x0c, |
130 | PrintableStringType = 0x13, |
131 | TeletexStringType = 0x14, |
132 | UtcTimeType = 0x17, |
133 | GeneralizedTimeType = 0x18, |
134 | SequenceType = 0x30, |
135 | SetType = 0x31, |
136 | |
137 | // GeneralNameTypes |
138 | Rfc822NameType = 0x81, |
139 | DnsNameType = 0x82, |
140 | UniformResourceIdentifierType = 0x86, |
141 | IpAddressType = 0x87, |
142 | |
143 | // context specific |
144 | Context0Type = 0xA0, |
145 | Context1Type = 0xA1, |
146 | Context3Type = 0xA3 |
147 | }; |
148 | |
149 | explicit QAsn1Element(quint8 type = 0, const QByteArray &value = QByteArray()); |
150 | bool read(QDataStream &data); |
151 | bool read(const QByteArray &data); |
152 | void write(QDataStream &data) const; |
153 | |
154 | static QAsn1Element fromBool(bool val); |
155 | static QAsn1Element fromInteger(unsigned int val); |
156 | static QAsn1Element fromVector(const QVector<QAsn1Element> &items); |
157 | static QAsn1Element fromObjectId(const QByteArray &id); |
158 | |
159 | bool toBool(bool *ok = nullptr) const; |
160 | QDateTime toDateTime() const; |
161 | QMultiMap<QByteArray, QString> toInfo() const; |
162 | qint64 toInteger(bool *ok = nullptr) const; |
163 | QVector<QAsn1Element> toVector() const; |
164 | QByteArray toObjectId() const; |
165 | QByteArray toObjectName() const; |
166 | QString toString() const; |
167 | |
168 | quint8 type() const { return mType; } |
169 | QByteArray value() const { return mValue; } |
170 | |
171 | friend inline bool operator==(const QAsn1Element &, const QAsn1Element &); |
172 | friend inline bool operator!=(const QAsn1Element &, const QAsn1Element &); |
173 | |
174 | private: |
175 | quint8 mType; |
176 | QByteArray mValue; |
177 | }; |
178 | Q_DECLARE_TYPEINFO(QAsn1Element, Q_MOVABLE_TYPE); |
179 | |
180 | inline bool operator==(const QAsn1Element &e1, const QAsn1Element &e2) |
181 | { return e1.mType == e2.mType && e1.mValue == e2.mValue; } |
182 | |
183 | inline bool operator!=(const QAsn1Element &e1, const QAsn1Element &e2) |
184 | { return e1.mType != e2.mType || e1.mValue != e2.mValue; } |
185 | |
186 | QT_END_NAMESPACE |
187 | |
188 | #endif |
189 | |