[前][次][番号順一覧][スレッド一覧]

ruby-changes:19653

From: emboss <ko1@a...>
Date: Mon, 23 May 2011 04:09:42 +0900 (JST)
Subject: [ruby-changes:19653] emboss:r31698 (trunk): * ext/openssl/ossl_asn1.c (ossl_asn1_cons_to_der): Add an additional

emboss	2011-05-23 04:08:45 +0900 (Mon, 23 May 2011)

  New Revision: 31698

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31698

  Log:
    * ext/openssl/ossl_asn1.c (ossl_asn1_cons_to_der): Add an additional
    EOC for infinite length Constructives that are supposed to be encoded
    with explicit tagging. Also tabify method correctly.

  Modified files:
    trunk/ChangeLog
    trunk/ext/openssl/ossl_asn1.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 31697)
+++ ChangeLog	(revision 31698)
@@ -1,3 +1,14 @@
+Mon May 23 04:03:46 2011  Martin Bosslet  <Martin.Bosslet@g...>
+
+	* ext/openssl/ossl_asn1.c (ossl_asn1_cons_to_der): Add an additional
+	EOC for infinite length Constructives that are supposed to be encoded
+	with explicit tagging. Also tabify method correctly.
+
+Mon May 23 03:44:39 2011  Martin Bosslet  <Martin.Bosslet@g...>
+
+	* ext/openssl/ossl_asn1.c (ossl_asn1data_to_der): Remove redundant
+	flag tmp_cons.
+
 Mon May 23 00:35:00 2001  Kenta Murata  <mrkn@m...>
 
 	* bignum.c (dump_bignum, bigmul1_balance, big_split, biglsh_bang,
Index: ext/openssl/ossl_asn1.c
===================================================================
--- ext/openssl/ossl_asn1.c	(revision 31697)
+++ ext/openssl/ossl_asn1.c	(revision 31698)
@@ -1137,36 +1137,36 @@
     tc = ossl_asn1_tag_class(self);
     inf_length = ossl_asn1_get_infinite_length(self);
     if (inf_length == Qtrue) {
-        constructed = 2;
-        if (CLASS_OF(self) == cASN1Sequence ||
-            CLASS_OF(self) == cASN1Set) {
-            tag = ossl_asn1_default_tag(self);
-        }
-        else { /*BIT_STRING OR OCTET_STRING*/
-            ary = ossl_asn1_get_value(self);
-            /* Recursively descend until a primitive value is found.
-               The overall value of the entire constructed encoding
-               is of the type of the first primitive encoding to be
-               found. */
-            while (!found_prim){
-                example = rb_ary_entry(ary, 0);
-                if (rb_obj_is_kind_of(example, cASN1Primitive)){
-                    found_prim = 1;
-                }
-                else {
-                    /* example is another ASN1Constructive */
-                    if (!rb_obj_is_kind_of(example, cASN1Constructive)){
-                        ossl_raise(eASN1Error, "invalid constructed encoding");
-                        return Qnil; /* dummy */
-                    }
-                    ary = ossl_asn1_get_value(example);
-                }
-            }
-            tag = ossl_asn1_default_tag(example);
-        }
+	constructed = 2;
+	if (CLASS_OF(self) == cASN1Sequence ||
+	    CLASS_OF(self) == cASN1Set) {
+	    tag = ossl_asn1_default_tag(self);
+	}
+	else { /*BIT_STRING OR OCTET_STRING*/
+	    ary = ossl_asn1_get_value(self);
+	    /* Recursively descend until a primitive value is found.
+	    The overall value of the entire constructed encoding
+	    is of the type of the first primitive encoding to be
+	    found. */
+	    while (!found_prim){
+		example = rb_ary_entry(ary, 0);
+		if (rb_obj_is_kind_of(example, cASN1Primitive)){
+		    found_prim = 1;
+		}
+		else {
+		    /* example is another ASN1Constructive */
+		    if (!rb_obj_is_kind_of(example, cASN1Constructive)){
+			ossl_raise(eASN1Error, "invalid constructed encoding");
+			return Qnil; /* dummy */
+		    }
+		    ary = ossl_asn1_get_value(example);
+		}
+	    }
+	    tag = ossl_asn1_default_tag(example);
+	}
     }
     else {
-        tag = ossl_asn1_default_tag(self);
+	tag = ossl_asn1_default_tag(self);
     }
     explicit = ossl_asn1_is_explicit(self);
     value = join_der(ossl_asn1_get_value(self));
@@ -1182,12 +1182,21 @@
 	    ASN1_put_object(&p, constructed, seq_len, tn, tc);
 	    ASN1_put_object(&p, constructed, RSTRING_LENINT(value), tag, V_ASN1_UNIVERSAL);
 	}
-        else{
-            ASN1_put_object(&p, constructed, RSTRING_LENINT(value), tn, tc);
-        }
+	else{
+	    ASN1_put_object(&p, constructed, RSTRING_LENINT(value), tn, tc);
+	}
     }
     memcpy(p, RSTRING_PTR(value), RSTRING_LEN(value));
     p += RSTRING_LEN(value);
+
+    /* In this case we need an additional EOC (one for the explicit part and
+     * one for the Constructive itself. The EOC for the Constructive is
+     * supplied by the user, but that for the "explicit wrapper" must be
+     * added here.
+     */
+    if (explicit && inf_length == Qtrue) {
+	ASN1_put_eoc(&p);
+    }
     ossl_str_adjust(str, p);
 
     return str;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]