ASN.1:枚举与整数

信息安全 tls 证书 公钥基础设施 x.509 asn1
2021-09-10 19:34:29

从 X.509 规范:

   CRLReason ::= ENUMERATED {
        unspecified             (0),
        keyCompromise           (1),
        cACompromise            (2),
        affiliationChanged      (3),
        superseded              (4),
        cessationOfOperation    (5),
        certificateHold         (6),
             -- value 7 is not used
        removeFromCRL           (8),
        privilegeWithdrawn      (9),
        aACompromise           (10) }

...和...

Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }

为什么版本不是枚举类型?同样,为什么 CLRReason 不是整数?

2个回答

ENUMERATED 和 INTEGER 有不同的用途。ENUMERATED 用于创建命名项目列表,而 INTEGER 用于携带数字。类型符号看起来有些相似的事实并不能使它们完全相同。对于 ENUMERATED,唯一允许的值是列表中命名的值。对于 INTEGER,命名列表只是一组用于特定数字的有用标签,并不限制 INTEGER 类型允许的值。

我只能假设 CLRReason 被设为 ENUMERATED 因为有一组封闭的值,而 Version 被设为 INTEGER 以使未来版本的数量保持开放。

随意在http://asn1-playground.oss.com尝试其中的一些规范,这是一个在线 ASN.1 编译器和编码器/解码器,不仅支持 BER 和 DER,还支持 PER、XER 和 CER。您将能够看到 ENUMERATED 和 INTEGER 之间的差异对于其他编码规则(例如 PER 和 XER)似乎比对于 BER 和 DER 的差异更为显着。

ENUMERATED并且INTEGER几乎相同(它们只是使用不同的标签)。一般的想法是ENUMERATED在一组有界的可能值中进行选择,而INTEGER对于至少在理论上可以无限提高的值。

在这里,使用ENUMERATEDforCRLReasons是一种暗示,表示“将来不会有其他原因”,而很可能还有其他协议版本(可能还有很多其他版本)。

现在这只是意向声明,不会以任何方式强制执行。请记住,大多数 ASN.1 的理由是:“当时看起来是个好主意”。不要试图读太多。毕竟,直到 1980 年代,ASN.1 成功地定义了一种只有两位数字年份的日期格式——一个明显的Y2K 问题,这并没有阻止标准化委员会......所以只需接受ENUMERATED/INTEGER对偶性作为 ASN.1 的众多怪癖之一(这还不是更糟)。