ASN1 OBJECT_IDENTIFIER解码

ASN1 OBJECT_IDENTIFIER decoding

我有以下 ASN1 数据

Sequence
  Sequence
    ObjectIdentifier
  Sequence
    Sequence
      Integer
      Integer
    Sequence
      Integer
      Integer

我的目标是获取编码后的整数值。到目前为止我的代码如下

ByteQueue queue(inputLen);
queue.Put2(input, inputLen, 0, false);

BERSequenceDecoder outer(queue);

BERSequenceDecoder discard(outer); // unnecessary  sequence with object_identifier
BERSequenceDecoder obj(discard,
    CryptoPP::ASNTag::OBJECT_IDENTIFIER | CryptoPP::ASNIdFlag::UNIVERSAL);

BERSequenceDecoder parent(outer); //BER decode error
for(int i = 0; i < 2; i++) {
    BERSequenceDecoder dataSequence(parent);
    Integer i1, i2;

    i1.BERDecode(dataSequence);
    i2.BERDecode(dataSequence);

问题是,我不知道如何正确地通过 object_identifier 部分,至少我认为这是问题所在。我在 4. 解码器对象上得到 BER decode error

此外,我是否正确初始化了 ByteQueue?这个Put2方法似乎不是正确的方法,但我没有找到任何其他方法。

ByteQueue queue(inputLen);
queue.Put2(input, inputLen, 0, false);

你也可以这样做:

ArraySource as(input, inputLen, false /*pumpAll*/);
as.TransferTo(queue);

或者,如果您只想复制它们:

as.CopyTo(queue);

Problem is, I don't know how to properly get past the object_identifier part...

我可能会这样做:

byte b = as.Peek();
if(b == /*some tag*/)
    as.Skip(n);

或:

byte b = as.Peek();
if(b == /*some tag*/)
{
    lword length;
    bool definiteLength;

    if(!BERLengthDecode(as, length, definiteLength))
        throw BadParam();

    as.Skip(length);
}

具有上述优点的源文件是asn.h and asn.cpp。您可能感兴趣的其他人包括 BERDecodeOctetStringBERDecodeBitString.