1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31698 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
emboss 2011-05-22 19:08:45 +00:00
parent 9253bd7797
commit efd99b781b
2 changed files with 51 additions and 31 deletions

View file

@ -1,3 +1,14 @@
Mon May 23 04:03:46 2011 Martin Bosslet <Martin.Bosslet@googlemail.com>
* 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@googlemail.com>
* ext/openssl/ossl_asn1.c (ossl_asn1data_to_der): Remove redundant
flag tmp_cons.
Mon May 23 00:35:00 2001 Kenta Murata <mrkn@mrkn.jp>
* bignum.c (dump_bignum, bigmul1_balance, big_split, biglsh_bang,

View file

@ -1137,36 +1137,36 @@ ossl_asn1cons_to_der(VALUE self)
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 @@ ossl_asn1cons_to_der(VALUE self)
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;