In Files

  • openssl/ossl_asn1.c

Methods

Included Modules

Class/Module Index [+]

Quicksearch

OpenSSL::ASN1::Constructive

Attributes

tagging[RW]

Public Class Methods

new(p1, p2 = v2, p3 = v3, p4 = v4) click to toggle source
 
               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))
            tagging = ID2SYM(sEXPLICIT);
        if(!SYMBOL_P(tagging))
            ossl_raise(eASN1Error, "invalid tag default");
        if(NIL_P(tag_class))
            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);

    return self;
}
            

Public Instance Methods

each() click to toggle source
 
               static VALUE
ossl_asn1cons_each(VALUE self)
{
    rb_ary_each(ossl_asn1_get_value(self));
    return self;
}
            
to_der() click to toggle source
 
               static VALUE
ossl_asn1cons_to_der(VALUE self)
{
    int tag, tn, tc, explicit;
    long seq_len, length;
    unsigned char *p;
    VALUE value, str;

    tag = ossl_asn1_default_tag(self);
    tn = NUM2INT(ossl_asn1_get_tag(self));
    tc = ossl_asn1_tag_class(self);
    explicit = ossl_asn1_is_explicit(self);
    value = join_der(ossl_asn1_get_value(self));

    seq_len = ASN1_object_size(1, RSTRING_LEN(value), tag);
    length = ASN1_object_size(1, seq_len, tn);
    str = rb_str_new(0, length);
    p = (unsigned char *)RSTRING_PTR(str);
    if(tc == V_ASN1_UNIVERSAL)
        ASN1_put_object(&p, 1, RSTRING_LEN(value), tn, tc);
    else{
        if(explicit){
            ASN1_put_object(&p, 1, seq_len, tn, tc);
            ASN1_put_object(&p, 1, RSTRING_LEN(value), tag, V_ASN1_UNIVERSAL);
        }
        else ASN1_put_object(&p, 1, RSTRING_LEN(value), tn, tc);
    }
    memcpy(p, RSTRING_PTR(value), RSTRING_LEN(value));
    p += RSTRING_LEN(value);
    ossl_str_adjust(str, p);

    return str;
}