Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more
The parent class for all primitive encodings. Attributes are the same as
for ASN1Data, with the addition of
tagging
. Primitive values can
never be infinite length encodings, thus it is not possible to set the
infinite_length
attribute for Primitive and its sub-classes.
OpenSSL::ASN1::EndOfContent <=> value
is always
nil
OpenSSL::ASN1::Boolean <=> value
is a
Boolean
OpenSSL::ASN1::Integer <=> value
is a
Number
OpenSSL::ASN1::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
OpenSSL::ASN1::Enumerated <=> value
is a
Number
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
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
.
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
.
With the Exception of OpenSSL::ASN1::EndOfContent, each Primitive class constructor takes at least one
parameter, the value
.
eoc = OpenSSL::ASN1::EndOfContent.new
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)
May be used as a hint for encoding a value either implicitly or explicitly
by setting it either to :IMPLICIT
or to
:EXPLICIT
. tagging
is not set when a ASN.1
structure is parsed using OpenSSL::ASN1.decode.
value
: is mandatory.
tag
: optional, may be specified for tagged values. If no
tag
is specified, the UNIVERSAL tag corresponding to the Primitive sub-class is used by default.
tagging
: may be used as an encoding hint to encode a value
either explicitly or implicitly, see ASN1 for
possible values.
tag_class
: if tag
and tagging
are
nil
then this is set to :UNIVERSAL
by default. If
either tag
or tagging
are set then
:CONTEXT_SPECIFIC
is used as the default. For possible values
please cf. 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)
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(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; }
See OpenSSL::ASN1::ASN1Data#to_der for details. *
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; }
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.