From 1232f3b7a583484cd8eda4874cfcdee0c724fa75 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Fri, 24 May 2024 22:21:22 +0700 Subject: Add helper methods for optional tagged fields --- crypto/src/asn1/Asn1Utilities.cs | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'crypto/src') diff --git a/crypto/src/asn1/Asn1Utilities.cs b/crypto/src/asn1/Asn1Utilities.cs index eacbf499a..ea61ab01a 100644 --- a/crypto/src/asn1/Asn1Utilities.cs +++ b/crypto/src/asn1/Asn1Utilities.cs @@ -649,5 +649,57 @@ namespace Org.BouncyCastle.Asn1 { return TryParseExplicitBaseObject(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo, out baseObject); } + + #region Sequence cursor + + public static TResult ReadOptionalContextTagged(Asn1Sequence sequence, ref int sequencePosition, + int tagNo, TState state, Func constructor) + where TResult : class + { + return ReadOptionalTagged(sequence, ref sequencePosition, Asn1Tags.ContextSpecific, tagNo, state, + constructor); + } + + public static TResult ReadOptionalTagged(Asn1Sequence sequence, ref int sequencePosition, int tagClass, + int tagNo, TState state, Func constructor) + where TResult : class + { + if (sequencePosition < sequence.Count && + sequence[sequencePosition] is Asn1TaggedObject taggedObject && + taggedObject.HasTag(tagClass, tagNo)) + { + sequencePosition++; + return constructor(taggedObject, state); + } + + return null; + } + + public static bool TryReadOptionalContextTagged(Asn1Sequence sequence, + ref int sequencePosition, int tagNo, TState state, out TResult result, + Func constructor) + { + return TryReadOptionalTagged(sequence, ref sequencePosition, Asn1Tags.ContextSpecific, tagNo, + state, out result, constructor); + } + + public static bool TryReadOptionalTagged(Asn1Sequence sequence, ref int sequencePosition, + int tagClass, int tagNo, TState state, out TResult result, + Func constructor) + { + if (sequencePosition < sequence.Count && + sequence[sequencePosition] is Asn1TaggedObject taggedObject && + taggedObject.HasTag(tagClass, tagNo)) + { + sequencePosition++; + result = constructor(taggedObject, state); + return true; + } + + result = default; + return false; + } + + #endregion } } -- cgit 1.5.1