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
-
tag gleich 1
-
tag_class gleich
:CONTEXT_SPECIFIC -
value gleich einem
String, der die Rohcodierung des INTEGER enthält.
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
-
tag gleich 1
-
tag_class gleich
:CONTEXT_SPECIFIC -
value gleich einem
Arraymit einem einzigen Element, einer Instanz vonOpenSSL::ASN1::Integer, d. h. das innere Element ist der nicht getaggte primitive Wert, und das Tagging wird im äußerenASN1Datadargestellt
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
Attribute
Niemals nil. Ein boolescher Wert, der angibt, ob die Codierung eine unbestimmte Länge verwendet (im Falle des Parsens) oder ob eine unbestimmte Längenform verwendet werden soll (im Falle der Codierung). In DER verwendet jeder Wert eine bestimmte Längenform. Aber in Szenarien, in denen große Datenmengen übertragen werden müssen, kann es wünschenswert sein, eine Art Streaming-Unterstützung zur Verfügung zu haben. Zum Beispiel werden riesige OCTET STRINGs vorzugsweise in kleinere Blöcke aufgeteilt, jeweils einzeln. Dies ist in BER möglich, indem die Längenbytes einer Codierung auf Null gesetzt werden und dadurch angezeigt wird, dass der folgende Wert in Blöcken gesendet wird. Unbestimmte Längencodierungen sind immer konstruiert. Das Ende eines solchen Blockstroms wird durch das Senden eines EOC (End of Content)-Tags angezeigt. SETs und SEQUENCEs können eine unbestimmte Längencodierung verwenden, aber auch primitive Typen wie z. B. OCTET STRINGs oder BIT STRINGs können diese Funktionalität nutzen (siehe ITU-T X.690).
Niemals nil. Ein boolescher Wert, der angibt, ob die Codierung eine unbestimmte Länge verwendet (im Falle des Parsens) oder ob eine unbestimmte Längenform verwendet werden soll (im Falle der Codierung). In DER verwendet jeder Wert eine bestimmte Längenform. Aber in Szenarien, in denen große Datenmengen übertragen werden müssen, kann es wünschenswert sein, eine Art Streaming-Unterstützung zur Verfügung zu haben. Zum Beispiel werden riesige OCTET STRINGs vorzugsweise in kleinere Blöcke aufgeteilt, jeweils einzeln. Dies ist in BER möglich, indem die Längenbytes einer Codierung auf Null gesetzt werden und dadurch angezeigt wird, dass der folgende Wert in Blöcken gesendet wird. Unbestimmte Längencodierungen sind immer konstruiert. Das Ende eines solchen Blockstroms wird durch das Senden eines EOC (End of Content)-Tags angezeigt. SETs und SEQUENCEs können eine unbestimmte Längencodierung verwenden, aber auch primitive Typen wie z. B. OCTET STRINGs oder BIT STRINGs können diese Funktionalität nutzen (siehe ITU-T X.690).
Enthält den Wert eines ASN.1-Typs. Bitte konsultieren Sie Constructive und Primitive für die Abbildungen zwischen ASN.1-Datentypen und Ruby-Klassen.
Öffentliche Klassenmethoden
Source
static VALUE
ossl_asn1data_initialize(VALUE self, VALUE value, VALUE tag, VALUE tag_class)
{
if(!SYMBOL_P(tag_class))
ossl_raise(eASN1Error, "invalid tag class");
ossl_asn1_set_tag(self, tag);
ossl_asn1_set_value(self, value);
ossl_asn1_set_tag_class(self, tag_class);
ossl_asn1_set_indefinite_length(self, Qfalse);
return self;
}
value: Bitte werfen Sie einen Blick auf Constructive und Primitive, um zu sehen, wie Ruby-Typen auf ASN.1-Typen und umgekehrt abgebildet werden.
tag: Ein Integer, der die Tag-Nummer angibt.
tag_class: Ein Symbol, der die Tag-Klasse angibt. Bitte konsultieren Sie ASN1 für mögliche Werte.
Beispiel
asn1_int = OpenSSL::ASN1Data.new(42, 2, :UNIVERSAL) # => Same as OpenSSL::ASN1::Integer.new(42) tagged_int = OpenSSL::ASN1Data.new(42, 0, :CONTEXT_SPECIFIC) # implicitly 0-tagged INTEGER
Öffentliche Instanzmethoden
Source
static VALUE
ossl_asn1data_to_der(VALUE self)
{
VALUE value = ossl_asn1_get_value(self);
if (rb_obj_is_kind_of(value, rb_cArray))
return ossl_asn1cons_to_der(self);
else {
if (RTEST(ossl_asn1_get_indefinite_length(self)))
ossl_raise(eASN1Error, "indefinite length form cannot be used " \
"with primitive encoding");
return ossl_asn1prim_to_der(self);
}
}