From 6fb989bac0f41e33fe4ce0eef3cf5320d5abbd04 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Tue, 19 Dec 2023 19:58:48 +0700 Subject: Refactoring around Asn1TaggedObject --- crypto/src/asn1/Asn1TaggedObject.cs | 2 +- crypto/src/asn1/Asn1UniversalType.cs | 5 +- crypto/src/asn1/Asn1Utilities.cs | 70 ++++++++++++++-------- crypto/src/asn1/DERExternal.cs | 8 +-- crypto/src/asn1/DerObjectIdentifier.cs | 2 +- crypto/src/asn1/cms/Evidence.cs | 2 +- crypto/src/asn1/crmf/PKIArchiveOptions.cs | 2 +- .../src/asn1/isismtt/x509/DeclarationOfMajority.cs | 2 +- crypto/src/asn1/x509/X509Extensions.cs | 9 +-- 9 files changed, 56 insertions(+), 46 deletions(-) diff --git a/crypto/src/asn1/Asn1TaggedObject.cs b/crypto/src/asn1/Asn1TaggedObject.cs index d6722c020..a5a5e9506 100644 --- a/crypto/src/asn1/Asn1TaggedObject.cs +++ b/crypto/src/asn1/Asn1TaggedObject.cs @@ -231,7 +231,7 @@ namespace Org.BouncyCastle.Asn1 [Obsolete("Will be removed")] public Asn1Object GetObject() { - Asn1Utilities.CheckTagClass(this, Asn1Tags.ContextSpecific); + Asn1Utilities.CheckContextTag(this); return m_object.ToAsn1Object(); } diff --git a/crypto/src/asn1/Asn1UniversalType.cs b/crypto/src/asn1/Asn1UniversalType.cs index 46cacb436..81f03a540 100644 --- a/crypto/src/asn1/Asn1UniversalType.cs +++ b/crypto/src/asn1/Asn1UniversalType.cs @@ -42,10 +42,7 @@ namespace Org.BouncyCastle.Asn1 internal Asn1Object GetContextInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { - if (Asn1Tags.ContextSpecific != taggedObject.TagClass) - throw new InvalidOperationException("this method only valid for CONTEXT_SPECIFIC tags"); - - return CheckedCast(taggedObject.GetBaseUniversal(declaredExplicit, this)); + return CheckedCast(Asn1Utilities.CheckContextTag(taggedObject).GetBaseUniversal(declaredExplicit, this)); } internal Asn1Tag Tag diff --git a/crypto/src/asn1/Asn1Utilities.cs b/crypto/src/asn1/Asn1Utilities.cs index 6706ace72..4207d132e 100644 --- a/crypto/src/asn1/Asn1Utilities.cs +++ b/crypto/src/asn1/Asn1Utilities.cs @@ -8,26 +8,14 @@ namespace Org.BouncyCastle.Asn1 // TODO[api] Make static public abstract class Asn1Utilities { - internal static Asn1TaggedObject CheckTagClass(Asn1TaggedObject taggedObject, int tagClass) + internal static Asn1TaggedObject CheckContextTag(Asn1TaggedObject taggedObject) { - if (!taggedObject.HasTagClass(tagClass)) - { - string expected = GetTagClassText(tagClass); - string found = GetTagClassText(taggedObject); - throw new InvalidOperationException("Expected " + expected + " tag but found " + found); - } - return taggedObject; + return CheckTagClass(taggedObject, Asn1Tags.ContextSpecific); } - internal static Asn1TaggedObjectParser CheckTagClass(Asn1TaggedObjectParser taggedObjectParser, int tagClass) + internal static Asn1TaggedObjectParser CheckContextTag(Asn1TaggedObjectParser taggedObjectParser) { - if (taggedObjectParser.TagClass != tagClass) - { - string expected = GetTagClassText(tagClass); - string found = GetTagClassText(taggedObjectParser); - throw new InvalidOperationException("Expected " + expected + " tag but found " + found); - } - return taggedObjectParser; + return CheckTagClass(taggedObjectParser, Asn1Tags.ContextSpecific); } internal static Asn1TaggedObject CheckTag(Asn1TaggedObject taggedObject, int tagClass, int tagNo) @@ -53,6 +41,27 @@ namespace Org.BouncyCastle.Asn1 return taggedObjectParser; } + internal static Asn1TaggedObject CheckTagClass(Asn1TaggedObject taggedObject, int tagClass) + { + if (!taggedObject.HasTagClass(tagClass)) + { + string expected = GetTagClassText(tagClass); + string found = GetTagClassText(taggedObject); + throw new InvalidOperationException("Expected " + expected + " tag but found " + found); + } + return taggedObject; + } + + internal static Asn1TaggedObjectParser CheckTagClass(Asn1TaggedObjectParser taggedObjectParser, int tagClass) + { + if (taggedObjectParser.TagClass != tagClass) + { + string expected = GetTagClassText(tagClass); + string found = GetTagClassText(taggedObjectParser); + throw new InvalidOperationException("Expected " + expected + " tag but found " + found); + } + return taggedObjectParser; + } internal static TChoice GetInstanceFromChoice(Asn1TaggedObject taggedObject, bool declaredExplicit, Func constructor) @@ -73,6 +82,25 @@ namespace Org.BouncyCastle.Asn1 } + /* + * Tag text methods + */ + + internal static string GetTagClassText(Asn1Tag tag) + { + return GetTagClassText(tag.TagClass); + } + + public static string GetTagClassText(Asn1TaggedObject taggedObject) + { + return GetTagClassText(taggedObject.TagClass); + } + + public static string GetTagClassText(Asn1TaggedObjectParser taggedObjectParser) + { + return GetTagClassText(taggedObjectParser.TagClass); + } + public static string GetTagClassText(int tagClass) { switch (tagClass) @@ -88,16 +116,6 @@ namespace Org.BouncyCastle.Asn1 } } - public static string GetTagClassText(Asn1TaggedObject taggedObject) - { - return GetTagClassText(taggedObject.TagClass); - } - - public static string GetTagClassText(Asn1TaggedObjectParser taggedObjectParser) - { - return GetTagClassText(taggedObjectParser.TagClass); - } - internal static string GetTagText(Asn1Tag tag) { return GetTagText(tag.TagClass, tag.TagNo); diff --git a/crypto/src/asn1/DERExternal.cs b/crypto/src/asn1/DERExternal.cs index 8cb7d040b..cfe0ae701 100644 --- a/crypto/src/asn1/DERExternal.cs +++ b/crypto/src/asn1/DERExternal.cs @@ -251,11 +251,9 @@ namespace Org.BouncyCastle.Asn1 private static Asn1Object GetExternalContent(Asn1TaggedObject encoding) { - int tagClass = encoding.TagClass, tagNo = encoding.TagNo; - if (Asn1Tags.ContextSpecific != tagClass) - throw new ArgumentException("invalid tag: " + Asn1Utilities.GetTagText(tagClass, tagNo), "encoding"); + Asn1Utilities.CheckContextTag(encoding); - switch (tagNo) + switch (encoding.TagNo) { case 0: return encoding.GetExplicitBaseObject().ToAsn1Object(); @@ -264,7 +262,7 @@ namespace Org.BouncyCastle.Asn1 case 2: return DerBitString.GetInstance(encoding, false); default: - throw new ArgumentException("invalid tag: " + Asn1Utilities.GetTagText(tagClass, tagNo), "encoding"); + throw new ArgumentException("invalid tag: " + Asn1Utilities.GetTagText(encoding), nameof(encoding)); } } diff --git a/crypto/src/asn1/DerObjectIdentifier.cs b/crypto/src/asn1/DerObjectIdentifier.cs index 12e8ea0a8..f43724e1f 100644 --- a/crypto/src/asn1/DerObjectIdentifier.cs +++ b/crypto/src/asn1/DerObjectIdentifier.cs @@ -69,7 +69,7 @@ namespace Org.BouncyCastle.Asn1 * * - see https://github.com/bcgit/bc-java/issues/1015 */ - if (!declaredExplicit && !taggedObject.IsParsed() && Asn1Tags.ContextSpecific == taggedObject.TagClass) + if (!declaredExplicit && !taggedObject.IsParsed() && taggedObject.HasContextTag()) { Asn1Object baseObject = taggedObject.GetBaseObject().ToAsn1Object(); if (!(baseObject is DerObjectIdentifier)) diff --git a/crypto/src/asn1/cms/Evidence.cs b/crypto/src/asn1/cms/Evidence.cs index 19dab50c2..d240d234b 100644 --- a/crypto/src/asn1/cms/Evidence.cs +++ b/crypto/src/asn1/cms/Evidence.cs @@ -15,7 +15,7 @@ namespace Org.BouncyCastle.Asn1.Cms if (obj is Evidence evidence) return evidence; if (obj is Asn1TaggedObject taggedObject) - return new Evidence(Asn1Utilities.CheckTagClass(taggedObject, Asn1Tags.ContextSpecific)); + return new Evidence(Asn1Utilities.CheckContextTag(taggedObject)); throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), nameof(obj)); } diff --git a/crypto/src/asn1/crmf/PKIArchiveOptions.cs b/crypto/src/asn1/crmf/PKIArchiveOptions.cs index f1a35541a..31103a5be 100644 --- a/crypto/src/asn1/crmf/PKIArchiveOptions.cs +++ b/crypto/src/asn1/crmf/PKIArchiveOptions.cs @@ -19,7 +19,7 @@ namespace Org.BouncyCastle.Asn1.Crmf return pkiArchiveOptions; if (obj is Asn1TaggedObject taggedObject) - return new PkiArchiveOptions(Asn1Utilities.CheckTagClass(taggedObject, Asn1Tags.ContextSpecific)); + return new PkiArchiveOptions(Asn1Utilities.CheckContextTag(taggedObject)); throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj"); } diff --git a/crypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs b/crypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs index f20d17f6b..d76a351bf 100644 --- a/crypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs +++ b/crypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs @@ -74,7 +74,7 @@ namespace Org.BouncyCastle.Asn1.IsisMtt.X509 return declarationOfMajority; if (obj is Asn1TaggedObject taggedObject) - return new DeclarationOfMajority(Asn1Utilities.CheckTagClass(taggedObject, Asn1Tags.ContextSpecific)); + return new DeclarationOfMajority(Asn1Utilities.CheckContextTag(taggedObject)); throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), nameof(obj)); } diff --git a/crypto/src/asn1/x509/X509Extensions.cs b/crypto/src/asn1/x509/X509Extensions.cs index d4497d255..af0655f8e 100644 --- a/crypto/src/asn1/x509/X509Extensions.cs +++ b/crypto/src/asn1/x509/X509Extensions.cs @@ -214,14 +214,11 @@ namespace Org.BouncyCastle.Asn1.X509 if (obj is Asn1Sequence sequence) return new X509Extensions(sequence); + // TODO[api] Rename this class to just Extensions and drop support for this if (obj is Asn1TaggedObject taggedObject) - { - Asn1Utilities.CheckTagClass(taggedObject, Asn1Tags.ContextSpecific); - - return GetInstance(taggedObject.GetBaseObject().ToAsn1Object()); - } + return GetInstance(Asn1Utilities.CheckContextTag(taggedObject).GetBaseObject().ToAsn1Object()); - throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj"); + throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), nameof(obj)); } /** -- cgit 1.4.1