
Property changes on: ruby/ext/openssl
___________________________________________________________________
Modified: svn:ignore
   - GNUmakefile
Makefile
dep
extconf.h
mkmf.log
openssl.a
conftest.dSYM

   + GNUmakefile
Makefile
dep
extconf.h
mkmf.log
openssl.a
conftest.dSYM
openssl.so


Index: ruby/ext/openssl/ossl_asn1.c
===================================================================
--- ruby/ext/openssl/ossl_asn1.c	(revision 30640)
+++ ruby/ext/openssl/ossl_asn1.c	(working copy)
@@ -489,6 +489,8 @@
 
 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*
@@ -570,14 +572,15 @@
 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)));
 
@@ -1260,4 +1263,32 @@
     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);
 }
Index: ruby/test/openssl/test_asn1.rb
===================================================================
--- ruby/test/openssl/test_asn1.rb	(revision 30640)
+++ ruby/test/openssl/test_asn1.rb	(working copy)
@@ -430,4 +430,36 @@
     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)
