qasn1element: add QAsn1Element::toInteger

This change adds the ability to decode ASN.1 INTEGER fields,
provided they represent a positive number of less than 64-bit.

This is needed for PKCS#12 decoding.

Change-Id: Iafb76f22383278d6773b9e879a8f3ef43c8d2c8f
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
bb10
Jeremy Lainé 2014-09-02 09:34:11 +02:00
parent b366d0d016
commit 31938846ae
3 changed files with 33 additions and 0 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);