diff options
-rw-r--r-- | src/network/ssl/qasn1element.cpp | 24 | ||||
-rw-r--r-- | src/network/ssl/qasn1element_p.h | 1 | ||||
-rw-r--r-- | tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp | 8 |
3 files changed, 33 insertions, 0 deletions
diff --git a/src/network/ssl/qasn1element.cpp b/src/network/ssl/qasn1element.cpp index d282a02827..cd8ebed501 100644 --- a/src/network/ssl/qasn1element.cpp +++ b/src/network/ssl/qasn1element.cpp @@ -242,6 +242,30 @@ QMultiMap<QByteArray, QString> QAsn1Element::toInfo() const return info; } +qint64 QAsn1Element::toInteger(bool *ok) const +{ + if (mType != QAsn1Element::IntegerType || mValue.isEmpty()) { + if (ok) + *ok = false; + return 0; + } + + // NOTE: negative numbers are not handled + if (mValue.at(0) & 0x80) { + if (ok) + *ok = false; + return 0; + } + + qint64 value = mValue.at(0) & 0x7f; + for (int i = 1; i < mValue.size(); ++i) + value = (value << 8) | quint8(mValue.at(i)); + + if (ok) + *ok = true; + return value; +} + QVector<QAsn1Element> QAsn1Element::toVector() const { QVector<QAsn1Element> items; diff --git a/src/network/ssl/qasn1element_p.h b/src/network/ssl/qasn1element_p.h index 6b3179ac35..949fd69875 100644 --- a/src/network/ssl/qasn1element_p.h +++ b/src/network/ssl/qasn1element_p.h @@ -97,6 +97,7 @@ public: QDateTime toDateTime() const; QMultiMap<QByteArray, QString> toInfo() const; + qint64 toInteger(bool *ok = 0) const; QVector<QAsn1Element> toVector() const; QByteArray toObjectId() const; QByteArray toObjectName() const; diff --git a/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp b/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp index 661d13bc69..5fb4c28282 100644 --- a/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp +++ b/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp @@ -122,6 +122,14 @@ void tst_QAsn1Element::integer() QFETCH(QByteArray, encoded); QFETCH(int, value); + // read + bool ok; + QAsn1Element elem; + QVERIFY(elem.read(encoded)); + QCOMPARE(elem.type(), quint8(QAsn1Element::IntegerType)); + QCOMPARE(elem.toInteger(&ok), value); + QVERIFY(ok); + // write QByteArray buffer; QDataStream stream(&buffer, QIODevice::WriteOnly); |