Spec-Zone.ru › Ruby 2.3

класс OpenSSL::ASN1::Primitive

Родитель:
OpenSSL::ASN1::ASN1Data

Базовый класс для всех примитивных кодировок. Атрибуты такие же, как у ASN1Data, с добавлением tagging. Значения Primitive никогда не могут быть кодировками бесконечной длины, поэтому нельзя установить атрибут infinite_length для Primitive и его подклассов.

Примитивные подклассы и их соответствие классам Ruby

  • OpenSSL::ASN1::EndOfContent <=> value всегда nil

  • OpenSSL::ASN1::Boolean <=> value является Boolean

  • OpenSSL::ASN1::Integer <=> value является Number

  • OpenSSL::ASN1::BitString <=> value является String

  • OpenSSL::ASN1::OctetString <=> value является String

  • OpenSSL::ASN1::Null <=> value всегда nil

  • OpenSSL::ASN1::Object <=> value является String

  • OpenSSL::ASN1::Enumerated <=> value является Number

  • OpenSSL::ASN1::UTF8String <=> value является String

  • OpenSSL::ASN1::NumericString <=> value является String

  • OpenSSL::ASN1::PrintableString <=> value является String

  • OpenSSL::ASN1::T61String <=> value является String

  • OpenSSL::ASN1::VideotexString <=> value является String

  • OpenSSL::ASN1::IA5String <=> value является String

  • OpenSSL::ASN1::UTCTime <=> value является Time

  • OpenSSL::ASN1::GeneralizedTime <=> value является Time

  • OpenSSL::ASN1::GraphicString <=> value является String

  • OpenSSL::ASN1::ISO64String <=> value является String

  • OpenSSL::ASN1::GeneralString <=> value является String

  • OpenSSL::ASN1::UniversalString <=> value является String

  • OpenSSL::ASN1::BMPString <=> value является String

OpenSSL::ASN1::BitString

Дополнительные атрибуты

unused_bits: если длина базового BIT STRING кратна 8, то unused_bits равно 0. В противном случае unused_bits указывает количество бит, которые следует игнорировать в последнем октете BitString.

OpenSSL::ASN1::ObjectId

ПРИМЕЧАНИЕ: Хотя ::new выделяет новый ObjectId, обычно он не выделяется таким образом, а получен из проанализированных кодировок ASN1.

Хотя ::new выделяет новый ObjectId, обычно он не выделяется таким образом, а получен из проанализированных кодировок ASN1.

Дополнительные атрибуты

  • sn: короткое имя, определенное в <openssl/objects.h>.

  • ln: длинное имя, определенное в <openssl/objects.h>.

  • oid: идентификатор объекта в виде String, например, “1.2.3.4.5”

  • short_name: псевдоним для sn.

  • long_name: псевдоним для ln.

Примеры

За исключением OpenSSL::ASN1::EndOfContent, каждый конструктор класса Primitive принимает по крайней мере один параметр, value.

Создание EndOfContent

eoc = OpenSSL::ASN1::EndOfContent.new

Создание любого другого Primitive

prim = <class>.new(value) # <class> being one of the sub-classes except EndOfContent
prim_zero_tagged_implicit = <class>.new(value, 0, :IMPLICIT)
prim_zero_tagged_explicit = <class>.new(value, 0, :EXPLICIT)

Атрибуты

tagging[RW]

Может использоваться как подсказка для кодирования значения либо неявно, либо явно, установив его либо в :IMPLICIT, либо в :EXPLICIT. tagging не устанавливается при парсинге структуры ASN.1 с помощью OpenSSL::ASN1.decode.

Публичные методы класса

OpenSSL::ASN1::Primitive.new( value [, tag, tagging, tag_class ]) → Primitive Показать исходный код
static VALUE
ossl_asn1_initialize(int argc, VALUE *argv, VALUE self)
{
    VALUE value, tag, tagging, tag_class;

    rb_scan_args(argc, argv, "13", &value, &tag, &tagging, &tag_class);
    if(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 = ID2SYM(sUNIVERSAL);
            else
                tag_class = ID2SYM(sCONTEXT_SPECIFIC);
        }
        if(!SYMBOL_P(tag_class))
            ossl_raise(eASN1Error, "invalid tag class");
        if(!NIL_P(tagging) && SYM2ID(tagging) == sIMPLICIT && NUM2INT(tag) > 31)
            ossl_raise(eASN1Error, "tag number for Universal too large");
    }
    else{
        tag = INT2NUM(ossl_asn1_default_tag(self));
        tagging = Qnil;
        tag_class = ID2SYM(sUNIVERSAL);
    }
    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_infinite_length(self, Qfalse);

    return self;
}

value: является обязательным.

tag: необязательный, может быть указан для помеченных значений. Если tag не указан, используется универсальная метка, соответствующая подклассу Primitive по умолчанию.

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)

Публичные методы экземпляра

to_der → DER-кодированная строка Показать исходный код
static VALUE
ossl_asn1prim_to_der(VALUE self)
{
    ASN1_TYPE *asn1;
    int tn, tc, explicit;
    long len, reallen;
    unsigned char *buf, *p;
    VALUE str;

    tn = NUM2INT(ossl_asn1_get_tag(self));
    tc = ossl_asn1_tag_class(self);
    explicit = ossl_asn1_is_explicit(self);
    asn1 = ossl_asn1_get_asn1type(self);

    len = ossl_asn1_object_size(1, ossl_i2d_ASN1_TYPE(asn1, NULL), tn);
    if(!(buf = OPENSSL_malloc(len))){
        ossl_ASN1_TYPE_free(asn1);
        ossl_raise(eASN1Error, "cannot alloc buffer");
    }
    p = buf;
    if (tc == V_ASN1_UNIVERSAL) {
        ossl_i2d_ASN1_TYPE(asn1, &p);
    } else if (explicit) {
        ossl_asn1_put_object(&p, 1, ossl_i2d_ASN1_TYPE(asn1, NULL), tn, tc);
        ossl_i2d_ASN1_TYPE(asn1, &p);
    } else {
        ossl_i2d_ASN1_TYPE(asn1, &p);
        *buf = tc | tn | (*buf & V_ASN1_CONSTRUCTED);
    }
    ossl_ASN1_TYPE_free(asn1);
    reallen = p - buf;
    assert(reallen <= len);
    str = ossl_buf2str((char *)buf, rb_long2int(reallen)); /* buf will be free in ossl_buf2str */

    return str;
}

См. OpenSSL::ASN1::ASN1Data#to_der для подробностей. *

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

Spec-Zone.ru

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