@@ -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