@@ -1046,17 +1046,30 @@ else if ( obj instanceof ASN1GraphicString ) {
1046
1046
1047
1047
if (obj instanceof ASN1TaggedObject ) {
1048
1048
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
+
1049
1066
if (taggedObj .getTagClass () == BERTags .APPLICATION ) {
1050
- IRubyObject tag = runtime .newFixnum ( taggedObj .getTagNo () );
1051
- IRubyObject tag_class = runtime .newSymbol ("APPLICATION" );
1052
1067
final ASN1Sequence sequence = (ASN1Sequence ) taggedObj .getBaseUniversal (false , SEQUENCE );
1053
1068
@ SuppressWarnings ("unchecked" )
1054
1069
final RubyArray valArr = decodeObjects (context , ASN1 , sequence .getObjects ());
1055
1070
return ASN1 .getClass ("ASN1Data" ).newInstance (context , new IRubyObject [] { valArr , tag , tag_class }, Block .NULL_BLOCK );
1056
1071
} else {
1057
1072
IRubyObject val = decodeObject (context , ASN1 , taggedObj .getBaseObject ());
1058
- IRubyObject tag = runtime .newFixnum ( taggedObj .getTagNo () );
1059
- IRubyObject tag_class = runtime .newSymbol ("CONTEXT_SPECIFIC" );
1060
1073
final RubyArray valArr = runtime .newArray (val );
1061
1074
return ASN1 .getClass ("ASN1Data" ).newInstance (context , new IRubyObject [] { valArr , tag , tag_class }, Block .NULL_BLOCK );
1062
1075
}
@@ -1351,11 +1364,14 @@ int getTag(final ThreadContext context) {
1351
1364
int getTagClass (final ThreadContext context ) {
1352
1365
IRubyObject tag_class = getInstanceVariable ("@tag_class" );
1353
1366
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
1359
1375
}
1360
1376
}
1361
1377
return BERTags .UNIVERSAL ; // 0
@@ -1367,6 +1383,7 @@ ASN1Encodable toASN1(final ThreadContext context) {
1367
1383
1368
1384
final ASN1TaggedObject toASN1TaggedObject (final ThreadContext context ) {
1369
1385
final int tag = getTag (context );
1386
+ final int tagClass = getTagClass (context );
1370
1387
1371
1388
final IRubyObject value = callMethod (context , "value" );
1372
1389
if (value instanceof RubyArray ) {
@@ -1385,7 +1402,7 @@ final ASN1TaggedObject toASN1TaggedObject(final ThreadContext context) {
1385
1402
if (!(value instanceof ASN1Data )) {
1386
1403
throw new UnsupportedOperationException ("toASN1 " + inspect () + " value: " + value .inspect () + " (" + value .getMetaClass () + ")" );
1387
1404
}
1388
- return new DERTaggedObject (isExplicitTagging (), tag , ((ASN1Data ) value ).toASN1 (context ));
1405
+ return new DERTaggedObject (isExplicitTagging (), tagClass , tag , ((ASN1Data ) value ).toASN1 (context ));
1389
1406
}
1390
1407
1391
1408
@ JRubyMethod
0 commit comments