Spec-Zone.ru › Ruby 3.4
  1. OpenSSL::
  2. ASN1::
  3. ASN1Data

класс OpenSSL::ASN1::ASN1Data

Родительский класс:
Object

Базовый класс, представляющий любой объект ASN.1. При разборе с помощью ASN1.decode значения с тегами всегда представлены экземпляром ASN1Data.

Роль ASN1Data при разборе значений с тегами

При кодировании типа ASN.1 исходный тип этого значения (например, INTEGER, OCTET STRING и т. д.) однозначно известен независимо от его тегирования. Однако, в отличие от кодирования типа ASN.1, при разборе невозможно определить «реальный тип» значений с тегами. Поэтому значения с тегами обычно разбираются в экземпляры ASN1Data, но результат различается для неявного и явного тегирования.

Пример разбора значения с неявным тегом

Значение INTEGER с неявным тегом 1 будет разобрано как ASN1Data, у которого

  • tag равно 1

  • tag_class равно :CONTEXT_SPECIFIC

  • value равно String, содержащей исходное кодирование INTEGER.

Это означает, что для полного декодирования значений с неявными тегами требуется дополнительный шаг декодирования.

Пример разбора значения с явным тегом

Значение INTEGER с явным тегом 1 будет разобрано как 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

Атрибуты

indefinite_length [RW]

Никогда nil. Логическое значение, указывающее, использует ли кодирование неопределённую длину (при разборе) или следует ли использовать форму с неопределённой длиной (при кодировании). В DER для всех значений используется форма с определённой длиной. Однако в ситуациях, когда необходимо передавать большие объёмы данных, может быть полезна поддержка потоковой передачи. Например, большие значения OCTET STRING предпочтительно передавать небольшими фрагментами, по одному за раз. В BER это возможно: байты длины кодирования устанавливаются в ноль, что указывает на передачу следующего значения фрагментами. Кодирования с неопределённой длиной всегда являются составными. Конец такого потока фрагментов обозначается тегом EOC (End of Content). Для SET и SEQUENCE можно использовать кодирование с неопределённой длиной, но эту возможность могут использовать и примитивные типы, например OCTET STRING или BIT STRING (см. ITU-T X.690).

infinite_length [RW]

Никогда nil. Логическое значение, указывающее, использует ли кодирование неопределённую длину (при разборе) или следует ли использовать форму с неопределённой длиной (при кодировании). В DER для всех значений используется форма с определённой длиной. Однако в ситуациях, когда необходимо передавать большие объёмы данных, может быть полезна поддержка потоковой передачи. Например, большие значения OCTET STRING предпочтительно передавать небольшими фрагментами, по одному за раз. В BER это возможно: байты длины кодирования устанавливаются в ноль, что указывает на передачу следующего значения фрагментами. Кодирования с неопределённой длиной всегда являются составными. Конец такого потока фрагментов обозначается тегом EOC (End of Content). Для SET и SEQUENCE можно использовать кодирование с неопределённой длиной, но эту возможность могут использовать и примитивные типы, например OCTET STRING или BIT STRING (см. ITU-T X.690).

infinite_length= [RW]

Никогда nil. Логическое значение, указывающее, использует ли кодирование неопределённую длину (при разборе) или следует ли использовать форму с неопределённой длиной (при кодировании). В DER для всех значений используется форма с определённой длиной. Однако в ситуациях, когда необходимо передавать большие объёмы данных, может быть полезна поддержка потоковой передачи. Например, большие значения OCTET STRING предпочтительно передавать небольшими фрагментами, по одному за раз. В BER это возможно: байты длины кодирования устанавливаются в ноль, что указывает на передачу следующего значения фрагментами. Кодирования с неопределённой длиной всегда являются составными. Конец такого потока фрагментов обозначается тегом EOC (End of Content). Для SET и SEQUENCE можно использовать кодирование с неопределённой длиной, но эту возможность могут использовать и примитивные типы, например OCTET STRING или BIT STRING (см. ITU-T X.690).

tag [RW]

Integer, представляющее номер тега этого объекта ASN1Data. Никогда nil.

tag_class [RW]

Symbol, представляющий класс тега этого объекта ASN1Data. Никогда nil. Возможные значения см. в ASN1Data.

value [RW]

Содержит значение типа ASN.1. Соответствие между типами данных ASN.1 и классами Ruby описано в разделах Constructive и Primitive.

Общедоступные методы класса

OpenSSL::ASN1::ASN1Data.new(value, tag, tag_class) → ASN1Data Показать исходный код
# File ext/openssl/lib/openssl/asn1.rb, line 66
def initialize(value, tag, tag_class)
  raise ASN1Error, "invalid tag class" unless tag_class.is_a?(Symbol)

  @tag = tag
  @value = value
  @tag_class = tag_class
  @indefinite_length = false
end

value: См. разделы Constructive и Primitive, чтобы узнать, как типы Ruby преобразуются в типы ASN.1 и наоборот.

tag: Integer, указывающее номер тега.

tag_class: Symbol, указывающий класс тега. Возможные значения см. в ASN1.

Пример

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

Общедоступные методы экземпляра

to_der → DER-encoded String Показать исходный код
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);
    }
}

Кодирует этот объект ASN1Data в значение String, закодированное в DER. Результат кодируется в DER, за исключением возможности использования форм с неопределённой длиной. Формы с неопределённой длиной не допускаются в строгом DER, поэтому, строго говоря, результат такого кодирования будет кодированием BER.

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API