Project

General

Profile

Feature #4309 » class_tag_map3.diff

MartinBosslet (Martin Bosslet), 01/25/2011 07:37 AM

View differences:

ruby/ext/openssl/ossl_asn1.c (working copy)
int ossl_asn1_info_size = (sizeof(ossl_asn1_info)/sizeof(ossl_asn1_info[0]));
static VALUE class_tag_map;
static int ossl_asn1_default_tag(VALUE obj);
ASN1_TYPE*
......
static int
ossl_asn1_default_tag(VALUE obj)
{
int i;
VALUE tmp_class = CLASS_OF(obj);
while (tmp_class) {
VALUE tag = rb_hash_lookup(class_tag_map, tmp_class);
if (tag != Qnil) {
return NUM2INT(tag);
}
tmp_class = RCLASS_SUPER(tmp_class);
}
for(i = 0; i < ossl_asn1_info_size; i++){
if(ossl_asn1_info[i].klass &&
rb_obj_is_kind_of(obj, *ossl_asn1_info[i].klass)){
return i;
}
}
ossl_raise(eASN1Error, "universal tag for %s not found",
rb_class2name(CLASS_OF(obj)));
......
rb_attr(cASN1BitString, rb_intern("unused_bits"), 1, 1, 0);
rb_define_method(cASN1EndOfContent, "initialize", ossl_asn1eoc_initialize, 0);
class_tag_map = rb_hash_new();
rb_hash_aset(class_tag_map, cASN1EndOfContent, INT2NUM(0));
rb_hash_aset(class_tag_map, cASN1Boolean, INT2NUM(1));
rb_hash_aset(class_tag_map, cASN1Integer, INT2NUM(2));
rb_hash_aset(class_tag_map, cASN1BitString, INT2NUM(3));
rb_hash_aset(class_tag_map, cASN1OctetString, INT2NUM(4));
rb_hash_aset(class_tag_map, cASN1Null, INT2NUM(5));
rb_hash_aset(class_tag_map, cASN1ObjectId, INT2NUM(6));
rb_hash_aset(class_tag_map, cASN1Enumerated, INT2NUM(10));
rb_hash_aset(class_tag_map, cASN1UTF8String, INT2NUM(12));
rb_hash_aset(class_tag_map, cASN1Sequence, INT2NUM(16));
rb_hash_aset(class_tag_map, cASN1Set, INT2NUM(17));
rb_hash_aset(class_tag_map, cASN1NumericString, INT2NUM(18));
rb_hash_aset(class_tag_map, cASN1PrintableString, INT2NUM(19));
rb_hash_aset(class_tag_map, cASN1T61String, INT2NUM(20));
rb_hash_aset(class_tag_map, cASN1VideotexString, INT2NUM(21));
rb_hash_aset(class_tag_map, cASN1IA5String, INT2NUM(22));
rb_hash_aset(class_tag_map, cASN1UTCTime, INT2NUM(23));
rb_hash_aset(class_tag_map, cASN1GeneralizedTime, INT2NUM(24));
rb_hash_aset(class_tag_map, cASN1GraphicString, INT2NUM(25));
rb_hash_aset(class_tag_map, cASN1ISO64String, INT2NUM(26));
rb_hash_aset(class_tag_map, cASN1GeneralString, INT2NUM(27));
rb_hash_aset(class_tag_map, cASN1UniversalString, INT2NUM(28));
rb_hash_aset(class_tag_map, cASN1BMPString, INT2NUM(30));
class_tag_map = rb_obj_freeze(class_tag_map);
rb_define_const(mASN1, "CLASS_TAG_MAP", class_tag_map);
}
ruby/test/openssl/test_asn1.rb (working copy)
end
end
def test_default_tag_of_class
assert_equal(0, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::EndOfContent])
assert_equal(1, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::Boolean])
assert_equal(2, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::Integer])
assert_equal(3, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::BitString])
assert_equal(4, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::OctetString])
assert_equal(5, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::Null])
assert_equal(6, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::ObjectId])
assert_equal(10, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::Enumerated])
assert_equal(12, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::UTF8String])
assert_equal(16, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::Sequence])
assert_equal(17, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::Set])
assert_equal(18, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::NumericString])
assert_equal(19, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::PrintableString])
assert_equal(20, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::T61String])
assert_equal(21, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::VideotexString])
assert_equal(22, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::IA5String])
assert_equal(23, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::UTCTime])
assert_equal(24, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::GeneralizedTime])
assert_equal(25, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::GraphicString])
assert_equal(26, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::ISO64String])
assert_equal(27, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::GeneralString])
assert_equal(28, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::UniversalString])
assert_equal(30, OpenSSL::ASN1::CLASS_TAG_MAP[OpenSSL::ASN1::BMPString])
end
def test_class_tag_map_is_frozen
assert_raises(RuntimeError) do
OpenSSL::ASN1::CLASS_TAG_MAP[self.class] = 99
end
end
end if defined?(OpenSSL)
(3-3/3)