Asn1Utilities
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Asn1
{
public abstract class Asn1Utilities
{
public static Asn1TaggedObject CheckContextTag(Asn1TaggedObject taggedObject, int tagNo)
{
return CheckTag(taggedObject, 128, tagNo);
}
public static Asn1TaggedObjectParser CheckContextTag(Asn1TaggedObjectParser taggedObjectParser, int tagNo)
{
return CheckTag(taggedObjectParser, 128, tagNo);
}
public static Asn1TaggedObject CheckContextTagClass(Asn1TaggedObject taggedObject)
{
return CheckTagClass(taggedObject, 128);
}
public static Asn1TaggedObjectParser CheckContextTagClass(Asn1TaggedObjectParser taggedObjectParser)
{
return CheckTagClass(taggedObjectParser, 128);
}
public static Asn1TaggedObject CheckTag(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo)) {
string tagText = GetTagText(tagClass, tagNo);
string tagText2 = GetTagText(taggedObject);
throw new InvalidOperationException("Expected " + tagText + " tag but found " + tagText2);
}
return taggedObject;
}
public static Asn1TaggedObjectParser CheckTag(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo)) {
string tagText = GetTagText(tagClass, tagNo);
string tagText2 = GetTagText(taggedObjectParser);
throw new InvalidOperationException("Expected " + tagText + " tag but found " + tagText2);
}
return taggedObjectParser;
}
public static Asn1TaggedObject CheckTagClass(Asn1TaggedObject taggedObject, int tagClass)
{
if (!taggedObject.HasTagClass(tagClass)) {
string tagClassText = GetTagClassText(tagClass);
string tagClassText2 = GetTagClassText(taggedObject);
throw new InvalidOperationException("Expected " + tagClassText + " tag but found " + tagClassText2);
}
return taggedObject;
}
public static Asn1TaggedObjectParser CheckTagClass(Asn1TaggedObjectParser taggedObjectParser, int tagClass)
{
if (taggedObjectParser.TagClass != tagClass) {
string tagClassText = GetTagClassText(tagClass);
string tagClassText2 = GetTagClassText(taggedObjectParser);
throw new InvalidOperationException("Expected " + tagClassText + " tag but found " + tagClassText2);
}
return taggedObjectParser;
}
public static TChoice GetInstanceChoice<TChoice>(Asn1TaggedObject taggedObject, bool declaredExplicit, Func<Asn1Encodable, TChoice> constructor) where TChoice : Asn1Encodable, IAsn1Choice
{
if (!declaredExplicit)
throw new ArgumentException($"""{Platform.GetTypeName(typeof(TChoice))}""", "declaredExplicit");
if (taggedObject == null)
throw new ArgumentNullException("taggedObject");
return constructor(CheckContextTagClass(taggedObject).GetExplicitBaseObject());
}
public static TChoice GetTaggedChoice<TChoice>(Asn1TaggedObject taggedObject, bool declaredExplicit, Func<Asn1Encodable, TChoice> constructor) where TChoice : Asn1Encodable, IAsn1Choice
{
if (!declaredExplicit)
throw new ArgumentException($"""{Platform.GetTypeName(typeof(TChoice))}""", "declaredExplicit");
if (taggedObject == null)
throw new ArgumentNullException("taggedObject");
return constructor(taggedObject.GetExplicitBaseObject());
}
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) {
case 64:
return "APPLICATION";
case 128:
return "CONTEXT";
case 192:
return "PRIVATE";
case 0:
return "UNIVERSAL";
default:
return $"""{tagClass}""";
}
}
internal static string GetTagText(Asn1Tag tag)
{
return GetTagText(tag.TagClass, tag.TagNo);
}
public static string GetTagText(Asn1TaggedObject taggedObject)
{
return GetTagText(taggedObject.TagClass, taggedObject.TagNo);
}
public static string GetTagText(Asn1TaggedObjectParser taggedObjectParser)
{
return GetTagText(taggedObjectParser.TagClass, taggedObjectParser.TagNo);
}
public static string GetTagText(int tagClass, int tagNo)
{
switch (tagClass) {
case 64:
return $"""{tagNo}""";
case 128:
return $"""{tagNo}""";
case 192:
return $"""{tagNo}""";
case 0:
return $"""{tagNo}""";
default:
return $"""{tagClass}""{tagNo}""";
}
}
public static Asn1Encodable GetExplicitBaseObject(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
return CheckTag(taggedObject, tagClass, tagNo).GetExplicitBaseObject();
}
public static Asn1Encodable GetExplicitContextBaseObject(Asn1TaggedObject taggedObject, int tagNo)
{
return GetExplicitBaseObject(taggedObject, 128, tagNo);
}
[Obsolete("Will be removed")]
public static Asn1Encodable TryGetExplicitBaseObject(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetExplicitBaseObject();
}
public static bool TryGetExplicitBaseObject(Asn1TaggedObject taggedObject, int tagClass, int tagNo, out Asn1Encodable baseObject)
{
bool flag = taggedObject.HasTag(tagClass, tagNo);
baseObject = (flag ? taggedObject.GetExplicitBaseObject() : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1Encodable TryGetExplicitContextBaseObject(Asn1TaggedObject taggedObject, int tagNo)
{
return TryGetExplicitBaseObject(taggedObject, 128, tagNo);
}
public static bool TryGetExplicitContextBaseObject(Asn1TaggedObject taggedObject, int tagNo, out Asn1Encodable baseObject)
{
return TryGetExplicitBaseObject(taggedObject, 128, tagNo, out baseObject);
}
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, 128);
}
public static Asn1TaggedObject GetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo)
{
return GetExplicitBaseTagged(taggedObject, 128, tagNo);
}
[Obsolete("Will be removed")]
public static Asn1TaggedObject TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass)
{
if (!taggedObject.HasTagClass(tagClass))
return null;
return taggedObject.GetExplicitBaseTagged();
}
public static bool TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, out Asn1TaggedObject baseTagged)
{
bool flag = taggedObject.HasTagClass(tagClass);
baseTagged = (flag ? taggedObject.GetExplicitBaseTagged() : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1TaggedObject TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetExplicitBaseTagged();
}
public static bool TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo, out Asn1TaggedObject baseTagged)
{
bool flag = taggedObject.HasTag(tagClass, tagNo);
baseTagged = (flag ? taggedObject.GetExplicitBaseTagged() : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1TaggedObject TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject)
{
return TryGetExplicitBaseTagged(taggedObject, 128);
}
public static bool TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, out Asn1TaggedObject baseTagged)
{
return TryGetExplicitBaseTagged(taggedObject, 128, out baseTagged);
}
[Obsolete("Will be removed")]
public static Asn1TaggedObject TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo)
{
return TryGetExplicitBaseTagged(taggedObject, 128, tagNo);
}
public static bool TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo, out Asn1TaggedObject baseTagged)
{
return TryGetExplicitBaseTagged(taggedObject, 128, tagNo, out baseTagged);
}
public static Asn1TaggedObject GetImplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo, int baseTagClass, int baseTagNo)
{
return CheckTag(taggedObject, tagClass, tagNo).GetImplicitBaseTagged(baseTagClass, baseTagNo);
}
public static Asn1TaggedObject GetImplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo, int baseTagClass, int baseTagNo)
{
return GetImplicitBaseTagged(taggedObject, 128, tagNo, baseTagClass, baseTagNo);
}
[Obsolete("Will be removed")]
public static Asn1TaggedObject TryGetImplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo, int baseTagClass, int baseTagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetImplicitBaseTagged(baseTagClass, baseTagNo);
}
public static bool TryGetImplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo, int baseTagClass, int baseTagNo, out Asn1TaggedObject baseTagged)
{
bool flag = taggedObject.HasTag(tagClass, tagNo);
baseTagged = (flag ? taggedObject.GetImplicitBaseTagged(baseTagClass, baseTagNo) : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1TaggedObject TryGetImplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo, int baseTagClass, int baseTagNo)
{
return TryGetImplicitBaseTagged(taggedObject, 128, tagNo, baseTagClass, baseTagNo);
}
public static bool TryGetImplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo, int baseTagClass, int baseTagNo, out Asn1TaggedObject baseTagged)
{
return TryGetImplicitBaseTagged(taggedObject, 128, tagNo, baseTagClass, baseTagNo, out baseTagged);
}
public static Asn1Object GetBaseUniversal(Asn1TaggedObject taggedObject, int tagClass, int tagNo, bool declaredExplicit, int baseTagNo)
{
return CheckTag(taggedObject, tagClass, tagNo).GetBaseUniversal(declaredExplicit, baseTagNo);
}
public static Asn1Object GetContextBaseUniversal(Asn1TaggedObject taggedObject, int tagNo, bool declaredExplicit, int baseTagNo)
{
return GetBaseUniversal(taggedObject, 128, tagNo, declaredExplicit, baseTagNo);
}
[Obsolete("Will be removed")]
public static Asn1Object TryGetBaseUniversal(Asn1TaggedObject taggedObject, int tagClass, int tagNo, bool declaredExplicit, int baseTagNo)
{
if (!taggedObject.HasTag(tagClass, tagNo))
return null;
return taggedObject.GetBaseUniversal(declaredExplicit, baseTagNo);
}
public static bool TryGetBaseUniversal(Asn1TaggedObject taggedObject, int tagClass, int tagNo, bool declaredExplicit, int baseTagNo, out Asn1Object baseUniversal)
{
bool flag = taggedObject.HasTag(tagClass, tagNo);
baseUniversal = (flag ? taggedObject.GetBaseUniversal(declaredExplicit, baseTagNo) : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1Object TryGetContextBaseUniversal(Asn1TaggedObject taggedObject, int tagNo, bool declaredExplicit, int baseTagNo)
{
return TryGetBaseUniversal(taggedObject, 128, tagNo, declaredExplicit, baseTagNo);
}
public static bool TryGetContextBaseUniversal(Asn1TaggedObject taggedObject, int tagNo, bool declaredExplicit, int baseTagNo, out Asn1Object baseUniversal)
{
return TryGetBaseUniversal(taggedObject, 128, tagNo, declaredExplicit, baseTagNo, out baseUniversal);
}
public static Asn1TaggedObjectParser ParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass)
{
return CheckTagClass(taggedObjectParser, tagClass).ParseExplicitBaseTagged();
}
public static Asn1TaggedObjectParser ParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseExplicitBaseTagged();
}
public static Asn1TaggedObjectParser ParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser)
{
return ParseExplicitBaseTagged(taggedObjectParser, 128);
}
public static Asn1TaggedObjectParser ParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagNo)
{
return ParseExplicitBaseTagged(taggedObjectParser, 128, tagNo);
}
[Obsolete("Will be removed")]
public static Asn1TaggedObjectParser TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass)
{
if (taggedObjectParser.TagClass != tagClass)
return null;
return taggedObjectParser.ParseExplicitBaseTagged();
}
public static bool TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, out Asn1TaggedObjectParser baseTagged)
{
bool flag = taggedObjectParser.TagClass == tagClass;
baseTagged = (flag ? taggedObjectParser.ParseExplicitBaseTagged() : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1TaggedObjectParser TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseExplicitBaseTagged();
}
public static bool TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, out Asn1TaggedObjectParser baseTagged)
{
bool flag = taggedObjectParser.HasTag(tagClass, tagNo);
baseTagged = (flag ? taggedObjectParser.ParseExplicitBaseTagged() : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1TaggedObjectParser TryParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser)
{
return TryParseExplicitBaseTagged(taggedObjectParser, 128);
}
public static bool TryParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, out Asn1TaggedObjectParser baseTagged)
{
return TryParseExplicitBaseTagged(taggedObjectParser, 128, out baseTagged);
}
[Obsolete("Will be removed")]
public static Asn1TaggedObjectParser TryParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagNo)
{
return TryParseExplicitBaseTagged(taggedObjectParser, 128, tagNo);
}
public static bool TryParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagNo, out Asn1TaggedObjectParser baseTagged)
{
return TryParseExplicitBaseTagged(taggedObjectParser, 128, tagNo, out baseTagged);
}
public static Asn1TaggedObjectParser ParseImplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, int baseTagClass, int baseTagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseImplicitBaseTagged(baseTagClass, baseTagNo);
}
public static Asn1TaggedObjectParser ParseImplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagNo, int baseTagClass, int baseTagNo)
{
return ParseImplicitBaseTagged(taggedObjectParser, 128, tagNo, baseTagClass, baseTagNo);
}
[Obsolete("Will be removed")]
public static Asn1TaggedObjectParser TryParseImplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, int baseTagClass, int baseTagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseImplicitBaseTagged(baseTagClass, baseTagNo);
}
public static bool TryParseImplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, int baseTagClass, int baseTagNo, out Asn1TaggedObjectParser baseTagged)
{
bool flag = taggedObjectParser.HasTag(tagClass, tagNo);
baseTagged = (flag ? taggedObjectParser.ParseImplicitBaseTagged(baseTagClass, baseTagNo) : null);
return flag;
}
[Obsolete("Will be removed")]
public static Asn1TaggedObjectParser TryParseImplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagNo, int baseTagClass, int baseTagNo)
{
return TryParseImplicitBaseTagged(taggedObjectParser, 128, tagNo, baseTagClass, baseTagNo);
}
public static bool TryParseImplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser, int tagNo, int baseTagClass, int baseTagNo, out Asn1TaggedObjectParser baseTagged)
{
return TryParseImplicitBaseTagged(taggedObjectParser, 128, tagNo, baseTagClass, baseTagNo, out baseTagged);
}
public static IAsn1Convertible ParseBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, bool declaredExplicit, int baseTagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseBaseUniversal(declaredExplicit, baseTagNo);
}
public static IAsn1Convertible ParseContextBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagNo, bool declaredExplicit, int baseTagNo)
{
return ParseBaseUniversal(taggedObjectParser, 128, tagNo, declaredExplicit, baseTagNo);
}
[Obsolete("Will be removed")]
public static IAsn1Convertible TryParseBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, bool declaredExplicit, int baseTagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseBaseUniversal(declaredExplicit, baseTagNo);
}
public static bool TryParseBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, bool declaredExplicit, int baseTagNo, out IAsn1Convertible baseUniversal)
{
bool flag = taggedObjectParser.HasTag(tagClass, tagNo);
baseUniversal = (flag ? taggedObjectParser.ParseBaseUniversal(declaredExplicit, baseTagNo) : null);
return flag;
}
[Obsolete("Will be removed")]
public static IAsn1Convertible TryParseContextBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagNo, bool declaredExplicit, int baseTagNo)
{
return TryParseBaseUniversal(taggedObjectParser, 128, tagNo, declaredExplicit, baseTagNo);
}
public static bool TryParseContextBaseUniversal(Asn1TaggedObjectParser taggedObjectParser, int tagNo, bool declaredExplicit, int baseTagNo, out IAsn1Convertible baseUniversal)
{
return TryParseBaseUniversal(taggedObjectParser, 128, tagNo, declaredExplicit, baseTagNo, out baseUniversal);
}
public static IAsn1Convertible ParseExplicitBaseObject(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)
{
return CheckTag(taggedObjectParser, tagClass, tagNo).ParseExplicitBaseObject();
}
public static IAsn1Convertible ParseExplicitContextBaseObject(Asn1TaggedObjectParser taggedObjectParser, int tagNo)
{
return ParseExplicitBaseObject(taggedObjectParser, 128, tagNo);
}
[Obsolete("Will be removed")]
public static IAsn1Convertible TryParseExplicitBaseObject(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo)
{
if (!taggedObjectParser.HasTag(tagClass, tagNo))
return null;
return taggedObjectParser.ParseExplicitBaseObject();
}
public static bool TryParseExplicitBaseObject(Asn1TaggedObjectParser taggedObjectParser, int tagClass, int tagNo, out IAsn1Convertible baseObject)
{
bool flag = taggedObjectParser.HasTag(tagClass, tagNo);
baseObject = (flag ? taggedObjectParser.ParseExplicitBaseObject() : null);
return flag;
}
[Obsolete("Will be removed")]
public static IAsn1Convertible TryParseExplicitContextBaseObject(Asn1TaggedObjectParser taggedObjectParser, int tagNo)
{
return TryParseExplicitBaseObject(taggedObjectParser, 128, tagNo);
}
public static bool TryParseExplicitContextBaseObject(Asn1TaggedObjectParser taggedObjectParser, int tagNo, out IAsn1Convertible baseObject)
{
return TryParseExplicitBaseObject(taggedObjectParser, 128, tagNo, out baseObject);
}
public static TResult ReadContextTagged<TState, TResult>(Asn1Sequence sequence, ref int sequencePosition, int tagNo, TState state, Func<Asn1TaggedObject, TState, TResult> constructor)
{
return ReadTagged(sequence, ref sequencePosition, 128, tagNo, state, constructor);
}
public static TResult ReadTagged<TState, TResult>(Asn1Sequence sequence, ref int sequencePosition, int tagClass, int tagNo, TState state, Func<Asn1TaggedObject, TState, TResult> constructor)
{
Asn1TaggedObject instance = Asn1TaggedObject.GetInstance(sequence[sequencePosition++], tagClass, tagNo);
return constructor(instance, state);
}
public static TResult ReadOptional<TResult>(Asn1Sequence sequence, ref int sequencePosition, Func<Asn1Encodable, TResult> constructor) where TResult : class
{
if (sequencePosition < sequence.Count) {
TResult val = constructor(sequence[sequencePosition]);
if (val != null) {
sequencePosition++;
return val;
}
}
return null;
}
public static TResult ReadOptionalContextTagged<TState, TResult>(Asn1Sequence sequence, ref int sequencePosition, int tagNo, TState state, Func<Asn1TaggedObject, TState, TResult> constructor) where TResult : class
{
return ReadOptionalTagged(sequence, ref sequencePosition, 128, tagNo, state, constructor);
}
public static TResult ReadOptionalTagged<TState, TResult>(Asn1Sequence sequence, ref int sequencePosition, int tagClass, int tagNo, TState state, Func<Asn1TaggedObject, TState, TResult> constructor) where TResult : class
{
if (sequencePosition < sequence.Count) {
Asn1TaggedObject asn1TaggedObject = sequence[sequencePosition] as Asn1TaggedObject;
if (asn1TaggedObject != null && asn1TaggedObject.HasTag(tagClass, tagNo)) {
TResult result = constructor(asn1TaggedObject, state);
sequencePosition++;
return result;
}
}
return null;
}
public static bool TryReadOptionalContextTagged<TState, TResult>(Asn1Sequence sequence, ref int sequencePosition, int tagNo, TState state, out TResult result, Func<Asn1TaggedObject, TState, TResult> constructor)
{
return TryReadOptionalTagged(sequence, ref sequencePosition, 128, tagNo, state, out result, constructor);
}
public static bool TryReadOptionalTagged<TState, TResult>(Asn1Sequence sequence, ref int sequencePosition, int tagClass, int tagNo, TState state, out TResult result, Func<Asn1TaggedObject, TState, TResult> constructor)
{
if (sequencePosition < sequence.Count) {
Asn1TaggedObject asn1TaggedObject = sequence[sequencePosition] as Asn1TaggedObject;
if (asn1TaggedObject != null && asn1TaggedObject.HasTag(tagClass, tagNo)) {
result = constructor(asn1TaggedObject, state);
sequencePosition++;
return true;
}
}
result = default(TResult);
return false;
}
}
}