【问题标题】:ASN.1 BitString encoding for CRLDistributionPoints.ReasonFlagsCRLDistributionPoints.ReasonFlags 的 ASN.1 位串编码
【发布时间】:2020-05-18 02:21:39
【问题描述】:

@Crypt32 说:for keyCompromise and caCompromise reasons, it should be 81 02 05 60 --(在问题后评论 CDP extension ASN.1 tag)。

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 是一些未使用的位。只有60 表示实际值。

标签: asn.1


【解决方案1】:

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

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

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

您会看到位 (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,如果我解释得足够好,我已经尽力了。

【讨论】:

  • 抱歉,Windows 说 05 60 是 Cessation of Operation。在证书视图中,带有 05 60 的证书显示为 CRL Reason=Cessation of Operation (05 60)
  • 编码无效。应该是81 02 05 60,没有03
  • 再次:03 02 05 60 以原始形式编码。在隐式标记的情况下,您将03 标记替换为可选选择器(可选[1]):81 并获得81 02 05 60
  • 很好的解释。 @Crypt32,有没有关于如何解析 BitString 的官方规范,你能指出我吗?谢谢。
  • ITU-T X.690 和 RFC5280。
猜你喜欢
  • 1970-01-01
  • 2014-12-27
  • 2022-01-22
  • 2012-04-11
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多