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
parent
b366d0d016
commit
31938846ae
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue