Line | Source Code | Coverage |
---|
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | void QSslKeyPrivate::clear(bool deep) | - |
13 | { | - |
14 | isNull = true; | - |
15 | if (!QSslSocket::supportsSsl()) partially evaluated: !QSslSocket::supportsSsl() no Evaluation Count:0 | yes Evaluation Count:10894 |
| 0-10894 |
16 | return; | 0 |
17 | if (rsa) { evaluated: rsa yes Evaluation Count:297 | yes Evaluation Count:10597 |
| 297-10597 |
18 | if (deep) partially evaluated: deep yes Evaluation Count:297 | no Evaluation Count:0 |
| 0-297 |
19 | q_RSA_free(rsa); executed: q_RSA_free(rsa); Execution Count:297 | 297 |
20 | rsa = 0; | - |
21 | } executed: } Execution Count:297 | 297 |
22 | if (dsa) { evaluated: dsa yes Evaluation Count:160 | yes Evaluation Count:10734 |
| 160-10734 |
23 | if (deep) partially evaluated: deep yes Evaluation Count:160 | no Evaluation Count:0 |
| 0-160 |
24 | q_DSA_free(dsa); executed: q_DSA_free(dsa); Execution Count:160 | 160 |
25 | dsa = 0; | - |
26 | } executed: } Execution Count:160 | 160 |
27 | if (opaque) { partially evaluated: opaque no Evaluation Count:0 | yes Evaluation Count:10894 |
| 0-10894 |
28 | if (deep) | 0 |
29 | q_EVP_PKEY_free(opaque); never executed: q_EVP_PKEY_free(opaque); | 0 |
30 | opaque = 0; | - |
31 | } | 0 |
32 | } executed: } Execution Count:10894 | 10894 |
33 | void QSslKeyPrivate::decodePem(const QByteArray &pem, const QByteArray &passPhrase, | - |
34 | bool deepClear) | - |
35 | { | - |
36 | if (pem.isEmpty()) partially evaluated: pem.isEmpty() no Evaluation Count:0 | yes Evaluation Count:542 |
| 0-542 |
37 | return; | 0 |
38 | | - |
39 | clear(deepClear); | - |
40 | | - |
41 | if (!QSslSocket::supportsSsl()) partially evaluated: !QSslSocket::supportsSsl() no Evaluation Count:0 | yes Evaluation Count:542 |
| 0-542 |
42 | return; | 0 |
43 | | - |
44 | BIO *bio = q_BIO_new_mem_buf(const_cast<char *>(pem.data()), pem.size()); | - |
45 | if (!bio) partially evaluated: !bio no Evaluation Count:0 | yes Evaluation Count:542 |
| 0-542 |
46 | return; | 0 |
47 | | - |
48 | void *phrase = (void *)passPhrase.constData(); | - |
49 | | - |
50 | if (algorithm == QSsl::Rsa) { evaluated: algorithm == QSsl::Rsa yes Evaluation Count:350 | yes Evaluation Count:192 |
| 192-350 |
51 | RSA *result = (type == QSsl::PublicKey) evaluated: (type == QSsl::PublicKey) yes Evaluation Count:116 | yes Evaluation Count:234 |
| 116-234 |
52 | ? q_PEM_read_bio_RSA_PUBKEY(bio, &rsa, 0, phrase) | - |
53 | : q_PEM_read_bio_RSAPrivateKey(bio, &rsa, 0, phrase); | - |
54 | if (rsa && rsa == result) evaluated: rsa yes Evaluation Count:291 | yes Evaluation Count:59 |
partially evaluated: rsa == result yes Evaluation Count:291 | no Evaluation Count:0 |
| 0-291 |
55 | isNull = false; executed: isNull = false; Execution Count:291 | 291 |
56 | } else { executed: } Execution Count:350 | 350 |
57 | DSA *result = (type == QSsl::PublicKey) evaluated: (type == QSsl::PublicKey) yes Evaluation Count:64 | yes Evaluation Count:128 |
| 64-128 |
58 | ? q_PEM_read_bio_DSA_PUBKEY(bio, &dsa, 0, phrase) | - |
59 | : q_PEM_read_bio_DSAPrivateKey(bio, &dsa, 0, phrase); | - |
60 | if (dsa && dsa == result) evaluated: dsa yes Evaluation Count:160 | yes Evaluation Count:32 |
partially evaluated: dsa == result yes Evaluation Count:160 | no Evaluation Count:0 |
| 0-160 |
61 | isNull = false; executed: isNull = false; Execution Count:160 | 160 |
62 | } executed: } Execution Count:192 | 192 |
63 | | - |
64 | q_BIO_free(bio); | - |
65 | } executed: } Execution Count:542 | 542 |
66 | | - |
67 | | - |
68 | | - |
69 | | - |
70 | | - |
71 | | - |
72 | QSslKey::QSslKey() | - |
73 | : d(new QSslKeyPrivate) | - |
74 | { | - |
75 | } executed: } Execution Count:4634 | 4634 |
76 | | - |
77 | | - |
78 | | - |
79 | | - |
80 | QByteArray QSslKeyPrivate::pemHeader() const | - |
81 | { | - |
82 | | - |
83 | if (type == QSsl::PublicKey) evaluated: type == QSsl::PublicKey yes Evaluation Count:463 | yes Evaluation Count:627 |
| 463-627 |
84 | return QByteArray("-----BEGIN PUBLIC KEY-----\n"); executed: return QByteArray("-----BEGIN PUBLIC KEY-----\n"); Execution Count:463 | 463 |
85 | else if (algorithm == QSsl::Rsa) evaluated: algorithm == QSsl::Rsa yes Evaluation Count:399 | yes Evaluation Count:228 |
| 228-399 |
86 | return QByteArray("-----BEGIN RSA PRIVATE KEY-----\n"); executed: return QByteArray("-----BEGIN RSA PRIVATE KEY-----\n"); Execution Count:399 | 399 |
87 | return QByteArray("-----BEGIN DSA PRIVATE KEY-----\n"); executed: return QByteArray("-----BEGIN DSA PRIVATE KEY-----\n"); Execution Count:228 | 228 |
88 | } | - |
89 | | - |
90 | | - |
91 | | - |
92 | | - |
93 | QByteArray QSslKeyPrivate::pemFooter() const | - |
94 | { | - |
95 | | - |
96 | if (type == QSsl::PublicKey) evaluated: type == QSsl::PublicKey yes Evaluation Count:463 | yes Evaluation Count:627 |
| 463-627 |
97 | return QByteArray("-----END PUBLIC KEY-----\n"); executed: return QByteArray("-----END PUBLIC KEY-----\n"); Execution Count:463 | 463 |
98 | else if (algorithm == QSsl::Rsa) evaluated: algorithm == QSsl::Rsa yes Evaluation Count:399 | yes Evaluation Count:228 |
| 228-399 |
99 | return QByteArray("-----END RSA PRIVATE KEY-----\n"); executed: return QByteArray("-----END RSA PRIVATE KEY-----\n"); Execution Count:399 | 399 |
100 | return QByteArray("-----END DSA PRIVATE KEY-----\n"); executed: return QByteArray("-----END DSA PRIVATE KEY-----\n"); Execution Count:228 | 228 |
101 | } | - |
102 | | - |
103 | | - |
104 | | - |
105 | | - |
106 | | - |
107 | | - |
108 | QByteArray QSslKeyPrivate::pemFromDer(const QByteArray &der) const | - |
109 | { | - |
110 | QByteArray pem(der.toBase64()); | - |
111 | | - |
112 | const int lineWidth = 64; | - |
113 | const int newLines = pem.size() / lineWidth; | - |
114 | const bool rem = pem.size() % lineWidth; | - |
115 | | - |
116 | | - |
117 | for (int i = 0; i < newLines; ++i) evaluated: i < newLines yes Evaluation Count:2054 | yes Evaluation Count:266 |
| 266-2054 |
118 | pem.insert((i + 1) * lineWidth + i, '\n'); executed: pem.insert((i + 1) * lineWidth + i, '\n'); Execution Count:2054 | 2054 |
119 | if (rem) evaluated: rem yes Evaluation Count:250 | yes Evaluation Count:16 |
| 16-250 |
120 | pem.append('\n'); executed: pem.append('\n'); Execution Count:250 | 250 |
121 | | - |
122 | pem.prepend(pemHeader()); | - |
123 | pem.append(pemFooter()); | - |
124 | | - |
125 | return pem; executed: return pem; Execution Count:266 | 266 |
126 | } | - |
127 | | - |
128 | | - |
129 | | - |
130 | | - |
131 | | - |
132 | | - |
133 | QByteArray QSslKeyPrivate::derFromPem(const QByteArray &pem) const | - |
134 | { | - |
135 | const QByteArray header = pemHeader(); | - |
136 | const QByteArray footer = pemFooter(); | - |
137 | | - |
138 | QByteArray der(pem); | - |
139 | | - |
140 | const int headerIndex = der.indexOf(header); | - |
141 | const int footerIndex = der.indexOf(footer); | - |
142 | if (headerIndex == -1 || footerIndex == -1) partially evaluated: headerIndex == -1 no Evaluation Count:0 | yes Evaluation Count:824 |
partially evaluated: footerIndex == -1 no Evaluation Count:0 | yes Evaluation Count:824 |
| 0-824 |
143 | return QByteArray(); never executed: return QByteArray(); | 0 |
144 | | - |
145 | der = der.mid(headerIndex + header.size(), footerIndex - (headerIndex + header.size())); | - |
146 | | - |
147 | return QByteArray::fromBase64(der); executed: return QByteArray::fromBase64(der); Execution Count:824 | 824 |
148 | } | - |
149 | QSslKey::QSslKey(const QByteArray &encoded, QSsl::KeyAlgorithm algorithm, | - |
150 | QSsl::EncodingFormat encoding, QSsl::KeyType type, const QByteArray &passPhrase) | - |
151 | : d(new QSslKeyPrivate) | - |
152 | { | - |
153 | d->type = type; | - |
154 | d->algorithm = algorithm; | - |
155 | d->decodePem((encoding == QSsl::Der) | - |
156 | ? d->pemFromDer(encoded) : encoded, | - |
157 | passPhrase); | - |
158 | } executed: } Execution Count:535 | 535 |
159 | QSslKey::QSslKey(QIODevice *device, QSsl::KeyAlgorithm algorithm, QSsl::EncodingFormat encoding, | - |
160 | QSsl::KeyType type, const QByteArray &passPhrase) | - |
161 | : d(new QSslKeyPrivate) | - |
162 | { | - |
163 | QByteArray encoded; | - |
164 | if (device) partially evaluated: device yes Evaluation Count:7 | no Evaluation Count:0 |
| 0-7 |
165 | encoded = device->readAll(); executed: encoded = device->readAll(); Execution Count:7 | 7 |
166 | d->type = type; | - |
167 | d->algorithm = algorithm; | - |
168 | d->decodePem((encoding == QSsl::Der) ? | - |
169 | d->pemFromDer(encoded) : encoded, | - |
170 | passPhrase); | - |
171 | } executed: } Execution Count:7 | 7 |
172 | QSslKey::QSslKey(Qt::HANDLE handle, QSsl::KeyType type) | - |
173 | : d(new QSslKeyPrivate) | - |
174 | { | - |
175 | d->opaque = reinterpret_cast<EVP_PKEY *>(handle); | - |
176 | d->algorithm = QSsl::Opaque; | - |
177 | d->type = type; | - |
178 | d->isNull = !d->opaque; | - |
179 | } | 0 |
180 | | - |
181 | | - |
182 | | - |
183 | | - |
184 | QSslKey::QSslKey(const QSslKey &other) : d(other.d) | - |
185 | { | - |
186 | } executed: } Execution Count:297 | 297 |
187 | | - |
188 | | - |
189 | | - |
190 | | - |
191 | QSslKey::~QSslKey() | - |
192 | { | - |
193 | } | - |
194 | | - |
195 | | - |
196 | | - |
197 | | - |
198 | | - |
199 | | - |
200 | | - |
201 | QSslKey &QSslKey::operator=(const QSslKey &other) | - |
202 | { | - |
203 | d = other.d; | - |
204 | return *this; executed: return *this; Execution Count:147 | 147 |
205 | } | - |
206 | bool QSslKey::isNull() const | - |
207 | { | - |
208 | return d->isNull; executed: return d->isNull; Execution Count:979 | 979 |
209 | } | - |
210 | | - |
211 | | - |
212 | | - |
213 | | - |
214 | | - |
215 | | - |
216 | void QSslKey::clear() | - |
217 | { | - |
218 | d = new QSslKeyPrivate; | - |
219 | } | 0 |
220 | | - |
221 | | - |
222 | | - |
223 | | - |
224 | int QSslKey::length() const | - |
225 | { | - |
226 | if (d->isNull || d->algorithm == QSsl::Opaque) evaluated: d->isNull yes Evaluation Count:1 | yes Evaluation Count:582 |
partially evaluated: d->algorithm == QSsl::Opaque no Evaluation Count:0 | yes Evaluation Count:582 |
| 0-582 |
227 | return -1; executed: return -1; Execution Count:1 | 1 |
228 | | - |
229 | return (d->algorithm == QSsl::Rsa) | 582 |
230 | ? q_BN_num_bits(d->rsa->n) : q_BN_num_bits(d->dsa->p); executed: return (d->algorithm == QSsl::Rsa) ? q_BN_num_bits(d->rsa->n) : q_BN_num_bits(d->dsa->p); Execution Count:582 | 582 |
231 | } | - |
232 | | - |
233 | | - |
234 | | - |
235 | | - |
236 | QSsl::KeyType QSslKey::type() const | - |
237 | { | - |
238 | return d->type; executed: return d->type; Execution Count:538 | 538 |
239 | } | - |
240 | | - |
241 | | - |
242 | | - |
243 | | - |
244 | QSsl::KeyAlgorithm QSslKey::algorithm() const | - |
245 | { | - |
246 | return d->algorithm; executed: return d->algorithm; Execution Count:728 | 728 |
247 | } | - |
248 | | - |
249 | | - |
250 | | - |
251 | | - |
252 | | - |
253 | | - |
254 | | - |
255 | QByteArray QSslKey::toDer(const QByteArray &passPhrase) const | - |
256 | { | - |
257 | if (d->isNull || d->algorithm == QSsl::Opaque) partially evaluated: d->isNull no Evaluation Count:0 | yes Evaluation Count:824 |
partially evaluated: d->algorithm == QSsl::Opaque no Evaluation Count:0 | yes Evaluation Count:824 |
| 0-824 |
258 | return QByteArray(); never executed: return QByteArray(); | 0 |
259 | | - |
260 | return d->derFromPem(toPem(passPhrase)); executed: return d->derFromPem(toPem(passPhrase)); Execution Count:824 | 824 |
261 | } | - |
262 | | - |
263 | | - |
264 | | - |
265 | | - |
266 | | - |
267 | | - |
268 | QByteArray QSslKey::toPem(const QByteArray &passPhrase) const | - |
269 | { | - |
270 | if (!QSslSocket::supportsSsl() || d->isNull || d->algorithm == QSsl::Opaque) partially evaluated: !QSslSocket::supportsSsl() no Evaluation Count:0 | yes Evaluation Count:1638 |
evaluated: d->isNull yes Evaluation Count:88 | yes Evaluation Count:1550 |
partially evaluated: d->algorithm == QSsl::Opaque no Evaluation Count:0 | yes Evaluation Count:1550 |
| 0-1638 |
271 | return QByteArray(); executed: return QByteArray(); Execution Count:88 | 88 |
272 | | - |
273 | BIO *bio = q_BIO_new(q_BIO_s_mem()); | - |
274 | if (!bio) partially evaluated: !bio no Evaluation Count:0 | yes Evaluation Count:1550 |
| 0-1550 |
275 | return QByteArray(); never executed: return QByteArray(); | 0 |
276 | | - |
277 | bool fail = false; | - |
278 | | - |
279 | if (d->algorithm == QSsl::Rsa) { evaluated: d->algorithm == QSsl::Rsa yes Evaluation Count:990 | yes Evaluation Count:560 |
| 560-990 |
280 | if (d->type == QSsl::PublicKey) { evaluated: d->type == QSsl::PublicKey yes Evaluation Count:416 | yes Evaluation Count:574 |
| 416-574 |
281 | if (!q_PEM_write_bio_RSA_PUBKEY(bio, d->rsa)) partially evaluated: !q_PEM_write_bio_RSA_PUBKEY(bio, d->rsa) no Evaluation Count:0 | yes Evaluation Count:416 |
| 0-416 |
282 | fail = true; never executed: fail = true; | 0 |
283 | } else { executed: } Execution Count:416 | 416 |
284 | if (!q_PEM_write_bio_RSAPrivateKey( | 0-574 |
285 | bio, d->rsa, | 0-574 |
286 | | 0-574 |
287 | passPhrase.isEmpty() ? (const EVP_CIPHER *)0 : q_EVP_des_ede3_cbc(), | 0-574 |
288 | (uchar *)passPhrase.data(), passPhrase.size(), 0, 0)) { partially evaluated: !q_PEM_write_bio_RSAPrivateKey( bio, d->rsa, passPhrase.isEmpty() ? (const EVP_CIPHER *)0 : q_EVP_des_ede3_cbc(), (uchar *)passPhrase.data(), passPhrase.size(), 0, 0) no Evaluation Count:0 | yes Evaluation Count:574 |
| 0-574 |
289 | fail = true; | - |
290 | } | 0 |
291 | } executed: } Execution Count:574 | 574 |
292 | } else { | - |
293 | if (d->type == QSsl::PublicKey) { evaluated: d->type == QSsl::PublicKey yes Evaluation Count:232 | yes Evaluation Count:328 |
| 232-328 |
294 | if (!q_PEM_write_bio_DSA_PUBKEY(bio, d->dsa)) partially evaluated: !q_PEM_write_bio_DSA_PUBKEY(bio, d->dsa) no Evaluation Count:0 | yes Evaluation Count:232 |
| 0-232 |
295 | fail = true; never executed: fail = true; | 0 |
296 | } else { executed: } Execution Count:232 | 232 |
297 | if (!q_PEM_write_bio_DSAPrivateKey( | 0-328 |
298 | bio, d->dsa, | 0-328 |
299 | | 0-328 |
300 | passPhrase.isEmpty() ? (const EVP_CIPHER *)0 : q_EVP_des_ede3_cbc(), | 0-328 |
301 | (uchar *)passPhrase.data(), passPhrase.size(), 0, 0)) { partially evaluated: !q_PEM_write_bio_DSAPrivateKey( bio, d->dsa, passPhrase.isEmpty() ? (const EVP_CIPHER *)0 : q_EVP_des_ede3_cbc(), (uchar *)passPhrase.data(), passPhrase.size(), 0, 0) no Evaluation Count:0 | yes Evaluation Count:328 |
| 0-328 |
302 | fail = true; | - |
303 | } | 0 |
304 | } executed: } Execution Count:328 | 328 |
305 | } | - |
306 | | - |
307 | QByteArray pem; | - |
308 | if (!fail) { partially evaluated: !fail yes Evaluation Count:1550 | no Evaluation Count:0 |
| 0-1550 |
309 | char *data; | - |
310 | long size = (int)q_BIO_ctrl(bio,3,0,(char *)&data); | - |
311 | pem = QByteArray(data, size); | - |
312 | } executed: } Execution Count:1550 | 1550 |
313 | q_BIO_free(bio); | - |
314 | return pem; executed: return pem; Execution Count:1550 | 1550 |
315 | } | - |
316 | Qt::HANDLE QSslKey::handle() const | - |
317 | { | - |
318 | switch (d->algorithm) { | - |
319 | case QSsl::Opaque: | - |
320 | return Qt::HANDLE(d->opaque); never executed: return Qt::HANDLE(d->opaque); | 0 |
321 | case QSsl::Rsa: | - |
322 | return Qt::HANDLE(d->rsa); executed: return Qt::HANDLE(d->rsa); Execution Count:3 | 3 |
323 | case QSsl::Dsa: | - |
324 | return Qt::HANDLE(d->dsa); never executed: return Qt::HANDLE(d->dsa); | 0 |
325 | default: | - |
326 | return Qt::HANDLE(__null); never executed: return Qt::HANDLE(__null); | 0 |
327 | } | - |
328 | } | 0 |
329 | | - |
330 | | - |
331 | | - |
332 | | - |
333 | bool QSslKey::operator==(const QSslKey &other) const | - |
334 | { | - |
335 | if (isNull()) evaluated: isNull() yes Evaluation Count:44 | yes Evaluation Count:181 |
| 44-181 |
336 | return other.isNull(); executed: return other.isNull(); Execution Count:44 | 44 |
337 | if (other.isNull()) partially evaluated: other.isNull() no Evaluation Count:0 | yes Evaluation Count:181 |
| 0-181 |
338 | return isNull(); never executed: return isNull(); | 0 |
339 | if (algorithm() != other.algorithm()) partially evaluated: algorithm() != other.algorithm() no Evaluation Count:0 | yes Evaluation Count:181 |
| 0-181 |
340 | return false; never executed: return false; | 0 |
341 | if (type() != other.type()) partially evaluated: type() != other.type() no Evaluation Count:0 | yes Evaluation Count:181 |
| 0-181 |
342 | return false; never executed: return false; | 0 |
343 | if (length() != other.length()) partially evaluated: length() != other.length() no Evaluation Count:0 | yes Evaluation Count:181 |
| 0-181 |
344 | return false; never executed: return false; | 0 |
345 | if (algorithm() == QSsl::Opaque) partially evaluated: algorithm() == QSsl::Opaque no Evaluation Count:0 | yes Evaluation Count:181 |
| 0-181 |
346 | return handle() == other.handle(); never executed: return handle() == other.handle(); | 0 |
347 | return toDer() == other.toDer(); executed: return toDer() == other.toDer(); Execution Count:181 | 181 |
348 | } | - |
349 | class QDebug; | - |
350 | QDebug operator<<(QDebug debug, const QSslKey &key) | - |
351 | { | - |
352 | debug << "QSslKey(" | - |
353 | << (key.type() == QSsl::PublicKey ? "PublicKey" : "PrivateKey") | - |
354 | << ", " << (key.algorithm() == QSsl::Opaque ? "OPAQUE" : | - |
355 | (key.algorithm() == QSsl::Rsa ? "RSA" : "DSA")) | - |
356 | << ", " << key.length() | - |
357 | << ')'; | - |
358 | return debug; never executed: return debug; | 0 |
359 | } | - |
360 | | - |
361 | | - |
362 | | - |
363 | | - |
| | |