Skip to content

Commit e1cdc0a

Browse files
HoneyryderChuckkares
authored andcommitted
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 adcd031 commit e1cdc0a

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

src/main/java/org/jruby/ext/openssl/ASN1.java

+9-11
Original file line numberDiff line numberDiff line change
@@ -1931,19 +1931,17 @@ private byte[] setToDER(final ThreadContext context) throws IOException {
19311931
private ASN1EncodableVector toASN1EncodableVector(final ThreadContext context) {
19321932
final ASN1EncodableVector vec = new ASN1EncodableVector();
19331933
final IRubyObject value = value(context);
1934-
if ( value instanceof RubyArray ) {
1935-
final RubyArray val = (RubyArray) value;
1936-
for ( int i = 0; i < val.size(); i++ ) {
1937-
if ( addEntry(context, vec, val.entry(i)) ) break;
1934+
final RubyArray val;
1935+
if (value instanceof RubyArray ) {
1936+
val = (RubyArray) value;
1937+
} else {
1938+
if (!value.respondsTo("to_a")) {
1939+
throw context.runtime.newTypeError("can't convert " + value.getMetaClass().getName() + " into Array");
19381940
}
1941+
val = (RubyArray) value.callMethod(context, "to_a");
19391942
}
1940-
else {
1941-
final int size = RubyInteger.num2int(value.callMethod(context, "size"));
1942-
for ( int i = 0; i < size; i++ ) {
1943-
final RubyInteger idx = context.runtime.newFixnum(i);
1944-
IRubyObject entry = value.callMethod(context, "[]", idx);
1945-
if ( addEntry(context, vec, entry) ) break;
1946-
}
1943+
for ( int i = 0; i < val.size(); i++ ) {
1944+
if ( addEntry(context, vec, val.entry(i)) ) break;
19471945
}
19481946
return vec;
19491947
}

src/test/ruby/test_asn1.rb

+8-5
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ def test_encode_nil
2626

2727
assert_raise(TypeError) { OpenSSL::ASN1::Integer.new(nil).to_der }
2828
assert_raise(TypeError) { OpenSSL::ASN1::Boolean.new(nil).to_der }
29-
30-
# NOTE: MRI does not raise
31-
assert_raise(NoMethodError) { OpenSSL::ASN1::Set.new(nil).to_der }
32-
# NOTE: MRI does not raise
33-
assert_raise(NoMethodError) { OpenSSL::ASN1::Sequence.new(nil).to_der }
3429
end
3530

3631
def test_instantiate
@@ -167,6 +162,14 @@ def test_constructive_nesting
167162
assert_equal expected, name.to_der
168163
end
169164

165+
def test_sequence_convert_to_array
166+
data_sequence = ::OpenSSL::ASN1::Sequence([::OpenSSL::ASN1::Integer(0)])
167+
asn1 = ::OpenSSL::ASN1::Sequence(data_sequence)
168+
assert_equal "0\x03\x02\x01\x00" , asn1.to_der
169+
170+
assert_raise(TypeError) { ::OpenSSL::ASN1::Sequence(::OpenSSL::ASN1::Integer(0)).to_der }
171+
end
172+
170173
def test_raw_constructive
171174
eoc = OpenSSL::ASN1::EndOfContent.new
172175
#puts "eoc: #{eoc.inspect}"

0 commit comments

Comments
 (0)