class OpenSSL::ASN1::Constructive
所有构造编码的父类。一个 Constructive 的 value 属性始终是一个 Array。属性与 ASN1Data 相同,并增加了 tagging。
SET 和 SEQUENCE
大多数构造编码都采用 SET 或 SEQUENCE 的形式。这些编码由 Constructive 的两个子类之一表示
-
OpenSSL::ASN1::Sequence
请注意,带标签的序列和集合仍然被解析为 ASN1Data 的实例。请在此处 查找 有关带标签值的更多详细信息。
示例 - 构建一个 SEQUENCE
int = OpenSSL::ASN1::Integer.new(1) str = OpenSSL::ASN1::PrintableString.new('abc') sequence = OpenSSL::ASN1::Sequence.new( [ int, str ] )
示例 - 构建一个 SET
int = OpenSSL::ASN1::Integer.new(1) str = OpenSSL::ASN1::PrintableString.new('abc') set = OpenSSL::ASN1::Set.new( [ int, str ] )
属性
可以通过将其设置为 :IMPLICIT 或 :EXPLICIT 来作为隐式或显式编码值的提示。使用 OpenSSL::ASN1.decode 解析 ASN.1 结构时,tagging 不会被设置。
Public Class Methods
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: 是必需的。
tag: 可选,可以为带标签的值指定。如果未指定 tag,则默认使用与 Primitive 子类对应的 UNIVERSAL 标签。
tagging: 可以作为编码提示,用于显式或隐式编码值,有关可能的值,请参阅 ASN1。
tag_class: 如果 tag 和 tagging 为 nil,则默认设置为 :UNIVERSAL。如果设置了 tag 或 tagging 中的任何一个,则默认使用 :CONTEXT_SPECIFIC。有关可能的值,请参阅 ASN1。
示例
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)
Public Instance Methods
Source
static VALUE
ossl_asn1cons_each(VALUE self)
{
rb_block_call(ossl_asn1_get_value(self), id_each, 0, 0, 0, 0);
return self;
}
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);
}
有关详细信息,请参阅 ASN1Data#to_der。