我认为您的问题是“如何将数据格式化为 ProxyCertInfoExtension?”如果这不正确,请告诉我。
如果你想了解一些理论,我找到的最好的参考是ASN.1、BER 和 DER 子集的外行指南 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.6.6585.
您问题中的代码部分描述了 ProxyCertInfoExtension 的数据如何编码。将编码描述视为可以由解析器生成器处理的语法,就像 yacc 将语法作为输入并输出 C 代码一样。事实上至少存在一个 ASN.1 解析器生成器ASN1C http://sourceforge.net/projects/asn1c/
ASN.1 编码的大小可能是可变的。数据以最外层或顶级 ASN.1 编码开始。每个 ASN.1 编码在其内部可能包含一个或多个 ASN.1 编码。这样ASN.1就是递归的。
ASN.1 编码由标头、长度、可选内容和可选结尾组成。
ASN.1 encoding { Header length [content] [end] }
标头由类类型、原始/构造位和标记号组成。如果标记号大于 63,则标记号将跨越多个字节。这意味着标头可能是一个字节长或多个字节长,具体取决于标记号的值。标头是字节对齐的,这意味着它总是有一定数量的字节长。
ASN.1 header { ClassType Primitive/Constructed Tag-number }
长度也可以是一个字节到多个字节长,具体取决于长度的值。同样,长度是字节对齐的。
类类型和标签号告诉您内容中编码的内容。
最外面的编码通常是序列或集合,它们是复合基本类型。在您的编码中,最外面的编码是 ProxyCertInfoExtension,它是可选 ProxyCertPathLengthConstraint 和 ProxyPolicy 的序列。您的编码如下所示:
ProxyCertInfoExtension { [ProxyCertPathLengthConstraint] ProxyPolicy }
回顾一下编码规则,ProxyCertPathLengthConstraint 只是一个整数,所以你的编码实际上是:
ProxyCertInfoExtension { [Integer] ProxyPolicy }
编码规则将 ProxyPolicy 定义为策略语言和可选策略的序列。因此我们可以将编码表示更新为如下所示:
ProxyCertInfoExtension { [Integer] { policyLanguage [policy] } }
编码规则将策略指定为八位字节字符串(只是一些字节数)。因此进一步简化可以得到:
ProxyCertInfoExtension { [Integer] { policyLanguage [Octet String] } }
根据对象标识符,编码是以下之一:
ProxyCertInfoExtension { [Integer] { id-ppl-anyLanguage [Octet String] } }
ProxyCertInfoExtension { [Integer] { id-ppl-inheritAll [Octet String] } }
ProxyCertInfoExtension { [Integer] { id-ppl-independent [Octet String] } }
我会尝试一个untested例子
ProxyCertPathLengthConstraint=64
策略语言=id-ppl-anyLanguage
政策=“测试”
我将从保单长度为 04 开始彻底研究
这是一个可打印的字符串,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x13
头字节是0x13
length=4,所以长度字节为0x04
ascii 中的“测试”为 0x74 0x65 0x73 0x74
策略的编码是 0x13 0x04 0x74 0x65 0x73 0x74
id-ppl-anyLanguage 是一个对象标识符,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x06
标头字节为 0x06
id-ppl-anyLanguage 的值为“1.3.6.1.5.5.7.21.0”
length=18,所以长度字节为0x12
“1.3.6.1.5.5.7.21.0” = 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10
策略语言的编码是
0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10
proxyPolicy 是一个序列,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x10
标头字节为 0x10
长度= lengthof(policyLanguage) + lengthof(policy)
= (lengthof(policyLanguage 标头) + lengthof (policyLanguage 内容)) + (lengthof(policyheaders) + lengthof (策略内容))
= (2 + 4) + (2 + 18)
= 6 + 20 = 26
length=26,所以长度字节为0x1A
内容是policyLanguage,后跟policy =
0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10 0x13 0x04 0x74 0x65 0 x73 0x74
proxyPolicy 的编码是
0x10 0x1A 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10 0x13 0x04 0 x74 0x65 0x73 0x74
ProxyCertPathLengthConstraint 是一个整数,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x02
标头字节为 0x02
长度=0x01
内容=0x40
编码为 0x02 0x01 0x40
ProxyCertInfoExtension 是一个序列,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x10
标头字节为 0x10
长度 = lengthof(pCPathLenConstraint) + lengthof(proxyPolicy)
= lengthof(pCPathLenConstraint 标头) + lengthof (pCPathLenConstraint 内容)) + (lengthof(proxyPolicy 标头) + lengthof(proxyPolicy 内容))
= (2 + 1) + (2 + 26) = 3 + 28 = 31 = 0x1F
内容= pCPathLenConstraint 后跟 proxyPolicy
= 0x02 0x01 0x40 0x10 0x1A 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10 0x13 0x04 0x74 0x65 0x73 0x74
编码为 0x10 0x1F 0x02 0x01 0x40 0x10 0x1A 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x1 2 0x11 0x0E 0x10 0x13 0x04 0x74 0x65 0x73 0x74