Skip to content

Commit f511a30

Browse files
convert OpenSSL::ASN1::Sequence value to an array on #to_der
In order to allow sequences to sequences. the appropriate TypeError is thrown if the vale can't be converted into an array, just like in CRuby.
1 parent cb9716c commit f511a30

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

Diff for: src/main/java/org/jruby/ext/openssl/ASN1.java

+9-11
Original file line numberDiff line numberDiff line change
@@ -1953,19 +1953,17 @@ private byte[] setToDER(final ThreadContext context) throws IOException {
19531953
private ASN1EncodableVector toASN1EncodableVector(final ThreadContext context) {
19541954
final ASN1EncodableVector vec = new ASN1EncodableVector();
19551955
final IRubyObject value = value(context);
1956-
if ( value instanceof RubyArray ) {
1957-
final RubyArray val = (RubyArray) value;
1958-
for ( int i = 0; i < val.size(); i++ ) {
1959-
if ( addEntry(context, vec, val.entry(i)) ) break;
1956+
final RubyArray val;
1957+
if (value instanceof RubyArray ) {
1958+
val = (RubyArray) value;
1959+
} else {
1960+
if (!value.respondsTo("to_a")) {
1961+
throw context.runtime.newTypeError("can't convert " + value.getMetaClass().getName() + " into Array");
19601962
}
1963+
val = (RubyArray) value.callMethod(context, "to_a");
19611964
}
1962-
else {
1963-
final int size = RubyInteger.num2int(value.callMethod(context, "size"));
1964-
for ( int i = 0; i < size; i++ ) {
1965-
final RubyInteger idx = context.runtime.newFixnum(i);
1966-
IRubyObject entry = value.callMethod(context, "[]", idx);
1967-
if ( addEntry(context, vec, entry) ) break;
1968-
}
1965+
for ( int i = 0; i < val.size(); i++ ) {
1966+
if ( addEntry(context, vec, val.entry(i)) ) break;
19691967
}
19701968
return vec;
19711969
}

Diff for: src/test/ruby/test_asn1.rb

+8-5
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ def test_encode_nil
5656

5757
assert_raise(TypeError) { OpenSSL::ASN1::Integer.new(nil).to_der }
5858
assert_raise(TypeError) { OpenSSL::ASN1::Boolean.new(nil).to_der }
59-
60-
# NOTE: MRI does not raise
61-
assert_raise(NoMethodError) { OpenSSL::ASN1::Set.new(nil).to_der }
62-
# NOTE: MRI does not raise
63-
assert_raise(NoMethodError) { OpenSSL::ASN1::Sequence.new(nil).to_der }
6459
end
6560

6661
def test_instantiate
@@ -197,6 +192,14 @@ def test_constructive_nesting
197192
assert_equal expected, name.to_der
198193
end
199194

195+
def test_sequence_convert_to_array
196+
data_sequence = ::OpenSSL::ASN1::Sequence([::OpenSSL::ASN1::Integer(0)])
197+
asn1 = ::OpenSSL::ASN1::Sequence(data_sequence)
198+
assert_equal "0\x03\x02\x01\x00" , asn1.to_der
199+
200+
assert_raise(TypeError) { ::OpenSSL::ASN1::Sequence(::OpenSSL::ASN1::Integer(0)).to_der }
201+
end
202+
200203
def test_raw_constructive
201204
eoc = OpenSSL::ASN1::EndOfContent.new
202205
#puts "eoc: #{eoc.inspect}"

0 commit comments

Comments
 (0)