class OpenSSL::ASN1::Constructive
Die Elternklasse für alle konstruierten Kodierungen. Der value-Attribut einer Constructive ist immer ein Array. Attribute sind die gleichen wie für ASN1Data, mit der Ergänzung von tagging.
SET und SEQUENCE
Die meisten konstruierten Kodierungen kommen in Form eines SET oder einer SEQUENCE. Diese Kodierungen werden durch eine der beiden Unterklassen von Constructive dargestellt
-
OpenSSL::ASN1::Sequence
Bitte beachten Sie, dass getaggte Sequenzen und Sets immer noch als Instanzen von ASN1Data geparst werden. Find weitere Details zu getaggten Werten dort.
Beispiel - Konstruktion einer SEQUENCE
int = OpenSSL::ASN1::Integer.new(1) str = OpenSSL::ASN1::PrintableString.new('abc') sequence = OpenSSL::ASN1::Sequence.new( [ int, str ] )
Beispiel - Konstruktion eines SET
int = OpenSSL::ASN1::Integer.new(1) str = OpenSSL::ASN1::PrintableString.new('abc') set = OpenSSL::ASN1::Set.new( [ int, str ] )
Attribute
Kann als Hinweis für die Kodierung eines Wertes entweder implizit oder explizit verwendet werden, indem es entweder auf :IMPLICIT oder :EXPLICIT gesetzt wird. tagging ist nicht gesetzt, wenn eine ASN.1-Struktur mit OpenSSL::ASN1.decode geparst wird.
Öffentliche Klassenmethoden
Source
static VALUE
ossl_asn1_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE value, tag, tagging, tag_class;
int default_tag;
rb_scan_args(argc, argv, "13", &value, &tag, &tagging, &tag_class);
default_tag = ossl_asn1_default_tag(self);
if (default_tag == -1 || argc > 1) {
if(NIL_P(tag))
ossl_raise(eASN1Error, "must specify tag number");
if(!NIL_P(tagging) && !SYMBOL_P(tagging))
ossl_raise(eASN1Error, "invalid tagging method");
if(NIL_P(tag_class)) {
if (NIL_P(tagging))
tag_class = sym_UNIVERSAL;
else
tag_class = sym_CONTEXT_SPECIFIC;
}
if(!SYMBOL_P(tag_class))
ossl_raise(eASN1Error, "invalid tag class");
}
else{
tag = INT2NUM(default_tag);
tagging = Qnil;
tag_class = sym_UNIVERSAL;
}
ossl_asn1_set_tag(self, tag);
ossl_asn1_set_value(self, value);
ossl_asn1_set_tagging(self, tagging);
ossl_asn1_set_tag_class(self, tag_class);
ossl_asn1_set_indefinite_length(self, Qfalse);
if (default_tag == V_ASN1_BIT_STRING)
rb_ivar_set(self, sivUNUSED_BITS, INT2FIX(0));
return self;
}
value: ist zwingend erforderlich.
tag: optional, kann für getaggte Werte angegeben werden. Wenn kein tag angegeben wird, wird standardmäßig der UNIVERSAL-Tag verwendet, der der Primitive-Unterklasse entspricht.
tagging: kann als Kodierungshinweis verwendet werden, um einen Wert entweder explizit oder implizit zu kodieren. Siehe ASN1 für mögliche Werte.
tag_class: Wenn tag und tagging nil sind, wird dies standardmäßig auf :UNIVERSAL gesetzt. Wenn entweder tag oder tagging gesetzt sind, wird standardmäßig :CONTEXT_SPECIFIC verwendet. Mögliche Werte finden Sie unter ASN1.
Beispiel
int = OpenSSL::ASN1::Integer.new(42) zero_tagged_int = OpenSSL::ASN1::Integer.new(42, 0, :IMPLICIT) private_explicit_zero_tagged_int = OpenSSL::ASN1::Integer.new(42, 0, :EXPLICIT, :PRIVATE)
Öffentliche Instanzmethoden
Source
static VALUE
ossl_asn1cons_each(VALUE self)
{
rb_block_call(ossl_asn1_get_value(self), id_each, 0, 0, 0, 0);
return self;
}
Ruft den angegebenen Block einmal für jedes Element in self auf und übergibt dieses Element als Parameter asn1. Wenn kein Block angegeben wird, wird stattdessen ein Enumerator zurückgegeben.
Beispiel
asn1_ary.each do |asn1| puts asn1 end
Source
static VALUE
ossl_asn1cons_to_der(VALUE self)
{
VALUE ary, str;
long i;
int indef_len;
indef_len = RTEST(ossl_asn1_get_indefinite_length(self));
ary = rb_convert_type(ossl_asn1_get_value(self), T_ARRAY, "Array", "to_a");
str = rb_str_new(NULL, 0);
for (i = 0; i < RARRAY_LEN(ary); i++) {
VALUE item = RARRAY_AREF(ary, i);
if (indef_len && rb_obj_is_kind_of(item, cASN1EndOfContent)) {
if (i != RARRAY_LEN(ary) - 1)
ossl_raise(eASN1Error, "illegal EOC octets in value");
/*
* EOC is not really part of the content, but we required to add one
* at the end in the past.
*/
break;
}
item = ossl_to_der_if_possible(item);
StringValue(item);
rb_str_append(str, item);
}
return to_der_internal(self, 1, indef_len, str);
}
Siehe ASN1Data#to_der für Details.