CDP 扩展 ASN.1 标签
CDP extension ASN.1 tag
我正在尝试了解 x509 证书中 CDP 扩展中使用的 ASN.1 格式。
从 google 读取证书时,我看到这些相关代码:
30 26 30 24 a0 22 a0 20 86 1e (url start)
根据http://rcardon.free.fr/websign/download/api-x509-ext/be/cardon/asn1/x509/extensions/CRLDistributionPoints.html and http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/asn1/structures/GeneralNames.html,GeneralNames 应该是GeneralName 的一个SEQUENCE。为什么直接有一个86没有另一个30?
非常感谢。
更新:
而且,我知道在语法上可能不正确,如果只有一个 DistributionPoint 有一个 DistributionPointName-Url(*1),DistributionPointName-nameRelativeToCRLIssuer(*2),一个原因全为 0(*3),和 2 cRLIssuer-DNSName(*4 and *5),数据包应该是:
30 len --DistributionPoint
a0 len --DistributionPointName for distributionPoint
a0 len --GeneralNames for fullName
86 len --IA5String for uniformResourceIdentifier
(*1) data here
a1 len --RelativeDistinguishedName for nameRelativeToCRLIssuer (edited)
(*2) data here
81 03 --Reason
07 00 00 --BITSTRING of Reason (*3)
a2 len --GeneralNames for cRLIssuer
82 len --IA5String for dNSName
(*4) data here
82 len --IA5String for dNSName
(*5) data here
我说得对吗?
您是否尝试过分析提供的八位字节?您要求缺少 SEQUENCE,但不要求 86
标签周围有额外的 a0
标签。如果你愿意,你可以弄清楚发生了什么。
您的 CDP 扩展值的二进制编码看起来没问题。 0x86 是 uniformResourceLocator
字段的通用名称 CHOICE。如果将二进制字符串拆分成多个部分,您将获得以下映射(假设隐式标记模式,根据 RFC 5280):
- 30 26 -- 映射到
CRLDistributionPoints
- 30 24 -- 映射到
DistributionPoint
- a0 22 -- 映射到
DistributionPointName
(它是可选字段,因此使用隐式标记)
- a0 20 -- 映射到
GeneralNames
(它是一个 CHOICE 值,因此使用隐式标记)
- 86 1e -- 映射到
IA5String
类型的 uniformResourceIdentifier
字段。它是 CHOICE 值,这使用隐式标记。
看来您对标签感到困惑。 GeneralName
类型确实是 SEQUENCE
,但在给定的上下文中,它在 CHOICE 中使用,因此它被隐式标记:SEQUENCE 标记替换为相应的 CONTEXT_SPECIFIC
标记 [0]。
更新:
当 ASN 模块包含 CHOICE、OPTIONAL、DEFAULT 关键字时,它们使用 CONTEXT_SPECIFIC class,其基本标记号为 0x80。选择器在方括号中指定。在这些情况下,你这样做(当模块默认为隐式标签时,就像在我们的例子中一样):CONTEXT_SPECIFIC class (0x80) + CONSTRUCTED BIT (0x32) from original type + Selector number in square brackets.
例如,带有选择器 0 的可选序列将导致 0x80 + 0x20 + 0 = 0xa0。 CHOICE [6] IA5String 将产生 0x80 + 0x0(CONSTRUCTED 位为 0)+ 0x6 = 0x86。
当模块默认为显式标签或有EXPLICIT关键字时,原始类型不会改变(SEQUENCE仍然是SEQUENCE),而是编码为CONSTRUCTED CONTEXT_SPECIFIC.
的嵌套类型
我正在尝试了解 x509 证书中 CDP 扩展中使用的 ASN.1 格式。
从 google 读取证书时,我看到这些相关代码:
30 26 30 24 a0 22 a0 20 86 1e (url start)
根据http://rcardon.free.fr/websign/download/api-x509-ext/be/cardon/asn1/x509/extensions/CRLDistributionPoints.html and http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/asn1/structures/GeneralNames.html,GeneralNames 应该是GeneralName 的一个SEQUENCE。为什么直接有一个86没有另一个30?
非常感谢。
更新: 而且,我知道在语法上可能不正确,如果只有一个 DistributionPoint 有一个 DistributionPointName-Url(*1),DistributionPointName-nameRelativeToCRLIssuer(*2),一个原因全为 0(*3),和 2 cRLIssuer-DNSName(*4 and *5),数据包应该是:
30 len --DistributionPoint
a0 len --DistributionPointName for distributionPoint
a0 len --GeneralNames for fullName
86 len --IA5String for uniformResourceIdentifier
(*1) data here
a1 len --RelativeDistinguishedName for nameRelativeToCRLIssuer (edited)
(*2) data here
81 03 --Reason
07 00 00 --BITSTRING of Reason (*3)
a2 len --GeneralNames for cRLIssuer
82 len --IA5String for dNSName
(*4) data here
82 len --IA5String for dNSName
(*5) data here
我说得对吗?
您是否尝试过分析提供的八位字节?您要求缺少 SEQUENCE,但不要求 86
标签周围有额外的 a0
标签。如果你愿意,你可以弄清楚发生了什么。
您的 CDP 扩展值的二进制编码看起来没问题。 0x86 是 uniformResourceLocator
字段的通用名称 CHOICE。如果将二进制字符串拆分成多个部分,您将获得以下映射(假设隐式标记模式,根据 RFC 5280):
- 30 26 -- 映射到
CRLDistributionPoints
- 30 24 -- 映射到
DistributionPoint
- a0 22 -- 映射到
DistributionPointName
(它是可选字段,因此使用隐式标记) - a0 20 -- 映射到
GeneralNames
(它是一个 CHOICE 值,因此使用隐式标记) - 86 1e -- 映射到
IA5String
类型的uniformResourceIdentifier
字段。它是 CHOICE 值,这使用隐式标记。
看来您对标签感到困惑。 GeneralName
类型确实是 SEQUENCE
,但在给定的上下文中,它在 CHOICE 中使用,因此它被隐式标记:SEQUENCE 标记替换为相应的 CONTEXT_SPECIFIC
标记 [0]。
更新:
当 ASN 模块包含 CHOICE、OPTIONAL、DEFAULT 关键字时,它们使用 CONTEXT_SPECIFIC class,其基本标记号为 0x80。选择器在方括号中指定。在这些情况下,你这样做(当模块默认为隐式标签时,就像在我们的例子中一样):CONTEXT_SPECIFIC class (0x80) + CONSTRUCTED BIT (0x32) from original type + Selector number in square brackets.
例如,带有选择器 0 的可选序列将导致 0x80 + 0x20 + 0 = 0xa0。 CHOICE [6] IA5String 将产生 0x80 + 0x0(CONSTRUCTED 位为 0)+ 0x6 = 0x86。
当模块默认为显式标签或有EXPLICIT关键字时,原始类型不会改变(SEQUENCE仍然是SEQUENCE),而是编码为CONSTRUCTED CONTEXT_SPECIFIC.
的嵌套类型