ASN1 OBJECT_IDENTIFIER解码

时间:2015-07-27 14:15:10

标签: decoding asn.1 crypto++

我有以下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方法似乎不是正确的方法,但我没有找到任何其他方法。

1 个答案:

答案 0 :(得分:1)

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

您还可以执行以下操作:

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

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

as.CopyTo(queue);
  

问题是,我不知道如何正确地通过object_identifier部分......

我可能会这样做:

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.hasn.cpp。您可能感兴趣的其他人包括BERDecodeOctetStringBERDecodeBitString