我试图了解 IMPLICIT 和 EXPLICIT 标签实际上是如何以 DER 二进制形式编码的。
基本的例子很清楚。纯整数,
x INTEGER ::= 5
被编码为 TLV 三元组02 01 05
。在
x [2] IMPLICIT INTEGER ::= 5
隐式标签82
替换现有标签02
并形成另一个 TLV: 82 01 05
,并在
x [3] EXPLICIT INTEGER ::= 5
在原始 TLV 周围添加了一个包装器:A3 03 02 01 05
.
现在我在看一个更复杂的案例
30 42 A1 40 30 0D 82 0B 77 77 77 2E 62 61 64 2E
6F 72 67 30 09 82 07 62 61 64 2E 63 6F 6D 30 0D
81 0B 62 61 64 40 62 61 64 2E 6F 72 67 30 09 81
07 62 61 64 2E 63 6F 6D 30 0A 87 08 0A 00 00 00
FF 00 00 00
它被解码成
SEQUENCE {
[1] {
SEQUENCE {
[2] www.bad.org
}
SEQUENCE {
[2] bad.com
}
SEQUENCE {
[1] bad@bad.org
}
SEQUENCE {
[1] bad.com
}
SEQUENCE {
[7] 0A000000FF000000
}
}
}
我的问题是,我怎么知道A1
是一个隐式标签[1] IMPLICIT SEQUENCE
,它取代了原始标签10
,并且包含五个 TLV 元素(序列),还是一个包含这五个元素的显式标签?是什么A1
?
显式标签可以包装多个 TLV 元素吗?
“构造”标志(位 6)指示标签是显式还是隐式,这是否正确?还是我需要查看包装纸的长度和被包裹的东西?
我不假设二进制数据是正确的,所以另一种可能性是A1 40
环绕以下序列30 0D ...
,长度不匹配并且必须拒绝数据。