如何在没有 NamedType 的情况下创建 ASN.1 序列?

How to create ASN.1 Sequence without NamedType?

我正在尝试编写客户端数字时间戳程序,但一直在创建时间戳请求 (.tsr) 文件。

以下是.tsr文件解码后的真实格式(基于RFC3161)

Sequence:
 field-0=1
 field-1=Sequence:
  field-0=Sequence:
   field-0=2.16.840.1.101.3.4.2.3
   field-1=

  field-1=0x899ca19e19047eb08841d0ed0e8fa19b504927fafc126e5b7f100de56549ccab4d66fe92db70aa5d99e276c1c39a21cc0166e037406a0d1644dc2103181d86f6

我正在使用 pyasn1 模块复制格式并获得以下内容(在编码为 .tsr 之前)

TimeStampReq:
 version=1
 messageImprint=MessageImprint:
  hashAlgorithm=AlgorithmIdentifier:
   algorithm=2.16.840.1.101.3.4.2.3

  hashedMessage=0x899ca19e19047eb08841d0ed0e8fa19b504927fafc126e5b7f100de56549ccab4d66fe92db70aa5d99e276c1c39a21cc0166e037406a0d1644dc2103181d86f6

 nonce=5580318124348686814

这是我编写的代码,它给出了后一种格式

"""
Timestamp request class
"""
from pyasn1.type import univ, namedtype, namedval, tag
from pyasn1_modules.rfc2459 import Extensions, AlgorithmIdentifier


class MessageImprint(univ.Sequence):
    """
    A message imprint as defined per IETF RFC 3161
    """
    componentType = namedtype.NamedTypes(
        namedtype.NamedType('hashAlgorithm', AlgorithmIdentifier()),
        namedtype.NamedType('hashedMessage', univ.OctetString())
    )


class TSAPolicyId(univ.ObjectIdentifier):
    pass


class TimeStampReq(univ.Sequence):
    """
    A timestamp request as defined per IETF RFC 3161
    """
    componentType = namedtype.NamedTypes(
        namedtype.NamedType('version', univ.Integer(1)),
        namedtype.NamedType('messageImprint', MessageImprint()),
        namedtype.OptionalNamedType('reqPolicy', TSAPolicyId()),
        namedtype.OptionalNamedType('nonce', univ.Integer()),
        namedtype.DefaultedNamedType('certReq', univ.Boolean(False)),

        namedtype.OptionalNamedType('extensions', Extensions().subtype(
            implicitTag=tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0)
        ))
    )
    tagSet = univ.Sequence.tagSet.tagImplicitly(
        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))

我需要做什么才能创建正确格式的 .tsr 文件?

我终于明白了,这实际上是一个愚蠢的问题。

第一个未使用任何 ASN.1 格式解码,所有字段区域均未命名。

第二个我使用我首先编写的 TimeStampReq 格式解码它,因此所有字段都被命名。