當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Ruby ASN1Data類用法及代碼示例

本文簡要介紹ruby語言中 OpenSSL::ASN1::ASN1Data類 的用法。

代表任何 ASN.1 對象的頂級類。當由 ASN1.decode 解析時,標記值始終由 ASN1Data 的實例表示。

ASN1Data 用於解析標記值的作用

在對 ASN.1 類型進行編碼時,無論其標記如何,本質上都清楚該值具有什麽原始類型(例如 INTEGER、OCTET STRING 等)。但與編碼 ASN.1 類型的時間相反,在解析它們時,不可能推斷出標記值的 “real type”。這就是為什麽標記值通常被解析為 ASN1Data 實例,但隱式和顯式標記的結果不同。

已解析的隱式標記值示例

隱含 1 標記的 INTEGER 值將被解析為 ASN1Data

  • tag 等於 1

  • tag_class 等於 :CONTEXT_SPECIFIC

  • value 等於 String ,它攜帶 INTEGER 的原始編碼。

這意味著需要後續的解碼步驟來完全解碼隱式標記的值。

已解析的顯式標記值示例

顯式 1 標記的 INTEGER 值將被解析為 ASN1Data

  • tag 等於 1

  • tag_class 等於 :CONTEXT_SPECIFIC

  • value 等於帶有單個元素的 Array ,是 OpenSSL::ASN1::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

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 ASN1Data類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。