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/