Skip to content

Commit 7822162

Browse files
HoneyryderChuckkares
authored andcommitted
[fix] ASN.1 tagged object tag-class encoding/decoding
1 parent e83dbbf commit 7822162

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

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

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,17 +1046,30 @@ else if ( obj instanceof ASN1GraphicString ) {
10461046

10471047
if (obj instanceof ASN1TaggedObject) {
10481048
final ASN1TaggedObject taggedObj = (ASN1TaggedObject) obj;
1049+
final IRubyObject tag = runtime.newFixnum(taggedObj.getTagNo());
1050+
final IRubyObject tag_class;
1051+
switch (taggedObj.getTagClass()) {
1052+
case BERTags.PRIVATE:
1053+
tag_class = runtime.newSymbol("PRIVATE");
1054+
break;
1055+
case BERTags.APPLICATION:
1056+
tag_class = runtime.newSymbol("APPLICATION");
1057+
break;
1058+
case BERTags.CONTEXT_SPECIFIC:
1059+
tag_class = runtime.newSymbol("CONTEXT_SPECIFIC");
1060+
break;
1061+
default:
1062+
tag_class = runtime.newSymbol("UNIVERSAL");
1063+
break;
1064+
}
1065+
10491066
if (taggedObj.getTagClass() == BERTags.APPLICATION) {
1050-
IRubyObject tag = runtime.newFixnum( taggedObj.getTagNo() );
1051-
IRubyObject tag_class = runtime.newSymbol("APPLICATION");
10521067
final ASN1Sequence sequence = (ASN1Sequence) taggedObj.getBaseUniversal(false, SEQUENCE);
10531068
@SuppressWarnings("unchecked")
10541069
final RubyArray valArr = decodeObjects(context, ASN1, sequence.getObjects());
10551070
return ASN1.getClass("ASN1Data").newInstance(context, new IRubyObject[] { valArr, tag, tag_class }, Block.NULL_BLOCK);
10561071
} else {
10571072
IRubyObject val = decodeObject(context, ASN1, taggedObj.getBaseObject());
1058-
IRubyObject tag = runtime.newFixnum( taggedObj.getTagNo() );
1059-
IRubyObject tag_class = runtime.newSymbol("CONTEXT_SPECIFIC");
10601073
final RubyArray valArr = runtime.newArray(val);
10611074
return ASN1.getClass("ASN1Data").newInstance(context, new IRubyObject[] { valArr, tag, tag_class }, Block.NULL_BLOCK);
10621075
}
@@ -1351,11 +1364,14 @@ int getTag(final ThreadContext context) {
13511364
int getTagClass(final ThreadContext context) {
13521365
IRubyObject tag_class = getInstanceVariable("@tag_class");
13531366
if (tag_class instanceof RubySymbol) {
1354-
if ("APPLICATION".equals(tag_class.toString())) {
1355-
return BERTags.APPLICATION;
1356-
}
1357-
if ("CONTEXT_SPECIFIC".equals(tag_class.toString())) {
1358-
return BERTags.CONTEXT_SPECIFIC;
1367+
switch (((RubySymbol) tag_class).asJavaString()) {
1368+
case "PRIVATE":
1369+
return BERTags.PRIVATE;
1370+
case "APPLICATION":
1371+
return BERTags.APPLICATION;
1372+
case "CONTEXT_SPECIFIC":
1373+
return BERTags.CONTEXT_SPECIFIC;
1374+
default: // fallback to BERTags.UNIVERSAL
13591375
}
13601376
}
13611377
return BERTags.UNIVERSAL; // 0
@@ -1367,6 +1383,7 @@ ASN1Encodable toASN1(final ThreadContext context) {
13671383

13681384
final ASN1TaggedObject toASN1TaggedObject(final ThreadContext context) {
13691385
final int tag = getTag(context);
1386+
final int tagClass = getTagClass(context);
13701387

13711388
final IRubyObject value = callMethod(context, "value");
13721389
if (value instanceof RubyArray) {
@@ -1385,7 +1402,7 @@ final ASN1TaggedObject toASN1TaggedObject(final ThreadContext context) {
13851402
if (!(value instanceof ASN1Data)) {
13861403
throw new UnsupportedOperationException("toASN1 " + inspect() + " value: " + value.inspect() + " (" + value.getMetaClass() + ")");
13871404
}
1388-
return new DERTaggedObject(isExplicitTagging(), tag, ((ASN1Data) value).toASN1(context));
1405+
return new DERTaggedObject(isExplicitTagging(), tagClass, tag, ((ASN1Data) value).toASN1(context));
13891406
}
13901407

13911408
@JRubyMethod

0 commit comments

Comments
 (0)