Skip to content

Commit 5e939b6

Browse files
committed
trying to decode DER application specific objects (based on patch and test from #36)
1 parent 381af50 commit 5e939b6

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.bouncycastle.asn1.BERSequenceGenerator;
6767
import org.bouncycastle.asn1.BERSet;
6868
import org.bouncycastle.asn1.BERTags;
69+
import org.bouncycastle.asn1.DERApplicationSpecific;
6970
import org.bouncycastle.asn1.DERBMPString;
7071
import org.bouncycastle.asn1.DERBoolean;
7172
import org.bouncycastle.asn1.DEREnumerated;
@@ -1093,6 +1094,18 @@ else if ( obj instanceof DERBMPString ) {
10931094
);
10941095
}
10951096

1097+
if ( obj instanceof DERApplicationSpecific ) {
1098+
final DERApplicationSpecific appSpecific = (DERApplicationSpecific) obj;
1099+
IRubyObject tag = runtime.newFixnum( appSpecific.getApplicationTag() );
1100+
IRubyObject tag_class = runtime.newSymbol("APPLICATION");
1101+
final ASN1Sequence sequence = (ASN1Sequence) appSpecific.getObject(SEQUENCE);
1102+
@SuppressWarnings("unchecked")
1103+
final RubyArray valArr = decodeObjects(context, ASN1, sequence.getObjects());
1104+
return ASN1.getClass("ASN1Data").callMethod(context, "new",
1105+
new IRubyObject[] { valArr, tag, tag_class }
1106+
);
1107+
}
1108+
10961109
if ( obj instanceof ASN1Sequence ) {
10971110
@SuppressWarnings("unchecked")
10981111
RubyArray arr = decodeObjects(context, ASN1, ((ASN1Sequence) obj).getObjects());

src/test/ruby/test_asn1.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,32 @@ def test_decode_all
477477
end
478478
end
479479

480+
def test_decode_application_specific
481+
raw = "0\x18\x02\x01\x01`\x13\x02\x01\x03\x04\to=Telstra\x80\x03ess"
482+
asn1 = OpenSSL::ASN1.decode(raw)
483+
pp asn1 if false
484+
485+
assert_equal OpenSSL::ASN1::Sequence, asn1.class
486+
assert_equal 2, asn1.value.size
487+
assert_equal OpenSSL::ASN1::Integer, asn1.value[0].class
488+
assert_equal 1, asn1.value[0].value
489+
assert_equal OpenSSL::ASN1::ASN1Data, asn1.value[1].class
490+
assert_equal :APPLICATION, asn1.value[1].tag_class
491+
492+
asn1_data = asn1.value[1]
493+
assert_equal 3, asn1_data.value.size
494+
assert_equal OpenSSL::ASN1::Integer, asn1_data.value[0].class
495+
assert_equal 3, asn1_data.value[0].value
496+
assert_equal OpenSSL::BN, asn1_data.value[0].value.class
497+
assert_equal OpenSSL::ASN1::OctetString, asn1_data.value[1].class
498+
assert_equal 'o=Telstra', asn1_data.value[1].value
499+
# assert_equal OpenSSL::ASN1::ASN1Data, asn1_data.value[2].class
500+
# assert_equal :CONTEXT_SPECIFIC, asn1_data.value[2].tag_class
501+
# assert_equal 'ess', asn1_data.value[2].value
502+
503+
# assert_equal raw, asn1.to_der
504+
end
505+
480506
private
481507

482508
def assert_universal(tag, asn1, inf_len=false)

0 commit comments

Comments
 (0)