150 QDataStream dataStream(data);
154 QDataStream rootStream(root.value());
161 QDataStream certStream(cert.value());
162 if (!elem.read(certStream))
166 QDataStream versionStream(elem.value());
167 if (!elem.read(versionStream)
169 || elem.value().isEmpty())
172 versionString = QByteArray::number(elem.value().at(0) + 1);
173 if (!elem.read(certStream))
176 versionString = QByteArray::number(1);
182 serialNumberString = colonSeparatedHex(elem.value());
192 QByteArray issuerDer = data.mid(dataStream.device()->pos() - elem.value().size(), elem.value().size());
193 issuerInfoEntries = elem.toInfo();
199 QDataStream validityStream(elem.value());
203 notValidBefore = elem.toDateTime();
204 if (!notValidBefore.isValid())
210 notValidAfter = elem.toDateTime();
211 if (!notValidAfter.isValid())
219 QByteArray subjectDer = data.mid(dataStream.device()->pos() - elem.value().size(), elem.value().size());
220 subjectInfoEntries = elem.toInfo();
224 qint64 keyStart = certStream.device()->pos();
228 publicKeyDerData.resize(certStream.device()->pos() - keyStart);
229 QDataStream keyStream(elem.value());
238 const QByteArray oid = elem.toObjectId();
240 publicKeyAlgorithm = QSsl::Rsa;
242 publicKeyAlgorithm = QSsl::Dsa;
244 publicKeyAlgorithm = QSsl::Ec;
246 publicKeyAlgorithm = QSsl::Opaque;
248 certStream.device()->seek(keyStart);
249 certStream.readRawData(publicKeyDerData.data(), publicKeyDerData.size());
252 while (elem.read(certStream)) {
255 QDataStream extStream(elem.value());
258 if (!parseExtension(elem.value(), extension))
261 if (extension.oid ==
"2.5.29.17"_L1) {
271 QVariantMap extValue;
274 QDataStream nameStream(sanElem.value());
276 while (nameElem.read(nameStream)) {
277 switch (nameElem.type()) {
278 case QAsn1Element::Rfc822NameType:
279 saNames.insert(QSsl::EmailEntry, nameElem.toString());
280 extValue[QStringLiteral(
"email")] = nameElem.toString();
282 case QAsn1Element::DnsNameType:
283 saNames.insert(QSsl::DnsEntry, nameElem.toString());
284 extValue[QStringLiteral(
"DNS")] = nameElem.toString();
287 QHostAddress ipAddress;
288 QByteArray ipAddrValue = nameElem.value();
289 switch (ipAddrValue.size()) {
291 ipAddress = QHostAddress(qFromBigEndian(*
reinterpret_cast<quint32 *>(ipAddrValue.data())));
294 ipAddress = QHostAddress(
reinterpret_cast<quint8 *>(ipAddrValue.data()));
299 if (!ipAddress.isNull()) {
300 saNames.insert(QSsl::IpAddressEntry, ipAddress.toString());
301 extValue[QStringLiteral(
"IP")] = ipAddress.toString();
309 extension.value = extValue;
314 extensions << extension;
320 derData = data.left(dataStream.device()->pos());
328 bool critical =
false;
331 QDataStream seqStream(data);
337 const QByteArray oid = oidElem.toObjectId();
339 if (!valElem.read(seqStream))
345 if (!ok || !valElem.read(seqStream))
354 bool supported =
true;
356 if (oid ==
"1.3.6.1.5.5.7.1.1") {
361 const auto elems = val.toList();
362 for (
const QAsn1Element &el : elems) {
363 const auto items = el.toList();
364 if (items.size() != 2)
366 const QString key = QString::fromLatin1(items.at(0).toObjectName());
367 switch (items.at(1).type()) {
368 case QAsn1Element::Rfc822NameType:
369 case QAsn1Element::DnsNameType:
370 case QAsn1Element::UniformResourceIdentifierType:
371 result[key] = items.at(1).toString();
376 }
else if (oid ==
"2.5.29.14") {
380 value = colonSeparatedHex(val.value()).toUpper();
381 }
else if (oid ==
"2.5.29.19") {
387 const auto items = val.toList();
388 if (items.size() > 0) {
389 result[QStringLiteral(
"ca")] = items.at(0).toBool(&ok);
393 result[QStringLiteral(
"ca")] =
false;
395 if (items.size() > 1) {
396 result[QStringLiteral(
"pathLenConstraint")] = items.at(1).toInteger(&ok);
401 }
else if (oid ==
"2.5.29.35") {
406 const auto elems = val.toList();
407 for (
const QAsn1Element &el : elems) {
408 if (el.type() == 0x80) {
409 const QString key = QStringLiteral(
"keyid");
410 result[key] = el.value().toHex();
411 }
else if (el.type() == 0x82) {
412 const QString serial = QStringLiteral(
"serial");
413 result[serial] = colonSeparatedHex(el.value());
419 value = valElem.value();
424 extension.oid = QString::fromLatin1(oid);
425 extension.name = QString::fromLatin1(oidElem.toObjectName());
426 extension.value = value;