如何在没有 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 格式解码它,因此所有字段都被命名。
我正在尝试编写客户端数字时间戳程序,但一直在创建时间戳请求 (.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 格式解码它,因此所有字段都被命名。