class OpenSSL::ASN1::ASN1Data

Die oberste Klasse, die jedes ASN.1-Objekt repräsentiert. Wenn sie von ASN1.decode analysiert wird, werden getaggte Werte immer durch eine Instanz von ASN1Data dargestellt.

Die Rolle von ASN1Data beim Parsen getaggter Werte

Beim Codieren eines ASN.1-Typs ist eindeutig klar, welchen ursprünglichen Typ (z. B. INTEGER, OCTET STRING usw.) dieser Wert unabhängig von seiner Tagging hat. Im Gegensatz zur Codierung ist beim Parsen von ASN.1-Typen nicht möglich, den "echten Typ" getaggter Werte abzuleiten. Deshalb werden getaggte Werte generell in ASN1Data-Instanzen geparst, aber mit unterschiedlichen Ergebnissen für implizites und explizites Tagging.

Beispiel für einen geparsten implizit getaggten Wert

Ein implizit mit 1 getaggter INTEGER-Wert wird als ASN1Data mit

Dies impliziert, dass ein nachfolgender Dekodierungsschritt erforderlich ist, um implizit getaggte Werte vollständig zu dekodieren.

Beispiel für einen geparsten explizit getaggten Wert

Ein explizit mit 1 getaggter INTEGER-Wert wird als ASN1Data mit

Beispiel - Dekodieren eines implizit getaggten 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

Beispiel - Dekodieren eines explizit getaggten 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