diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2021-11-11 21:13:22 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2021-11-11 21:13:22 +0700 |
commit | 39f33f785250b544610c429fb9d4e50c521cd493 (patch) | |
tree | c7a55871f7c0038dcbc99e582826051cb3a180d0 /crypto/src/asn1/Asn1TaggedObject.cs | |
parent | Trim stack trace (diff) | |
download | BouncyCastle.NET-ed25519-39f33f785250b544610c429fb9d4e50c521cd493.tar.xz |
Refactor tagged object parsing
Diffstat (limited to 'crypto/src/asn1/Asn1TaggedObject.cs')
-rw-r--r-- | crypto/src/asn1/Asn1TaggedObject.cs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/crypto/src/asn1/Asn1TaggedObject.cs b/crypto/src/asn1/Asn1TaggedObject.cs index 9f7eab576..aaa719ecc 100644 --- a/crypto/src/asn1/Asn1TaggedObject.cs +++ b/crypto/src/asn1/Asn1TaggedObject.cs @@ -284,6 +284,38 @@ namespace Org.BouncyCastle.Asn1 internal abstract Asn1Sequence RebuildConstructed(Asn1Object asn1Object); + internal static Asn1Object CreateConstructed(int tagClass, int tagNo, bool isIL, + Asn1EncodableVector contentsElements) + { + bool maybeExplicit = (contentsElements.Count == 1); + + if (isIL) + { + if (Asn1Tags.Application == tagClass) + return new BerApplicationSpecific(tagNo, contentsElements); + + return maybeExplicit + ? new BerTaggedObject(true, tagNo, contentsElements[0]) + : new BerTaggedObject(false, tagNo, BerSequence.FromVector(contentsElements)); + } + + if (Asn1Tags.Application == tagClass) + return new DerApplicationSpecific(tagNo, contentsElements); + + return maybeExplicit + ? new DLTaggedObject(true, tagNo, contentsElements[0]) + : new DLTaggedObject(false, tagNo, DLSequence.FromVector(contentsElements)); + } + + internal static Asn1Object CreatePrimitive(int tagClass, int tagNo, byte[] contentsOctets) + { + // Note: !CONSTRUCTED => IMPLICIT + if (Asn1Tags.Application == tagClass) + return new DerApplicationSpecific(false, tagNo, contentsOctets); + + return new DLTaggedObject(false, tagNo, new DerOctetString(contentsOctets)); + } + private static Asn1TaggedObject CheckedCast(Asn1Object asn1Object) { Asn1TaggedObject taggedObject = asn1Object as Asn1TaggedObject; |