class OpenSSL::ASN1::ASN1Data

表示任何 ASN.1 对象的顶级类。当由 ASN1.decode 解析时,带标签的值始终由 ASN1Data 的实例表示。

ASN1Data 在解析带标签的值中的作用

在编码 ASN.1 类型时,其原始类型(例如 INTEGER、OCTET STRING 等)是固有的,与其标签无关。但与 ASN.1 类型要被编码时不同,在解析它们时,无法推断带标签值的“真实类型”。这就是为什么带标签的值通常被解析为 ASN1Data 实例,但隐式标签和显式标签的结果不同。

隐式标签值解析示例

隐式 1 标签的 INTEGER 值将被解析为 ASN1Data,其中:

这意味着需要后续的解码步骤来完全解码隐式标签的值。

显式标签值解析示例

显式 1 标签的 INTEGER 值将被解析为 ASN1Data,其中:

示例 - 解码隐式标签的 INTEGER

int = OpenSSL::ASN1::Integer.new(1, 0, :IMPLICIT) # implicit 0-tagged
seq = OpenSSL::ASN1::Sequence.new( [int] )
der = seq.to_der
asn1 = OpenSSL::ASN1.decode(der)
# pp asn1 => #<OpenSSL::ASN1::Sequence:0x87326e0
#              @indefinite_length=false,
#              @tag=16,
#              @tag_class=:UNIVERSAL,
#              @tagging=nil,
#              @value=
#                [#<OpenSSL::ASN1::ASN1Data:0x87326f4
#                   @indefinite_length=false,
#                   @tag=0,
#                   @tag_class=:CONTEXT_SPECIFIC,
#                   @value="\x01">]>
raw_int = asn1.value[0]
# manually rewrite tag and tag class to make it an UNIVERSAL value
raw_int.tag = OpenSSL::ASN1::INTEGER
raw_int.tag_class = :UNIVERSAL
int2 = OpenSSL::ASN1.decode(raw_int)
puts int2.value # => 1

示例 - 解码显式标签的 INTEGER

int = OpenSSL::ASN1::Integer.new(1, 0, :EXPLICIT) # explicit 0-tagged
seq = OpenSSL::ASN1::Sequence.new( [int] )
der = seq.to_der
asn1 = OpenSSL::ASN1.decode(der)
# pp asn1 => #<OpenSSL::ASN1::Sequence:0x87326e0
#              @indefinite_length=false,
#              @tag=16,
#              @tag_class=:UNIVERSAL,
#              @tagging=nil,
#              @value=
#                [#<OpenSSL::ASN1::ASN1Data:0x87326f4
#                   @indefinite_length=false,
#                   @tag=0,
#                   @tag_class=:CONTEXT_SPECIFIC,
#                   @value=
#                     [#<OpenSSL::ASN1::Integer:0x85bf308
#                        @indefinite_length=false,
#                        @tag=2,
#                        @tag_class=:UNIVERSAL
#                        @tagging=nil,
#                        @value=1>]>]>
int2 = asn1.value[0].value[0]
puts int2.value # => 1