123456789_123456789_123456789_123456789_123456789_

Class: OpenSSL::ASN1::Primitive

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, ASN1Data
Instance Chain:
Inherits: OpenSSL::ASN1::ASN1Data
Defined in: ext/openssl/ossl_asn1.c,
ext/openssl/lib/openssl/asn1.rb

Overview

The parent class for all primitive encodings. Attributes are the same as for ASN1Data, with the addition of tagging. Primitive values can never be encoded with indefinite length form, thus it is not possible to set the indefinite_length attribute for Primitive and its sub-classes.

Primitive sub-classes and their mapping to Ruby classes

  • EndOfContent <=> value is always nil

  • Boolean <=> value is true or false

  • Integer <=> value is an ::OpenSSL::BN

  • BitString <=> value is a String

  • OpenSSL::ASN1::OctetString <=> value is a String

  • OpenSSL::ASN1::Null <=> value is always nil

  • OpenSSL::ASN1::Object <=> value is a String

  • Enumerated <=> value is an ::OpenSSL::BN

  • OpenSSL::ASN1::UTF8String <=> value is a String

  • OpenSSL::ASN1::NumericString <=> value is a String

  • OpenSSL::ASN1::PrintableString <=> value is a String

  • OpenSSL::ASN1::T61String <=> value is a String

  • OpenSSL::ASN1::VideotexString <=> value is a String

  • OpenSSL::ASN1::IA5String <=> value is a String

  • OpenSSL::ASN1::UTCTime <=> value is a Time

  • OpenSSL::ASN1::GeneralizedTime <=> value is a Time

  • OpenSSL::ASN1::GraphicString <=> value is a String

  • OpenSSL::ASN1::ISO64String <=> value is a String

  • OpenSSL::ASN1::GeneralString <=> value is a String

  • OpenSSL::ASN1::UniversalString <=> value is a String

  • OpenSSL::ASN1::BMPString <=> value is a String

BitString

Additional attributes

unused_bits: if the underlying BIT STRING’s length is a multiple of 8 then unused_bits is 0. Otherwise unused_bits indicates the number of bits that are to be ignored in the final octet of the BitString’s value.

ObjectId

NOTE: While OpenSSL::ASN1::ObjectId.new will allocate a new ObjectId, it is not typically allocated this way, but rather that are received from parsed ::OpenSSL::ASN1 encodings.

Additional attributes

  • sn: the short name as defined in <openssl/objects.h>.

  • ln: the long name as defined in <openssl/objects.h>.

  • oid: the object identifier as a String, e.g. “1.2.3.4.5”

  • short_name: alias for sn.

  • long_name: alias for ln.

Examples

With the Exception of EndOfContent, each Primitive class constructor takes at least one parameter, the value.

Creating EndOfContent

eoc = OpenSSL::ASN1::EndOfContent.new

Creating any other 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)

Class Method Summary

ASN1Data - Inherited

.new

value: Please have a look at Constructive and Primitive to see how Ruby types are mapped to ASN.1 types and vice versa.

Instance Attribute Summary

TaggedASN1Data - Included

#tagging

May be used as a hint for encoding a value either implicitly or explicitly by setting it either to :IMPLICIT or to :EXPLICIT.

ASN1Data - Inherited

#indefinite_length

Never nil.

#infinite_length
#tag

An Integer representing the tag number of this ASN1Data.

#tag_class

A Symbol representing the tag class of this ASN1Data.

#value

Carries the value of a ASN.1 type.

Instance Method Summary

TaggedASN1Data - Included

#initialize

value: is mandatory.

ASN1Data - Inherited

#to_der

Encodes this ASN1Data into a DER-encoded String value.

Constructor Details

This class inherits a constructor from OpenSSL::ASN1::ASN1Data

Instance Method Details

#to_derDER-encoded String

See ASN1Data#to_der for details.

[ GitHub ]

  
# File 'ext/openssl/ossl_asn1.c', line 1027

static VALUE
ossl_asn1prim_to_der(VALUE self)
{
    ASN1_TYPE *asn1;
    long alllen, bodylen;
    unsigned char *p0, *p1;
    int j, tag, tc, state;
    VALUE str;

    if (ossl_asn1_default_tag(self) == -1) {
	str = ossl_asn1_get_value(self);
	return to_der_internal(self, 0, 0, StringValue(str));
    }

    asn1 = ossl_asn1_get_asn1type(self);
    alllen = i2d_ASN1_TYPE(asn1, NULL);
    if (alllen < 0) {
	ASN1_TYPE_free(asn1);
	ossl_raise(eASN1Error, "i2d_ASN1_TYPE");
    }
    str = ossl_str_new(NULL, alllen, &state);
    if (state) {
	ASN1_TYPE_free(asn1);
	rb_jump_tag(state);
    }
    p0 = p1 = (unsigned char *)RSTRING_PTR(str);
    if (i2d_ASN1_TYPE(asn1, &p0) < 0) {
        ASN1_TYPE_free(asn1);
        ossl_raise(eASN1Error, "i2d_ASN1_TYPE");
    }
    ASN1_TYPE_free(asn1);
    ossl_str_adjust(str, p0);

    /* Strip header since to_der_internal() wants only the payload */
    j = ASN1_get_object((const unsigned char **)&p1, &bodylen, &tag, &tc, alllen);
    if (j & 0x80)
	ossl_raise(eASN1Error, "ASN1_get_object"); /* should not happen */

    return to_der_internal(self, 0, 0, rb_str_drop_bytes(str, alllen - bodylen));
}