diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2023-02-06 15:40:40 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2023-02-06 15:40:40 +0700 |
commit | 32ceae264dc39331174d9db71fe38948648c7989 (patch) | |
tree | 180846e6d6f42b56659a71facae5c7d582a2e14f /crypto/src/asn1/Asn1Utilities.cs | |
parent | Misc. refactoring after bc-fips-csharp updates (diff) | |
download | BouncyCastle.NET-ed25519-32ceae264dc39331174d9db71fe38948648c7989.tar.xz |
New tagged object methods and refactoring
Diffstat (limited to 'crypto/src/asn1/Asn1Utilities.cs')
-rw-r--r-- | crypto/src/asn1/Asn1Utilities.cs | 108 |
1 files changed, 104 insertions, 4 deletions
diff --git a/crypto/src/asn1/Asn1Utilities.cs b/crypto/src/asn1/Asn1Utilities.cs index 6ccdfc43a..07f8aad03 100644 --- a/crypto/src/asn1/Asn1Utilities.cs +++ b/crypto/src/asn1/Asn1Utilities.cs @@ -7,6 +7,28 @@ namespace Org.BouncyCastle.Asn1 { public abstract class Asn1Utilities { + 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 Asn1TaggedObject CheckTag(Asn1TaggedObject taggedObject, int tagClass, int tagNo) { if (!taggedObject.HasTag(tagClass, tagNo)) @@ -48,6 +70,31 @@ namespace Org.BouncyCastle.Asn1 } + public static string GetTagClassText(int tagClass) + { + switch (tagClass) + { + case Asn1Tags.Application: + return "APPLICATION"; + case Asn1Tags.ContextSpecific: + return "CONTEXT"; + case Asn1Tags.Private: + return "PRIVATE"; + default: + return "UNIVERSAL"; + } + } + + 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); @@ -68,13 +115,13 @@ namespace Org.BouncyCastle.Asn1 switch (tagClass) { case Asn1Tags.Application: - return "[APPLICATION " + tagNo + "]"; + return string.Format("[APPLICATION {0}]", tagNo); case Asn1Tags.ContextSpecific: - return "[CONTEXT " + tagNo + "]"; + return string.Format("[CONTEXT {0}]", tagNo); case Asn1Tags.Private: - return "[PRIVATE " + tagNo + "]"; + return string.Format("[PRIVATE {0}]", tagNo); default: - return "[UNIVERSAL " + tagNo + "]"; + return string.Format("[UNIVERSAL {0}]", tagNo); } } @@ -111,16 +158,34 @@ namespace Org.BouncyCastle.Asn1 * Wrappers for Asn1TaggedObject.GetExplicitBaseTagged */ + public static Asn1TaggedObject GetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass) + { + return CheckTagClass(taggedObject, tagClass).GetExplicitBaseTagged(); + } + public static Asn1TaggedObject GetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo) { return CheckTag(taggedObject, tagClass, tagNo).GetExplicitBaseTagged(); } + public static Asn1TaggedObject GetExplicitContextBaseTagged(Asn1TaggedObject taggedObject) + { + return GetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific); + } + public static Asn1TaggedObject GetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo) { return GetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo); } + public static Asn1TaggedObject TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass) + { + if (!taggedObject.HasTagClass(tagClass)) + return null; + + return taggedObject.GetExplicitBaseTagged(); + } + public static Asn1TaggedObject TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo) { if (!taggedObject.HasTag(tagClass, tagNo)) @@ -129,6 +194,11 @@ namespace Org.BouncyCastle.Asn1 return taggedObject.GetExplicitBaseTagged(); } + public static Asn1TaggedObject TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject) + { + return TryGetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific); + } + public static Asn1TaggedObject TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo) { return TryGetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo); @@ -205,12 +275,25 @@ namespace Org.BouncyCastle.Asn1 /// <exception cref="IOException"/> public static Asn1TaggedObjectParser ParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, + int tagClass) + { + return CheckTagClass(taggedObjectParser, tagClass).ParseExplicitBaseTagged(); + } + + /// <exception cref="IOException"/> + public static Asn1TaggedObjectParser ParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo) { return CheckTag(taggedObjectParser, tagClass, tagNo).ParseExplicitBaseTagged(); } /// <exception cref="IOException"/> + public static Asn1TaggedObjectParser ParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser) + { + return ParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific); + } + + /// <exception cref="IOException"/> public static Asn1TaggedObjectParser ParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagNo) { @@ -219,6 +302,16 @@ namespace Org.BouncyCastle.Asn1 /// <exception cref="IOException"/> public static Asn1TaggedObjectParser TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, + int tagClass) + { + if (taggedObjectParser.TagClass != tagClass) + return null; + + return taggedObjectParser.ParseExplicitBaseTagged(); + } + + /// <exception cref="IOException"/> + public static Asn1TaggedObjectParser TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo) { if (!taggedObjectParser.HasTag(tagClass, tagNo)) @@ -229,6 +322,13 @@ namespace Org.BouncyCastle.Asn1 /// <exception cref="IOException"/> public static Asn1TaggedObjectParser TryParseExplicitContextBaseTagged( + Asn1TaggedObjectParser taggedObjectParser) + { + return TryParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific); + } + + /// <exception cref="IOException"/> + public static Asn1TaggedObjectParser TryParseExplicitContextBaseTagged( Asn1TaggedObjectParser taggedObjectParser, int tagNo) { return TryParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo); |