CRLDistributionPoints.ReasonFlags 的 ASN.1 位串编码

ASN.1 BitString encoding for CRLDistributionPoints.ReasonFlags

@Crypt32 说:for keyCompromise and caCompromise reasons, it should be 81 02 05 60——(在问题 后发表评论)。

05 60 is: 00000101 01100000

ReasonFlags ::= BIT STRING {
    unused                  (0),
    keyCompromise           (1),
    cACompromise            (2),
    affiliationChanged      (3),
    superseded              (4),
    cessationOfOperation    (5),
    certificateHold         (6),
    privilegeWithdrawn      (7),
    aACompromise            (8) }

为什么keyCompromise+cACompromise被编码成05 60?谢谢。

更新:在Windows中,05 60被解码为cessationOfOperation (5)

05 是未使用的位数。它是 BIT_STRING 的一部分。 60(所有八位字节都以十六进制表示)是位串值。 BIT_STRING 是一长串位。比特在 LTR 方向上被索引。最小传输单位是字节,所以每个位串的长度都是8位的倍数。如果将实际位串的长度除以8取余,则余数表示未使用的位。未使用的位是最后一个 1 之后直到字节末尾的零位的数量。如果右侧的所有 8 位都未使用,则不对零字节进行编码。

位索引将 1:1 映射到 ASN.1 模块中括号中的位数。 ASN.1 模块定义了需要 2 个字节编码的 9 位:

由于第二个字节中的所有位均为零,因此该字节未编码:

您看到位 (1) 和 (2) 设置为 1,这映射到启用的 keyCompromisecACompromise 标志的按位或组合。其余位在字节结束之前为零,因此不使用。如果我们计算它们,我们得到 5 个未使用的位,编码值将如下所示:

03 02 05 60

其中:

  • 03 -- 标签标识符
  • 02 -- 标签长度
  • 05 -- 未使用的位增加
  • 60 -- 编码值

如果包含 aACompromise 位会怎样?该位需要第二个字节:

所有其余位(第 9 位之后)均为零,因此它们未被使用(恰好 7 位)。所以这个设置的编码是:

03 03 07 60 80

其中:

  • 03 -- 标签标识符
  • 03 -- 标签长度
  • 07 -- 未使用的位计数
  • 60 80 -- 编码值

IDK 如果我解释得足够好,我已经尽力了。