Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of System Formats Asn1 v8.0.100
BepInEx/core/System.Formats.Asn1/netstandard2.0/System.Formats.Asn1.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Buffers; using System.Buffers.Binary; using System.Buffers.Text; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Numerics; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using FxResources.System.Formats.Asn1; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: AssemblyMetadata("PreferInbox", "True")] [assembly: AssemblyDefaultAlias("System.Formats.Asn1")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: CLSCompliant(true)] [assembly: AssemblyMetadata("IsTrimmable", "True")] [assembly: DefaultDllImportSearchPaths(DllImportSearchPath.System32 | DllImportSearchPath.AssemblyDirectory)] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyDescription("Provides classes that can read and write the ASN.1 BER, CER, and DER data formats.\r\n\r\nCommonly Used Types:\r\nSystem.Formats.Asn1.AsnReader\r\nSystem.Formats.Asn1.AsnWriter")] [assembly: AssemblyFileVersion("8.0.724.31311")] [assembly: AssemblyInformationalVersion("8.0.7+2aade6beb02ea367fd97c4070a4198802fe61c03")] [assembly: AssemblyProduct("Microsoft® .NET")] [assembly: AssemblyTitle("System.Formats.Asn1")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/dotnet/runtime")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("8.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: System.Runtime.CompilerServices.NullablePublicOnly(false)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class NullablePublicOnlyAttribute : Attribute { public readonly bool IncludesInternals; public NullablePublicOnlyAttribute(bool P_0) { IncludesInternals = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace FxResources.System.Formats.Asn1 { internal static class SR { } } namespace System { internal static class LocalAppContextSwitches { private static int s_allowAnySizeOid; public static bool AllowAnySizeOid { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return GetCachedSwitchValue("System.Formats.Asn1.AllowAnySizeOid", ref s_allowAnySizeOid); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool GetSwitchValue(string switchName, ref bool switchValue) { return AppContext.TryGetSwitch(switchName, out switchValue); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool GetCachedSwitchValue(string switchName, ref int cachedSwitchValue) { if (cachedSwitchValue < 0) { return false; } if (cachedSwitchValue > 0) { return true; } return GetCachedSwitchValueInternal(switchName, ref cachedSwitchValue); } private static bool GetCachedSwitchValueInternal(string switchName, ref int cachedSwitchValue) { if (!AppContext.TryGetSwitch(switchName, out var isEnabled)) { isEnabled = GetSwitchDefaultValue(switchName); } AppContext.TryGetSwitch("TestSwitch.LocalAppContext.DisableCaching", out var isEnabled2); if (!isEnabled2) { cachedSwitchValue = (isEnabled ? 1 : (-1)); } return isEnabled; } private static bool GetSwitchDefaultValue(string switchName) { return switchName switch { "Switch.System.Runtime.Serialization.SerializationGuard" => true, "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization" => true, "System.Xml.XmlResolver.IsNetworkingEnabledByDefault" => true, _ => false, }; } } internal static class Obsoletions { internal const string SharedUrlFormat = "https://aka.ms/dotnet-warnings/{0}"; internal const string SystemTextEncodingUTF7Message = "The UTF-7 encoding is insecure and should not be used. Consider using UTF-8 instead."; internal const string SystemTextEncodingUTF7DiagId = "SYSLIB0001"; internal const string PrincipalPermissionAttributeMessage = "PrincipalPermissionAttribute is not honored by the runtime and must not be used."; internal const string PrincipalPermissionAttributeDiagId = "SYSLIB0002"; internal const string CodeAccessSecurityMessage = "Code Access Security is not supported or honored by the runtime."; internal const string CodeAccessSecurityDiagId = "SYSLIB0003"; internal const string ConstrainedExecutionRegionMessage = "The Constrained Execution Region (CER) feature is not supported."; internal const string ConstrainedExecutionRegionDiagId = "SYSLIB0004"; internal const string GlobalAssemblyCacheMessage = "The Global Assembly Cache is not supported."; internal const string GlobalAssemblyCacheDiagId = "SYSLIB0005"; internal const string ThreadAbortMessage = "Thread.Abort is not supported and throws PlatformNotSupportedException."; internal const string ThreadResetAbortMessage = "Thread.ResetAbort is not supported and throws PlatformNotSupportedException."; internal const string ThreadAbortDiagId = "SYSLIB0006"; internal const string DefaultCryptoAlgorithmsMessage = "The default implementation of this cryptography algorithm is not supported."; internal const string DefaultCryptoAlgorithmsDiagId = "SYSLIB0007"; internal const string CreatePdbGeneratorMessage = "The CreatePdbGenerator API is not supported and throws PlatformNotSupportedException."; internal const string CreatePdbGeneratorDiagId = "SYSLIB0008"; internal const string AuthenticationManagerMessage = "The AuthenticationManager Authenticate and PreAuthenticate methods are not supported and throw PlatformNotSupportedException."; internal const string AuthenticationManagerDiagId = "SYSLIB0009"; internal const string RemotingApisMessage = "This Remoting API is not supported and throws PlatformNotSupportedException."; internal const string RemotingApisDiagId = "SYSLIB0010"; internal const string BinaryFormatterMessage = "BinaryFormatter serialization is obsolete and should not be used. See https://aka.ms/binaryformatter for more information."; internal const string BinaryFormatterDiagId = "SYSLIB0011"; internal const string CodeBaseMessage = "Assembly.CodeBase and Assembly.EscapedCodeBase are only included for .NET Framework compatibility. Use Assembly.Location instead."; internal const string CodeBaseDiagId = "SYSLIB0012"; internal const string EscapeUriStringMessage = "Uri.EscapeUriString can corrupt the Uri string in some cases. Consider using Uri.EscapeDataString for query string components instead."; internal const string EscapeUriStringDiagId = "SYSLIB0013"; internal const string WebRequestMessage = "WebRequest, HttpWebRequest, ServicePoint, and WebClient are obsolete. Use HttpClient instead."; internal const string WebRequestDiagId = "SYSLIB0014"; internal const string DisablePrivateReflectionAttributeMessage = "DisablePrivateReflectionAttribute has no effect in .NET 6.0+."; internal const string DisablePrivateReflectionAttributeDiagId = "SYSLIB0015"; internal const string GetContextInfoMessage = "Use the Graphics.GetContextInfo overloads that accept arguments for better performance and fewer allocations."; internal const string GetContextInfoDiagId = "SYSLIB0016"; internal const string StrongNameKeyPairMessage = "Strong name signing is not supported and throws PlatformNotSupportedException."; internal const string StrongNameKeyPairDiagId = "SYSLIB0017"; internal const string ReflectionOnlyLoadingMessage = "ReflectionOnly loading is not supported and throws PlatformNotSupportedException."; internal const string ReflectionOnlyLoadingDiagId = "SYSLIB0018"; internal const string RuntimeEnvironmentMessage = "RuntimeEnvironment members SystemConfigurationFile, GetRuntimeInterfaceAsIntPtr, and GetRuntimeInterfaceAsObject are not supported and throw PlatformNotSupportedException."; internal const string RuntimeEnvironmentDiagId = "SYSLIB0019"; internal const string JsonSerializerOptionsIgnoreNullValuesMessage = "JsonSerializerOptions.IgnoreNullValues is obsolete. To ignore null values when serializing, set DefaultIgnoreCondition to JsonIgnoreCondition.WhenWritingNull."; internal const string JsonSerializerOptionsIgnoreNullValuesDiagId = "SYSLIB0020"; internal const string DerivedCryptographicTypesMessage = "Derived cryptographic types are obsolete. Use the Create method on the base type instead."; internal const string DerivedCryptographicTypesDiagId = "SYSLIB0021"; internal const string RijndaelMessage = "The Rijndael and RijndaelManaged types are obsolete. Use Aes instead."; internal const string RijndaelDiagId = "SYSLIB0022"; internal const string RNGCryptoServiceProviderMessage = "RNGCryptoServiceProvider is obsolete. To generate a random number, use one of the RandomNumberGenerator static methods instead."; internal const string RNGCryptoServiceProviderDiagId = "SYSLIB0023"; internal const string AppDomainCreateUnloadMessage = "Creating and unloading AppDomains is not supported and throws an exception."; internal const string AppDomainCreateUnloadDiagId = "SYSLIB0024"; internal const string SuppressIldasmAttributeMessage = "SuppressIldasmAttribute has no effect in .NET 6.0+."; internal const string SuppressIldasmAttributeDiagId = "SYSLIB0025"; internal const string X509CertificateImmutableMessage = "X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate."; internal const string X509CertificateImmutableDiagId = "SYSLIB0026"; internal const string PublicKeyPropertyMessage = "PublicKey.Key is obsolete. Use the appropriate method to get the public key, such as GetRSAPublicKey."; internal const string PublicKeyPropertyDiagId = "SYSLIB0027"; internal const string X509CertificatePrivateKeyMessage = "X509Certificate2.PrivateKey is obsolete. Use the appropriate method to get the private key, such as GetRSAPrivateKey, or use the CopyWithPrivateKey method to create a new instance with a private key."; internal const string X509CertificatePrivateKeyDiagId = "SYSLIB0028"; internal const string ProduceLegacyHmacValuesMessage = "ProduceLegacyHmacValues is obsolete. Producing legacy HMAC values is not supported."; internal const string ProduceLegacyHmacValuesDiagId = "SYSLIB0029"; internal const string UseManagedSha1Message = "HMACSHA1 always uses the algorithm implementation provided by the platform. Use a constructor without the useManagedSha1 parameter."; internal const string UseManagedSha1DiagId = "SYSLIB0030"; internal const string CryptoConfigEncodeOIDMessage = "EncodeOID is obsolete. Use the ASN.1 functionality provided in System.Formats.Asn1."; internal const string CryptoConfigEncodeOIDDiagId = "SYSLIB0031"; internal const string CorruptedStateRecoveryMessage = "Recovery from corrupted process state exceptions is not supported; HandleProcessCorruptedStateExceptionsAttribute is ignored."; internal const string CorruptedStateRecoveryDiagId = "SYSLIB0032"; internal const string Rfc2898CryptDeriveKeyMessage = "Rfc2898DeriveBytes.CryptDeriveKey is obsolete and is not supported. Use PasswordDeriveBytes.CryptDeriveKey instead."; internal const string Rfc2898CryptDeriveKeyDiagId = "SYSLIB0033"; internal const string CmsSignerCspParamsCtorMessage = "CmsSigner(CspParameters) is obsolete and is not supported. Use an alternative constructor instead."; internal const string CmsSignerCspParamsCtorDiagId = "SYSLIB0034"; internal const string SignerInfoCounterSigMessage = "ComputeCounterSignature without specifying a CmsSigner is obsolete and is not supported. Use the overload that accepts a CmsSigner."; internal const string SignerInfoCounterSigDiagId = "SYSLIB0035"; internal const string RegexCompileToAssemblyMessage = "Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead."; internal const string RegexCompileToAssemblyDiagId = "SYSLIB0036"; internal const string AssemblyNameMembersMessage = "AssemblyName members HashAlgorithm, ProcessorArchitecture, and VersionCompatibility are obsolete and not supported."; internal const string AssemblyNameMembersDiagId = "SYSLIB0037"; internal const string SystemDataSerializationFormatBinaryMessage = "SerializationFormat.Binary is obsolete and should not be used. See https://aka.ms/serializationformat-binary-obsolete for more information."; internal const string SystemDataSerializationFormatBinaryDiagId = "SYSLIB0038"; internal const string TlsVersion10and11Message = "TLS versions 1.0 and 1.1 have known vulnerabilities and are not recommended. Use a newer TLS version instead, or use SslProtocols.None to defer to OS defaults."; internal const string TlsVersion10and11DiagId = "SYSLIB0039"; internal const string EncryptionPolicyMessage = "EncryptionPolicy.NoEncryption and AllowEncryption significantly reduce security and should not be used in production code."; internal const string EncryptionPolicyDiagId = "SYSLIB0040"; internal const string Rfc2898OutdatedCtorMessage = "The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations."; internal const string Rfc2898OutdatedCtorDiagId = "SYSLIB0041"; internal const string EccXmlExportImportMessage = "ToXmlString and FromXmlString have no implementation for ECC types, and are obsolete. Use a standard import and export format such as ExportSubjectPublicKeyInfo or ImportSubjectPublicKeyInfo for public keys and ExportPkcs8PrivateKey or ImportPkcs8PrivateKey for private keys."; internal const string EccXmlExportImportDiagId = "SYSLIB0042"; internal const string EcDhPublicKeyBlobMessage = "ECDiffieHellmanPublicKey.ToByteArray() and the associated constructor do not have a consistent and interoperable implementation on all platforms. Use ECDiffieHellmanPublicKey.ExportSubjectPublicKeyInfo() instead."; internal const string EcDhPublicKeyBlobDiagId = "SYSLIB0043"; internal const string AssemblyNameCodeBaseMessage = "AssemblyName.CodeBase and AssemblyName.EscapedCodeBase are obsolete. Using them for loading an assembly is not supported."; internal const string AssemblyNameCodeBaseDiagId = "SYSLIB0044"; internal const string CryptoStringFactoryMessage = "Cryptographic factory methods accepting an algorithm name are obsolete. Use the parameterless Create factory method on the algorithm type instead."; internal const string CryptoStringFactoryDiagId = "SYSLIB0045"; internal const string ControlledExecutionRunMessage = "ControlledExecution.Run method may corrupt the process and should not be used in production code."; internal const string ControlledExecutionRunDiagId = "SYSLIB0046"; internal const string XmlSecureResolverMessage = "XmlSecureResolver is obsolete. Use XmlResolver.ThrowingResolver instead when attempting to forbid XML external entity resolution."; internal const string XmlSecureResolverDiagId = "SYSLIB0047"; internal const string RsaEncryptDecryptValueMessage = "RSA.EncryptValue and DecryptValue are not supported and throw NotSupportedException. Use RSA.Encrypt and RSA.Decrypt instead."; internal const string RsaEncryptDecryptDiagId = "SYSLIB0048"; internal const string JsonSerializerOptionsAddContextMessage = "JsonSerializerOptions.AddContext is obsolete. To register a JsonSerializerContext, use either the TypeInfoResolver or TypeInfoResolverChain properties."; internal const string JsonSerializerOptionsAddContextDiagId = "SYSLIB0049"; internal const string LegacyFormatterMessage = "Formatter-based serialization is obsolete and should not be used."; internal const string LegacyFormatterDiagId = "SYSLIB0050"; internal const string LegacyFormatterImplMessage = "This API supports obsolete formatter-based serialization. It should not be called or extended by application code."; internal const string LegacyFormatterImplDiagId = "SYSLIB0051"; internal const string RegexExtensibilityImplMessage = "This API supports obsolete mechanisms for Regex extensibility. It is not supported."; internal const string RegexExtensibilityDiagId = "SYSLIB0052"; internal const string AesGcmTagConstructorMessage = "AesGcm should indicate the required tag size for encryption and decryption. Use a constructor that accepts the tag size."; internal const string AesGcmTagConstructorDiagId = "SYSLIB0053"; } internal static class SR { private static readonly bool s_usingResourceKeys = AppContext.TryGetSwitch("System.Resources.UseSystemResourceKeys", out var isEnabled) && isEnabled; private static ResourceManager s_resourceManager; internal static ResourceManager ResourceManager => s_resourceManager ?? (s_resourceManager = new ResourceManager(typeof(SR))); internal static string Argument_DestinationTooShort => GetResourceString("Argument_DestinationTooShort"); internal static string Argument_EnumeratedValueRequiresNonFlagsEnum => GetResourceString("Argument_EnumeratedValueRequiresNonFlagsEnum"); internal static string Argument_EnumeratedValueBackingTypeNotSupported => GetResourceString("Argument_EnumeratedValueBackingTypeNotSupported"); internal static string Argument_InvalidOidValue => GetResourceString("Argument_InvalidOidValue"); internal static string Argument_NamedBitListRequiresFlagsEnum => GetResourceString("Argument_NamedBitListRequiresFlagsEnum"); internal static string Argument_SourceOverlapsDestination => GetResourceString("Argument_SourceOverlapsDestination"); internal static string Argument_Tag_NotCharacterString => GetResourceString("Argument_Tag_NotCharacterString"); internal static string Argument_IntegerCannotBeEmpty => GetResourceString("Argument_IntegerCannotBeEmpty"); internal static string Argument_IntegerRedundantByte => GetResourceString("Argument_IntegerRedundantByte"); internal static string Argument_UniversalValueIsFixed => GetResourceString("Argument_UniversalValueIsFixed"); internal static string Argument_UnusedBitCountMustBeZero => GetResourceString("Argument_UnusedBitCountMustBeZero"); internal static string Argument_UnusedBitCountRange => GetResourceString("Argument_UnusedBitCountRange"); internal static string Argument_UnusedBitWasSet => GetResourceString("Argument_UnusedBitWasSet"); internal static string Argument_WriteEncodedValue_OneValueAtATime => GetResourceString("Argument_WriteEncodedValue_OneValueAtATime"); internal static string ArgumentOutOfRange_NeedNonNegNum => GetResourceString("ArgumentOutOfRange_NeedNonNegNum"); internal static string AsnWriter_EncodeUnbalancedStack => GetResourceString("AsnWriter_EncodeUnbalancedStack"); internal static string AsnWriter_PopWrongTag => GetResourceString("AsnWriter_PopWrongTag"); internal static string ContentException_CerRequiresIndefiniteLength => GetResourceString("ContentException_CerRequiresIndefiniteLength"); internal static string ContentException_ConstructedEncodingRequired => GetResourceString("ContentException_ConstructedEncodingRequired"); internal static string ContentException_DefaultMessage => GetResourceString("ContentException_DefaultMessage"); internal static string ContentException_EnumeratedValueTooBig => GetResourceString("ContentException_EnumeratedValueTooBig"); internal static string ContentException_InvalidUnderCer_TryBerOrDer => GetResourceString("ContentException_InvalidUnderCer_TryBerOrDer"); internal static string ContentException_InvalidUnderCerOrDer_TryBer => GetResourceString("ContentException_InvalidUnderCerOrDer_TryBer"); internal static string ContentException_InvalidUnderDer_TryBerOrCer => GetResourceString("ContentException_InvalidUnderDer_TryBerOrCer"); internal static string ContentException_InvalidTag => GetResourceString("ContentException_InvalidTag"); internal static string ContentException_LengthExceedsPayload => GetResourceString("ContentException_LengthExceedsPayload"); internal static string ContentException_LengthRuleSetConstraint => GetResourceString("ContentException_LengthRuleSetConstraint"); internal static string ContentException_LengthTooBig => GetResourceString("ContentException_LengthTooBig"); internal static string ContentException_NamedBitListValueTooBig => GetResourceString("ContentException_NamedBitListValueTooBig"); internal static string ContentException_OidTooBig => GetResourceString("ContentException_OidTooBig"); internal static string ContentException_PrimitiveEncodingRequired => GetResourceString("ContentException_PrimitiveEncodingRequired"); internal static string ContentException_SetOfNotSorted => GetResourceString("ContentException_SetOfNotSorted"); internal static string ContentException_TooMuchData => GetResourceString("ContentException_TooMuchData"); internal static string ContentException_WrongTag => GetResourceString("ContentException_WrongTag"); internal static bool UsingResourceKeys() { return s_usingResourceKeys; } private static string GetResourceString(string resourceKey) { if (UsingResourceKeys()) { return resourceKey; } string result = null; try { result = ResourceManager.GetString(resourceKey); } catch (MissingManifestResourceException) { } return result; } private static string GetResourceString(string resourceKey, string defaultString) { string resourceString = GetResourceString(resourceKey); if (!(resourceKey == resourceString) && resourceString != null) { return resourceString; } return defaultString; } internal static string Format(string resourceFormat, object p1) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1); } return string.Format(resourceFormat, p1); } internal static string Format(string resourceFormat, object p1, object p2) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2); } return string.Format(resourceFormat, p1, p2); } internal static string Format(string resourceFormat, object p1, object p2, object p3) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2, p3); } return string.Format(resourceFormat, p1, p2, p3); } internal static string Format(string resourceFormat, params object[] args) { if (args != null) { if (UsingResourceKeys()) { return resourceFormat + ", " + string.Join(", ", args); } return string.Format(resourceFormat, args); } return resourceFormat; } internal static string Format(IFormatProvider provider, string resourceFormat, object p1) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1); } return string.Format(provider, resourceFormat, p1); } internal static string Format(IFormatProvider provider, string resourceFormat, object p1, object p2) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2); } return string.Format(provider, resourceFormat, p1, p2); } internal static string Format(IFormatProvider provider, string resourceFormat, object p1, object p2, object p3) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2, p3); } return string.Format(provider, resourceFormat, p1, p2, p3); } internal static string Format(IFormatProvider provider, string resourceFormat, params object[] args) { if (args != null) { if (UsingResourceKeys()) { return resourceFormat + ", " + string.Join(", ", args); } return string.Format(provider, resourceFormat, args); } return resourceFormat; } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class AllowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class DisallowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class MaybeNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class NotNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class MaybeNullWhenAttribute : Attribute { public bool ReturnValue { get; } public MaybeNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class NotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)] internal sealed class NotNullIfNotNullAttribute : Attribute { public string ParameterName { get; } public NotNullIfNotNullAttribute(string parameterName) { ParameterName = parameterName; } } [AttributeUsage(AttributeTargets.Method, Inherited = false)] internal sealed class DoesNotReturnAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class DoesNotReturnIfAttribute : Attribute { public bool ParameterValue { get; } public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } } namespace System.Runtime.InteropServices { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] internal sealed class LibraryImportAttribute : Attribute { public string LibraryName { get; } public string EntryPoint { get; set; } public StringMarshalling StringMarshalling { get; set; } public Type StringMarshallingCustomType { get; set; } public bool SetLastError { get; set; } public LibraryImportAttribute(string libraryName) { LibraryName = libraryName; } } internal enum StringMarshalling { Custom, Utf8, Utf16 } } namespace System.Formats.Asn1 { public readonly struct Asn1Tag : IEquatable<Asn1Tag> { private const byte ClassMask = 192; private const byte ConstructedMask = 32; private const byte ControlMask = 224; private const byte TagNumberMask = 31; private readonly byte _controlFlags; internal static readonly Asn1Tag EndOfContents = new Asn1Tag((byte)0, 0); public static readonly Asn1Tag Boolean = new Asn1Tag((byte)0, 1); public static readonly Asn1Tag Integer = new Asn1Tag((byte)0, 2); public static readonly Asn1Tag PrimitiveBitString = new Asn1Tag((byte)0, 3); public static readonly Asn1Tag ConstructedBitString = new Asn1Tag(32, 3); public static readonly Asn1Tag PrimitiveOctetString = new Asn1Tag((byte)0, 4); public static readonly Asn1Tag ConstructedOctetString = new Asn1Tag(32, 4); public static readonly Asn1Tag Null = new Asn1Tag((byte)0, 5); public static readonly Asn1Tag ObjectIdentifier = new Asn1Tag((byte)0, 6); public static readonly Asn1Tag Enumerated = new Asn1Tag((byte)0, 10); public static readonly Asn1Tag Sequence = new Asn1Tag(32, 16); public static readonly Asn1Tag SetOf = new Asn1Tag(32, 17); public static readonly Asn1Tag UtcTime = new Asn1Tag((byte)0, 23); public static readonly Asn1Tag GeneralizedTime = new Asn1Tag((byte)0, 24); public TagClass TagClass => (TagClass)(_controlFlags & 0xC0); public bool IsConstructed => (_controlFlags & 0x20) != 0; public int TagValue { get; } private Asn1Tag(byte controlFlags, int tagValue) { _controlFlags = (byte)(controlFlags & 0xE0u); TagValue = tagValue; } public Asn1Tag(UniversalTagNumber universalTagNumber, bool isConstructed = false) : this((byte)(isConstructed ? 32 : 0), (int)universalTagNumber) { if (universalTagNumber < UniversalTagNumber.EndOfContents || universalTagNumber > UniversalTagNumber.RelativeObjectIdentifierIRI || universalTagNumber == (UniversalTagNumber)15) { throw new ArgumentOutOfRangeException("universalTagNumber"); } } public Asn1Tag(TagClass tagClass, int tagValue, bool isConstructed = false) : this((byte)((byte)tagClass | (isConstructed ? 32u : 0u)), tagValue) { switch (tagClass) { default: throw new ArgumentOutOfRangeException("tagClass"); case TagClass.Universal: case TagClass.Application: case TagClass.ContextSpecific: case TagClass.Private: if (tagValue < 0) { throw new ArgumentOutOfRangeException("tagValue"); } break; } } public Asn1Tag AsConstructed() { return new Asn1Tag((byte)(_controlFlags | 0x20u), TagValue); } public Asn1Tag AsPrimitive() { return new Asn1Tag((byte)(_controlFlags & 0xFFFFFFDFu), TagValue); } public static bool TryDecode(ReadOnlySpan<byte> source, out Asn1Tag tag, out int bytesConsumed) { tag = default(Asn1Tag); bytesConsumed = 0; if (source.IsEmpty) { return false; } byte b = source[bytesConsumed]; bytesConsumed++; uint num = b & 0x1Fu; if (num == 31) { num = 0u; byte b2; do { if (source.Length <= bytesConsumed) { bytesConsumed = 0; return false; } b2 = source[bytesConsumed]; byte b3 = (byte)(b2 & 0x7Fu); bytesConsumed++; if (num >= 33554432) { bytesConsumed = 0; return false; } num <<= 7; num |= b3; if (num == 0) { bytesConsumed = 0; return false; } } while ((b2 & 0x80) == 128); if (num <= 30) { bytesConsumed = 0; return false; } if (num > int.MaxValue) { bytesConsumed = 0; return false; } } tag = new Asn1Tag(b, (int)num); return true; } public static Asn1Tag Decode(ReadOnlySpan<byte> source, out int bytesConsumed) { if (TryDecode(source, out var tag, out bytesConsumed)) { return tag; } throw new AsnContentException(System.SR.ContentException_InvalidTag); } public int CalculateEncodedSize() { if (TagValue < 31) { return 1; } if (TagValue <= 127) { return 2; } if (TagValue <= 16383) { return 3; } if (TagValue <= 2097151) { return 4; } if (TagValue <= 268435455) { return 5; } return 6; } public bool TryEncode(Span<byte> destination, out int bytesWritten) { int num = CalculateEncodedSize(); if (destination.Length < num) { bytesWritten = 0; return false; } if (num == 1) { byte b = (byte)(_controlFlags | TagValue); destination[0] = b; bytesWritten = 1; return true; } byte b2 = (byte)(_controlFlags | 0x1Fu); destination[0] = b2; int num2 = TagValue; int num3 = num - 1; while (num2 > 0) { int num4 = num2 & 0x7F; if (num2 != TagValue) { num4 |= 0x80; } destination[num3] = (byte)num4; num2 >>= 7; num3--; } bytesWritten = num; return true; } public int Encode(Span<byte> destination) { if (TryEncode(destination, out var bytesWritten)) { return bytesWritten; } throw new ArgumentException(System.SR.Argument_DestinationTooShort, "destination"); } public bool Equals(Asn1Tag other) { if (_controlFlags == other._controlFlags) { return TagValue == other.TagValue; } return false; } public override bool Equals([NotNullWhen(true)] object? obj) { if (obj is Asn1Tag other) { return Equals(other); } return false; } public override int GetHashCode() { return (_controlFlags << 24) ^ TagValue; } public static bool operator ==(Asn1Tag left, Asn1Tag right) { return left.Equals(right); } public static bool operator !=(Asn1Tag left, Asn1Tag right) { return !left.Equals(right); } public bool HasSameClassAndValue(Asn1Tag other) { if (TagValue == other.TagValue) { return TagClass == other.TagClass; } return false; } public override string ToString() { string text = ((TagClass != 0) ? $"{TagClass}-{TagValue}" : ((UniversalTagNumber)TagValue).ToString()); if (IsConstructed) { return "Constructed " + text; } return text; } } internal static class AsnCharacterStringEncodings { private static readonly UTF8Encoding s_utf8Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); private static readonly BMPEncoding s_bmpEncoding = new BMPEncoding(); private static readonly IA5Encoding s_ia5Encoding = new IA5Encoding(); private static readonly VisibleStringEncoding s_visibleStringEncoding = new VisibleStringEncoding(); private static readonly NumericStringEncoding s_numericStringEncoding = new NumericStringEncoding(); private static readonly PrintableStringEncoding s_printableStringEncoding = new PrintableStringEncoding(); private static readonly T61Encoding s_t61Encoding = new T61Encoding(); internal static Encoding GetEncoding(UniversalTagNumber encodingType) { return encodingType switch { UniversalTagNumber.UTF8String => s_utf8Encoding, UniversalTagNumber.NumericString => s_numericStringEncoding, UniversalTagNumber.PrintableString => s_printableStringEncoding, UniversalTagNumber.IA5String => s_ia5Encoding, UniversalTagNumber.VisibleString => s_visibleStringEncoding, UniversalTagNumber.BMPString => s_bmpEncoding, UniversalTagNumber.TeletexString => s_t61Encoding, _ => throw new ArgumentOutOfRangeException("encodingType", encodingType, null), }; } internal unsafe static int GetByteCount(this Encoding encoding, ReadOnlySpan<char> str) { if (str.IsEmpty) { str = string.Empty.AsSpan(); } fixed (char* chars = &MemoryMarshal.GetReference(str)) { return encoding.GetByteCount(chars, str.Length); } } internal unsafe static int GetBytes(this Encoding encoding, ReadOnlySpan<char> chars, Span<byte> bytes) { if (chars.IsEmpty) { chars = string.Empty.AsSpan(); } if (bytes.IsEmpty) { bytes = Array.Empty<byte>(); } fixed (char* chars2 = &MemoryMarshal.GetReference(chars)) { fixed (byte* bytes2 = &MemoryMarshal.GetReference(bytes)) { return encoding.GetBytes(chars2, chars.Length, bytes2, bytes.Length); } } } } internal abstract class SpanBasedEncoding : Encoding { protected SpanBasedEncoding() : base(0, System.Text.EncoderFallback.ExceptionFallback, System.Text.DecoderFallback.ExceptionFallback) { } protected abstract int GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes, bool write); protected abstract int GetChars(ReadOnlySpan<byte> bytes, Span<char> chars, bool write); public override int GetByteCount(char[] chars, int index, int count) { return GetByteCount(new ReadOnlySpan<char>(chars, index, count)); } public unsafe override int GetByteCount(char* chars, int count) { return GetByteCount(new ReadOnlySpan<char>(chars, count)); } public override int GetByteCount(string s) { return GetByteCount(s.AsSpan()); } public new int GetByteCount(ReadOnlySpan<char> chars) { return GetBytes(chars, Span<byte>.Empty, write: false); } public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) { return GetBytes(new ReadOnlySpan<char>(chars, charIndex, charCount), new Span<byte>(bytes, byteIndex, bytes.Length - byteIndex), write: true); } public unsafe override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount) { return GetBytes(new ReadOnlySpan<char>(chars, charCount), new Span<byte>(bytes, byteCount), write: true); } public override int GetCharCount(byte[] bytes, int index, int count) { return GetCharCount(new ReadOnlySpan<byte>(bytes, index, count)); } public unsafe override int GetCharCount(byte* bytes, int count) { return GetCharCount(new ReadOnlySpan<byte>(bytes, count)); } public new int GetCharCount(ReadOnlySpan<byte> bytes) { return GetChars(bytes, Span<char>.Empty, write: false); } public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { return GetChars(new ReadOnlySpan<byte>(bytes, byteIndex, byteCount), new Span<char>(chars, charIndex, chars.Length - charIndex), write: true); } public unsafe override int GetChars(byte* bytes, int byteCount, char* chars, int charCount) { return GetChars(new ReadOnlySpan<byte>(bytes, byteCount), new Span<char>(chars, charCount), write: true); } } internal sealed class IA5Encoding : RestrictedAsciiStringEncoding { internal IA5Encoding() : base(0, 127) { } } internal sealed class VisibleStringEncoding : RestrictedAsciiStringEncoding { internal VisibleStringEncoding() : base(32, 126) { } } internal sealed class NumericStringEncoding : RestrictedAsciiStringEncoding { internal NumericStringEncoding() : base("0123456789 ") { } } internal sealed class PrintableStringEncoding : RestrictedAsciiStringEncoding { internal PrintableStringEncoding() : base("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '()+,-./:=?") { } } internal abstract class RestrictedAsciiStringEncoding : SpanBasedEncoding { private readonly bool[] _isAllowed; protected RestrictedAsciiStringEncoding(byte minCharAllowed, byte maxCharAllowed) { bool[] array = new bool[128]; array.AsSpan(minCharAllowed, maxCharAllowed - minCharAllowed + 1).Fill(value: true); _isAllowed = array; } protected RestrictedAsciiStringEncoding(string allowedChars) { bool[] array = new bool[127]; foreach (char c in allowedChars) { if (c >= array.Length) { throw new ArgumentOutOfRangeException("allowedChars"); } array[(uint)c] = true; } _isAllowed = array; } public override int GetMaxByteCount(int charCount) { return charCount; } public override int GetMaxCharCount(int byteCount) { return byteCount; } protected override int GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes, bool write) { if (chars.IsEmpty) { return 0; } for (int i = 0; i < chars.Length; i++) { char c = chars[i]; if ((uint)c >= (uint)_isAllowed.Length || !_isAllowed[(uint)c]) { base.EncoderFallback.CreateFallbackBuffer().Fallback(c, i); throw new InvalidOperationException(); } if (write) { bytes[i] = (byte)c; } } return chars.Length; } protected override int GetChars(ReadOnlySpan<byte> bytes, Span<char> chars, bool write) { if (bytes.IsEmpty) { return 0; } for (int i = 0; i < bytes.Length; i++) { byte b = bytes[i]; if ((uint)b >= (uint)_isAllowed.Length || !_isAllowed[b]) { base.DecoderFallback.CreateFallbackBuffer().Fallback(new byte[1] { b }, i); throw new InvalidOperationException(); } if (write) { chars[i] = (char)b; } } return bytes.Length; } } internal sealed class BMPEncoding : SpanBasedEncoding { protected override int GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes, bool write) { if (chars.IsEmpty) { return 0; } int num = 0; for (int i = 0; i < chars.Length; i++) { char c = chars[i]; if (char.IsSurrogate(c)) { base.EncoderFallback.CreateFallbackBuffer().Fallback(c, i); throw new InvalidOperationException(); } ushort num2 = c; if (write) { bytes[num + 1] = (byte)num2; bytes[num] = (byte)(num2 >> 8); } num += 2; } return num; } protected override int GetChars(ReadOnlySpan<byte> bytes, Span<char> chars, bool write) { if (bytes.IsEmpty) { return 0; } if (bytes.Length % 2 != 0) { base.DecoderFallback.CreateFallbackBuffer().Fallback(bytes.Slice(bytes.Length - 1).ToArray(), bytes.Length - 1); throw new InvalidOperationException(); } int num = 0; for (int i = 0; i < bytes.Length; i += 2) { char c = (char)BinaryPrimitives.ReadInt16BigEndian(bytes.Slice(i)); if (char.IsSurrogate(c)) { base.DecoderFallback.CreateFallbackBuffer().Fallback(bytes.Slice(i, 2).ToArray(), i); throw new InvalidOperationException(); } if (write) { chars[num] = c; } num++; } return num; } public override int GetMaxByteCount(int charCount) { return checked(charCount * 2); } public override int GetMaxCharCount(int byteCount) { return byteCount / 2; } } internal sealed class T61Encoding : Encoding { private static readonly UTF8Encoding s_utf8Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); private static readonly Encoding s_latin1Encoding = Encoding.GetEncoding("iso-8859-1"); public override int GetByteCount(char[] chars, int index, int count) { return s_utf8Encoding.GetByteCount(chars, index, count); } public unsafe override int GetByteCount(char* chars, int count) { return s_utf8Encoding.GetByteCount(chars, count); } public override int GetByteCount(string s) { return s_utf8Encoding.GetByteCount(s); } public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) { return s_utf8Encoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex); } public unsafe override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount) { return s_utf8Encoding.GetBytes(chars, charCount, bytes, byteCount); } public override int GetCharCount(byte[] bytes, int index, int count) { try { return s_utf8Encoding.GetCharCount(bytes, index, count); } catch (DecoderFallbackException) { return s_latin1Encoding.GetCharCount(bytes, index, count); } } public unsafe override int GetCharCount(byte* bytes, int count) { try { return s_utf8Encoding.GetCharCount(bytes, count); } catch (DecoderFallbackException) { return s_latin1Encoding.GetCharCount(bytes, count); } } public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { try { return s_utf8Encoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex); } catch (DecoderFallbackException) { return s_latin1Encoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex); } } public unsafe override int GetChars(byte* bytes, int byteCount, char* chars, int charCount) { try { return s_utf8Encoding.GetChars(bytes, byteCount, chars, charCount); } catch (DecoderFallbackException) { return s_latin1Encoding.GetChars(bytes, byteCount, chars, charCount); } } public override int GetMaxByteCount(int charCount) { return s_utf8Encoding.GetMaxByteCount(charCount); } public override int GetMaxCharCount(int byteCount) { return byteCount; } } [Serializable] public class AsnContentException : Exception { public AsnContentException() : base(System.SR.ContentException_DefaultMessage) { } public AsnContentException(string? message) : base(message ?? System.SR.ContentException_DefaultMessage) { } public AsnContentException(string? message, Exception? inner) : base(message ?? System.SR.ContentException_DefaultMessage, inner) { } protected AsnContentException(SerializationInfo info, StreamingContext context) : base(info, context) { } } public enum AsnEncodingRules { BER, CER, DER } public static class AsnDecoder { private enum LengthDecodeStatus { NeedMoreData, DerIndefinite, ReservedValue, LengthTooBig, LaxEncodingProhibited, Success } private enum LengthValidity { CerRequiresIndefinite, PrimitiveEncodingRequiresDefinite, LengthExceedsInput, Valid } private delegate void BitStringCopyAction(ReadOnlySpan<byte> value, byte normalizedLastByte, Span<byte> destination); internal const int MaxCERSegmentSize = 1000; internal const int EndOfContentsEncodedLength = 2; public static bool TryReadEncodedValue(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out Asn1Tag tag, out int contentOffset, out int contentLength, out int bytesConsumed) { CheckEncodingRules(ruleSet); if (Asn1Tag.TryDecode(source, out var tag2, out var bytesConsumed2) && TryReadLength(source.Slice(bytesConsumed2), ruleSet, out var length, out var bytesRead)) { int num = bytesConsumed2 + bytesRead; int actualLength; int bytesConsumed3; LengthValidity lengthValidity = ValidateLength(source.Slice(num), ruleSet, tag2, length, out actualLength, out bytesConsumed3); if (lengthValidity == LengthValidity.Valid) { tag = tag2; contentOffset = num; contentLength = actualLength; bytesConsumed = num + bytesConsumed3; return true; } } tag = default(Asn1Tag); contentOffset = (contentLength = (bytesConsumed = 0)); return false; } public static Asn1Tag ReadEncodedValue(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int contentOffset, out int contentLength, out int bytesConsumed) { CheckEncodingRules(ruleSet); int bytesConsumed2; Asn1Tag asn1Tag = Asn1Tag.Decode(source, out bytesConsumed2); int bytesConsumed3; int? encodedLength = ReadLength(source.Slice(bytesConsumed2), ruleSet, out bytesConsumed3); int num = bytesConsumed2 + bytesConsumed3; int actualLength; int bytesConsumed4; LengthValidity lengthValidity = ValidateLength(source.Slice(num), ruleSet, asn1Tag, encodedLength, out actualLength, out bytesConsumed4); if (lengthValidity == LengthValidity.Valid) { contentOffset = num; contentLength = actualLength; bytesConsumed = num + bytesConsumed4; return asn1Tag; } throw GetValidityException(lengthValidity); } private static ReadOnlySpan<byte> GetPrimitiveContentSpan(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Asn1Tag expectedTag, UniversalTagNumber tagNumber, out int bytesConsumed) { CheckEncodingRules(ruleSet); int bytesConsumed2; Asn1Tag tag = Asn1Tag.Decode(source, out bytesConsumed2); int bytesConsumed3; int? num = ReadLength(source.Slice(bytesConsumed2), ruleSet, out bytesConsumed3); int num2 = bytesConsumed2 + bytesConsumed3; CheckExpectedTag(tag, expectedTag, tagNumber); if (tag.IsConstructed) { throw new AsnContentException(System.SR.Format(System.SR.ContentException_PrimitiveEncodingRequired, tagNumber)); } if (!num.HasValue) { throw new AsnContentException(); } ReadOnlySpan<byte> result = Slice(source, num2, num.Value); bytesConsumed = num2 + result.Length; return result; } private static bool TryReadLength(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int? length, out int bytesRead) { return DecodeLength(source, ruleSet, out length, out bytesRead) == LengthDecodeStatus.Success; } private static int? ReadLength(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed) { int? length; switch (DecodeLength(source, ruleSet, out length, out bytesConsumed)) { case LengthDecodeStatus.Success: return length; case LengthDecodeStatus.LengthTooBig: throw new AsnContentException(System.SR.ContentException_LengthTooBig); case LengthDecodeStatus.DerIndefinite: case LengthDecodeStatus.LaxEncodingProhibited: throw new AsnContentException(System.SR.ContentException_LengthRuleSetConstraint); default: throw new AsnContentException(); } } private static LengthDecodeStatus DecodeLength(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int? length, out int bytesRead) { length = null; bytesRead = 0; if (source.IsEmpty) { return LengthDecodeStatus.NeedMoreData; } byte b = source[bytesRead]; bytesRead++; if (b == 128) { if (ruleSet == AsnEncodingRules.DER) { bytesRead = 0; return LengthDecodeStatus.DerIndefinite; } return LengthDecodeStatus.Success; } if (b < 128) { length = b; return LengthDecodeStatus.Success; } if (b == byte.MaxValue) { bytesRead = 0; return LengthDecodeStatus.ReservedValue; } byte b2 = (byte)(b & 0xFFFFFF7Fu); if (b2 + 1 > source.Length) { bytesRead = 0; return LengthDecodeStatus.NeedMoreData; } bool flag = ruleSet == AsnEncodingRules.DER || ruleSet == AsnEncodingRules.CER; if (flag && b2 > 4) { bytesRead = 0; return LengthDecodeStatus.LengthTooBig; } uint num = 0u; for (int i = 0; i < b2; i++) { byte b3 = source[bytesRead]; bytesRead++; if (num == 0) { if (flag && b3 == 0) { bytesRead = 0; return LengthDecodeStatus.LaxEncodingProhibited; } if (!flag && b3 != 0 && b2 - i > 4) { bytesRead = 0; return LengthDecodeStatus.LengthTooBig; } } num <<= 8; num |= b3; } if (num > int.MaxValue) { bytesRead = 0; return LengthDecodeStatus.LengthTooBig; } if (flag && num < 128) { bytesRead = 0; return LengthDecodeStatus.LaxEncodingProhibited; } length = (int)num; return LengthDecodeStatus.Success; } private static Asn1Tag ReadTagAndLength(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int? contentsLength, out int bytesRead) { int bytesConsumed; Asn1Tag result = Asn1Tag.Decode(source, out bytesConsumed); int bytesConsumed2; int? num = ReadLength(source.Slice(bytesConsumed), ruleSet, out bytesConsumed2); int num2 = bytesConsumed + bytesConsumed2; if (result.IsConstructed) { if (ruleSet == AsnEncodingRules.CER && num.HasValue) { throw GetValidityException(LengthValidity.CerRequiresIndefinite); } } else if (!num.HasValue) { throw GetValidityException(LengthValidity.PrimitiveEncodingRequiresDefinite); } bytesRead = num2; contentsLength = num; return result; } private static void ValidateEndOfContents(Asn1Tag tag, int? length, int headerLength) { if (tag.IsConstructed || length != 0 || headerLength != 2) { throw new AsnContentException(); } } private static LengthValidity ValidateLength(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Asn1Tag localTag, int? encodedLength, out int actualLength, out int bytesConsumed) { if (localTag.IsConstructed) { if (ruleSet == AsnEncodingRules.CER && encodedLength.HasValue) { actualLength = (bytesConsumed = 0); return LengthValidity.CerRequiresIndefinite; } } else if (!encodedLength.HasValue) { actualLength = (bytesConsumed = 0); return LengthValidity.PrimitiveEncodingRequiresDefinite; } if (encodedLength.HasValue) { int value = encodedLength.Value; int num = value; if (num > source.Length) { actualLength = (bytesConsumed = 0); return LengthValidity.LengthExceedsInput; } actualLength = value; bytesConsumed = value; return LengthValidity.Valid; } actualLength = SeekEndOfContents(source, ruleSet); bytesConsumed = actualLength + 2; return LengthValidity.Valid; } private static AsnContentException GetValidityException(LengthValidity validity) { return validity switch { LengthValidity.CerRequiresIndefinite => new AsnContentException(System.SR.ContentException_CerRequiresIndefiniteLength), LengthValidity.LengthExceedsInput => new AsnContentException(System.SR.ContentException_LengthExceedsPayload), _ => new AsnContentException(), }; } private static int GetPrimitiveIntegerSize(Type primitiveType) { if (primitiveType == typeof(byte) || primitiveType == typeof(sbyte)) { return 1; } if (primitiveType == typeof(short) || primitiveType == typeof(ushort)) { return 2; } if (primitiveType == typeof(int) || primitiveType == typeof(uint)) { return 4; } if (primitiveType == typeof(long) || primitiveType == typeof(ulong)) { return 8; } return 0; } private static int SeekEndOfContents(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet) { ReadOnlySpan<byte> source2 = source; int num = 0; int num2 = 1; while (!source2.IsEmpty) { int? contentsLength; int bytesRead; Asn1Tag asn1Tag = ReadTagAndLength(source2, ruleSet, out contentsLength, out bytesRead); if (asn1Tag == Asn1Tag.EndOfContents) { ValidateEndOfContents(asn1Tag, contentsLength, bytesRead); num2--; if (num2 == 0) { return num; } } if (!contentsLength.HasValue) { num2++; source2 = source2.Slice(bytesRead); num += bytesRead; } else { ReadOnlySpan<byte> readOnlySpan = Slice(source2, 0, bytesRead + contentsLength.Value); source2 = source2.Slice(readOnlySpan.Length); num += readOnlySpan.Length; } } throw new AsnContentException(); } private static int ParseNonNegativeIntAndSlice(ref ReadOnlySpan<byte> data, int bytesToRead) { int result = ParseNonNegativeInt(Slice(data, 0, bytesToRead)); data = data.Slice(bytesToRead); return result; } private static int ParseNonNegativeInt(ReadOnlySpan<byte> data) { if (Utf8Parser.TryParse(data, out uint value, out int bytesConsumed, '\0') && value <= int.MaxValue && bytesConsumed == data.Length) { return (int)value; } throw new AsnContentException(); } private static ReadOnlySpan<byte> SliceAtMost(ReadOnlySpan<byte> source, int longestPermitted) { return source[..Math.Min(longestPermitted, source.Length)]; } private static ReadOnlySpan<byte> Slice(ReadOnlySpan<byte> source, int offset, int length) { if (length < 0 || source.Length - offset < length) { throw new AsnContentException(System.SR.ContentException_LengthExceedsPayload); } return source.Slice(offset, length); } private static ReadOnlySpan<byte> Slice(ReadOnlySpan<byte> source, int offset, int? length) { if (!length.HasValue) { return source.Slice(offset); } int value = length.Value; if (value < 0 || source.Length - offset < value) { throw new AsnContentException(System.SR.ContentException_LengthExceedsPayload); } return source.Slice(offset, value); } internal static ReadOnlyMemory<byte> Slice(ReadOnlyMemory<byte> bigger, ReadOnlySpan<byte> smaller) { if (smaller.IsEmpty) { return default(ReadOnlyMemory<byte>); } if (bigger.Span.Overlaps(smaller, out var elementOffset)) { return bigger.Slice(elementOffset, smaller.Length); } throw new AsnContentException(); } [Conditional("DEBUG")] private static void AssertEncodingRules(AsnEncodingRules ruleSet) { } internal static void CheckEncodingRules(AsnEncodingRules ruleSet) { if (ruleSet != 0 && ruleSet != AsnEncodingRules.CER && ruleSet != AsnEncodingRules.DER) { throw new ArgumentOutOfRangeException("ruleSet"); } } private static void CheckExpectedTag(Asn1Tag tag, Asn1Tag expectedTag, UniversalTagNumber tagNumber) { if (expectedTag.TagClass == TagClass.Universal && expectedTag.TagValue != (int)tagNumber) { throw new ArgumentException(System.SR.Argument_UniversalValueIsFixed, "expectedTag"); } if (expectedTag.TagClass != tag.TagClass || expectedTag.TagValue != tag.TagValue) { throw new AsnContentException(System.SR.Format(System.SR.ContentException_WrongTag, tag.TagClass, tag.TagValue, expectedTag.TagClass, expectedTag.TagValue)); } } public static bool TryReadPrimitiveBitString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int unusedBitCount, out ReadOnlySpan<byte> value, out int bytesConsumed, Asn1Tag? expectedTag = null) { if (TryReadPrimitiveBitStringCore(source, ruleSet, expectedTag ?? Asn1Tag.PrimitiveBitString, out var _, out var _, out var unusedBitCount2, out var value2, out var bytesConsumed2, out var normalizedLastByte) && (value2.Length == 0 || normalizedLastByte == value2[value2.Length - 1])) { unusedBitCount = unusedBitCount2; value = value2; bytesConsumed = bytesConsumed2; return true; } unusedBitCount = 0; value = default(ReadOnlySpan<byte>); bytesConsumed = 0; return false; } public static bool TryReadBitString(ReadOnlySpan<byte> source, Span<byte> destination, AsnEncodingRules ruleSet, out int unusedBitCount, out int bytesConsumed, out int bytesWritten, Asn1Tag? expectedTag = null) { if (source.Overlaps(destination)) { throw new ArgumentException(System.SR.Argument_SourceOverlapsDestination, "destination"); } if (TryReadPrimitiveBitStringCore(source, ruleSet, expectedTag ?? Asn1Tag.PrimitiveBitString, out var contentsLength, out var headerLength, out var unusedBitCount2, out var value, out var bytesConsumed2, out var normalizedLastByte)) { if (value.Length > destination.Length) { bytesConsumed = 0; bytesWritten = 0; unusedBitCount = 0; return false; } CopyBitStringValue(value, normalizedLastByte, destination); bytesWritten = value.Length; bytesConsumed = bytesConsumed2; unusedBitCount = unusedBitCount2; return true; } if (TryCopyConstructedBitStringValue(Slice(source, headerLength, contentsLength), ruleSet, destination, !contentsLength.HasValue, out unusedBitCount2, out var bytesRead, out var bytesWritten2)) { unusedBitCount = unusedBitCount2; bytesConsumed = headerLength + bytesRead; bytesWritten = bytesWritten2; return true; } bytesWritten = (bytesConsumed = (unusedBitCount = 0)); return false; } public static byte[] ReadBitString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int unusedBitCount, out int bytesConsumed, Asn1Tag? expectedTag = null) { if (TryReadPrimitiveBitStringCore(source, ruleSet, expectedTag ?? Asn1Tag.PrimitiveBitString, out var contentsLength, out var headerLength, out var unusedBitCount2, out var value, out var bytesConsumed2, out var normalizedLastByte)) { byte[] array = value.ToArray(); if (value.Length > 0) { array[^1] = normalizedLastByte; } unusedBitCount = unusedBitCount2; bytesConsumed = bytesConsumed2; return array; } int minimumLength = contentsLength ?? SeekEndOfContents(source.Slice(headerLength), ruleSet); byte[] array2 = System.Security.Cryptography.CryptoPool.Rent(minimumLength); if (TryCopyConstructedBitStringValue(Slice(source, headerLength, contentsLength), ruleSet, array2, !contentsLength.HasValue, out unusedBitCount2, out var bytesRead, out var bytesWritten)) { byte[] result = array2.AsSpan(0, bytesWritten).ToArray(); System.Security.Cryptography.CryptoPool.Return(array2, bytesWritten); unusedBitCount = unusedBitCount2; bytesConsumed = headerLength + bytesRead; return result; } throw new AsnContentException(); } private static void ParsePrimitiveBitStringContents(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int unusedBitCount, out ReadOnlySpan<byte> value, out byte normalizedLastByte) { if (ruleSet == AsnEncodingRules.CER && source.Length > 1000) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCer_TryBerOrDer); } if (source.Length == 0) { throw new AsnContentException(); } unusedBitCount = source[0]; if (unusedBitCount > 7) { throw new AsnContentException(); } if (source.Length == 1) { if (unusedBitCount > 0) { throw new AsnContentException(); } value = ReadOnlySpan<byte>.Empty; normalizedLastByte = 0; return; } int num = -1 << unusedBitCount; byte b = source[source.Length - 1]; byte b2 = (byte)(b & num); if (b2 != b && (ruleSet == AsnEncodingRules.DER || ruleSet == AsnEncodingRules.CER)) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } normalizedLastByte = b2; value = source.Slice(1); } private static void CopyBitStringValue(ReadOnlySpan<byte> value, byte normalizedLastByte, Span<byte> destination) { if (value.Length != 0) { value.CopyTo(destination); destination[value.Length - 1] = normalizedLastByte; } } private static int CountConstructedBitString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, bool isIndefinite) { Span<byte> empty = Span<byte>.Empty; int lastUnusedBitCount; int bytesRead; return ProcessConstructedBitString(source, ruleSet, empty, null, isIndefinite, out lastUnusedBitCount, out bytesRead); } private static void CopyConstructedBitString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Span<byte> destination, bool isIndefinite, out int unusedBitCount, out int bytesRead, out int bytesWritten) { bytesWritten = ProcessConstructedBitString(source, ruleSet, destination, CopyBitStringValue, isIndefinite, out unusedBitCount, out bytesRead); } private static int ProcessConstructedBitString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Span<byte> destination, BitStringCopyAction copyAction, bool isIndefinite, out int lastUnusedBitCount, out int bytesRead) { lastUnusedBitCount = 0; bytesRead = 0; int num = 1000; ReadOnlySpan<byte> readOnlySpan = source; Stack<(int, int, bool, int)> stack = null; int num2 = 0; Asn1Tag asn1Tag = Asn1Tag.ConstructedBitString; Span<byte> destination2 = destination; while (true) { if (!readOnlySpan.IsEmpty) { asn1Tag = ReadTagAndLength(readOnlySpan, ruleSet, out var contentsLength, out var bytesRead2); if (asn1Tag == Asn1Tag.PrimitiveBitString) { if (lastUnusedBitCount != 0) { throw new AsnContentException(); } if (ruleSet == AsnEncodingRules.CER && num != 1000) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCer_TryBerOrDer); } ReadOnlySpan<byte> source2 = Slice(readOnlySpan, bytesRead2, contentsLength.Value); ParsePrimitiveBitStringContents(source2, ruleSet, out lastUnusedBitCount, out var value, out var normalizedLastByte); int num3 = bytesRead2 + source2.Length; readOnlySpan = readOnlySpan.Slice(num3); bytesRead += num3; num2 += value.Length; num = source2.Length; if (copyAction != null) { copyAction(value, normalizedLastByte, destination2); destination2 = destination2.Slice(value.Length); } continue; } if (!(asn1Tag == Asn1Tag.EndOfContents && isIndefinite)) { if (asn1Tag == Asn1Tag.ConstructedBitString) { if (ruleSet == AsnEncodingRules.CER) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } if (stack == null) { stack = new Stack<(int, int, bool, int)>(); } if (!source.Overlaps(readOnlySpan, out var elementOffset)) { throw new AsnContentException(); } stack.Push((elementOffset, readOnlySpan.Length, isIndefinite, bytesRead)); readOnlySpan = Slice(readOnlySpan, bytesRead2, contentsLength); bytesRead = bytesRead2; isIndefinite = !contentsLength.HasValue; continue; } throw new AsnContentException(); } ValidateEndOfContents(asn1Tag, contentsLength, bytesRead2); bytesRead += bytesRead2; if (stack != null && stack.Count > 0) { (int, int, bool, int) tuple = stack.Pop(); int item = tuple.Item1; int item2 = tuple.Item2; bool item3 = tuple.Item3; int item4 = tuple.Item4; readOnlySpan = source.Slice(item, item2).Slice(bytesRead); bytesRead += item4; isIndefinite = item3; continue; } } if (isIndefinite && asn1Tag != Asn1Tag.EndOfContents) { throw new AsnContentException(); } if (stack == null || stack.Count <= 0) { break; } (int, int, bool, int) tuple2 = stack.Pop(); int item5 = tuple2.Item1; int item6 = tuple2.Item2; bool item7 = tuple2.Item3; int item8 = tuple2.Item4; readOnlySpan = source.Slice(item5, item6).Slice(bytesRead); isIndefinite = item7; bytesRead += item8; } return num2; } private static bool TryCopyConstructedBitStringValue(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Span<byte> dest, bool isIndefinite, out int unusedBitCount, out int bytesRead, out int bytesWritten) { int num = CountConstructedBitString(source, ruleSet, isIndefinite); if (ruleSet == AsnEncodingRules.CER && num < 1000) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } if (dest.Length < num) { unusedBitCount = 0; bytesRead = 0; bytesWritten = 0; return false; } CopyConstructedBitString(source, ruleSet, dest, isIndefinite, out unusedBitCount, out bytesRead, out bytesWritten); return true; } private static bool TryReadPrimitiveBitStringCore(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Asn1Tag expectedTag, out int? contentsLength, out int headerLength, out int unusedBitCount, out ReadOnlySpan<byte> value, out int bytesConsumed, out byte normalizedLastByte) { Asn1Tag tag = ReadTagAndLength(source, ruleSet, out contentsLength, out headerLength); CheckExpectedTag(tag, expectedTag, UniversalTagNumber.BitString); ReadOnlySpan<byte> source2 = Slice(source, headerLength, contentsLength); if (tag.IsConstructed) { if (ruleSet == AsnEncodingRules.DER) { throw new AsnContentException(System.SR.ContentException_InvalidUnderDer_TryBerOrCer); } unusedBitCount = 0; value = default(ReadOnlySpan<byte>); normalizedLastByte = 0; bytesConsumed = 0; return false; } ParsePrimitiveBitStringContents(source2, ruleSet, out unusedBitCount, out value, out normalizedLastByte); bytesConsumed = headerLength + source2.Length; return true; } public static bool ReadBoolean(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { int bytesConsumed2; ReadOnlySpan<byte> primitiveContentSpan = GetPrimitiveContentSpan(source, ruleSet, expectedTag ?? Asn1Tag.Boolean, UniversalTagNumber.Boolean, out bytesConsumed2); if (primitiveContentSpan.Length != 1) { throw new AsnContentException(); } switch (primitiveContentSpan[0]) { case 0: bytesConsumed = bytesConsumed2; return false; default: if (ruleSet == AsnEncodingRules.DER || ruleSet == AsnEncodingRules.CER) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } break; case byte.MaxValue: break; } bytesConsumed = bytesConsumed2; return true; } public static ReadOnlySpan<byte> ReadEnumeratedBytes(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { return GetIntegerContents(source, ruleSet, expectedTag ?? Asn1Tag.Enumerated, UniversalTagNumber.Enumerated, out bytesConsumed); } public static TEnum ReadEnumeratedValue<TEnum>(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) where TEnum : Enum { Type typeFromHandle = typeof(TEnum); return (TEnum)Enum.ToObject(typeFromHandle, ReadEnumeratedValue(source, ruleSet, typeFromHandle, out bytesConsumed, expectedTag)); } public static Enum ReadEnumeratedValue(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Type enumType, out int bytesConsumed, Asn1Tag? expectedTag = null) { if (enumType == null) { throw new ArgumentNullException("enumType"); } Asn1Tag expectedTag2 = expectedTag ?? Asn1Tag.Enumerated; Type enumUnderlyingType = enumType.GetEnumUnderlyingType(); if (enumType.IsDefined(typeof(FlagsAttribute), inherit: false)) { throw new ArgumentException(System.SR.Argument_EnumeratedValueRequiresNonFlagsEnum, "enumType"); } int primitiveIntegerSize = GetPrimitiveIntegerSize(enumUnderlyingType); if (enumUnderlyingType == typeof(int) || enumUnderlyingType == typeof(long) || enumUnderlyingType == typeof(short) || enumUnderlyingType == typeof(sbyte)) { if (!TryReadSignedInteger(source, ruleSet, primitiveIntegerSize, expectedTag2, UniversalTagNumber.Enumerated, out var value, out var bytesConsumed2)) { throw new AsnContentException(System.SR.ContentException_EnumeratedValueTooBig); } bytesConsumed = bytesConsumed2; return (Enum)Enum.ToObject(enumType, value); } if (enumUnderlyingType == typeof(uint) || enumUnderlyingType == typeof(ulong) || enumUnderlyingType == typeof(ushort) || enumUnderlyingType == typeof(byte)) { if (!TryReadUnsignedInteger(source, ruleSet, primitiveIntegerSize, expectedTag2, UniversalTagNumber.Enumerated, out var value2, out var bytesConsumed3)) { throw new AsnContentException(System.SR.ContentException_EnumeratedValueTooBig); } bytesConsumed = bytesConsumed3; return (Enum)Enum.ToObject(enumType, value2); } throw new AsnContentException(System.SR.Format(System.SR.Argument_EnumeratedValueBackingTypeNotSupported, enumUnderlyingType.FullName)); } public static DateTimeOffset ReadGeneralizedTime(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { byte[] rented = null; Span<byte> tmpSpace = stackalloc byte[64]; int bytesConsumed2; ReadOnlySpan<byte> octetStringContents = GetOctetStringContents(source, ruleSet, expectedTag ?? Asn1Tag.GeneralizedTime, UniversalTagNumber.GeneralizedTime, out bytesConsumed2, ref rented, tmpSpace); DateTimeOffset result = ParseGeneralizedTime(ruleSet, octetStringContents); if (rented != null) { System.Security.Cryptography.CryptoPool.Return(rented, octetStringContents.Length); } bytesConsumed = bytesConsumed2; return result; } private static DateTimeOffset ParseGeneralizedTime(AsnEncodingRules ruleSet, ReadOnlySpan<byte> contentOctets) { bool flag = ruleSet == AsnEncodingRules.DER || ruleSet == AsnEncodingRules.CER; if (flag && contentOctets.Length < 15) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } if (contentOctets.Length < 10) { throw new AsnContentException(); } ReadOnlySpan<byte> data = contentOctets; int year = ParseNonNegativeIntAndSlice(ref data, 4); int month = ParseNonNegativeIntAndSlice(ref data, 2); int day = ParseNonNegativeIntAndSlice(ref data, 2); int hour = ParseNonNegativeIntAndSlice(ref data, 2); int? num = null; int? num2 = null; ulong value = 0uL; ulong num3 = 1uL; byte b = byte.MaxValue; TimeSpan? timeSpan = null; bool flag2 = false; byte b2 = 0; while (b2 == 0 && data.Length != 0) { byte? b3 = GetNextState(data[0]); if (!b3.HasValue) { if (!num.HasValue) { num = ParseNonNegativeIntAndSlice(ref data, 2); continue; } if (num2.HasValue) { throw new AsnContentException(); } num2 = ParseNonNegativeIntAndSlice(ref data, 2); } else { b2 = b3.Value; } } if (b2 == 1) { switch (data[0]) { case 44: if (flag) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } break; default: throw new AsnContentException(); case 46: break; } data = data.Slice(1); if (data.IsEmpty) { throw new AsnContentException(); } if (!Utf8Parser.TryParse(SliceAtMost(data, 12), out value, out int bytesConsumed, '\0') || bytesConsumed == 0) { throw new AsnContentException(); } b = (byte)(value % 10); for (int i = 0; i < bytesConsumed; i++) { num3 *= 10; } data = data.Slice(bytesConsumed); uint value2; while (Utf8Parser.TryParse(SliceAtMost(data, 9), out value2, out bytesConsumed, '\0')) { data = data.Slice(bytesConsumed); b = (byte)(value2 % 10); } if (data.Length != 0) { byte? b4 = GetNextState(data[0]); if (!b4.HasValue) { throw new AsnContentException(); } b2 = b4.Value; } } if (b2 == 2) { byte b5 = data[0]; data = data.Slice(1); if (b5 == 90) { timeSpan = TimeSpan.Zero; flag2 = true; } else { bool flag3 = b5 switch { 43 => false, 45 => true, _ => throw new AsnContentException(), }; if (data.IsEmpty) { throw new AsnContentException(); } int hours = ParseNonNegativeIntAndSlice(ref data, 2); int num4 = 0; if (data.Length != 0) { num4 = ParseNonNegativeIntAndSlice(ref data, 2); } if (num4 > 59) { throw new AsnContentException(); } TimeSpan timeSpan2 = new TimeSpan(hours, num4, 0); if (flag3) { timeSpan2 = -timeSpan2; } timeSpan = timeSpan2; } } if (!data.IsEmpty) { throw new AsnContentException(); } if (flag) { if (!flag2 || !num2.HasValue) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } if (b == 0) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } } double num5 = (double)value / (double)num3; TimeSpan timeSpan3 = TimeSpan.Zero; if (!num.HasValue) { num = 0; num2 = 0; if (value != 0L) { timeSpan3 = new TimeSpan((long)(num5 * 36000000000.0)); } } else if (!num2.HasValue) { num2 = 0; if (value != 0L) { timeSpan3 = new TimeSpan((long)(num5 * 600000000.0)); } } else if (value != 0L) { timeSpan3 = new TimeSpan((long)(num5 * 10000000.0)); } try { DateTimeOffset dateTimeOffset = (timeSpan.HasValue ? new DateTimeOffset(year, month, day, hour, num.Value, num2.Value, timeSpan.Value) : new DateTimeOffset(new DateTime(year, month, day, hour, num.Value, num2.Value))); return dateTimeOffset + timeSpan3; } catch (Exception inner) { throw new AsnContentException(System.SR.ContentException_DefaultMessage, inner); } static byte? GetNextState(byte octet) { switch (octet) { case 43: case 45: case 90: return 2; case 44: case 46: return 1; default: return null; } } } public static ReadOnlySpan<byte> ReadIntegerBytes(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { return GetIntegerContents(source, ruleSet, expectedTag ?? Asn1Tag.Integer, UniversalTagNumber.Integer, out bytesConsumed); } public static BigInteger ReadInteger(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { int bytesConsumed2; ReadOnlySpan<byte> readOnlySpan = ReadIntegerBytes(source, ruleSet, out bytesConsumed2, expectedTag); byte[] array = System.Security.Cryptography.CryptoPool.Rent(readOnlySpan.Length); BigInteger result; try { byte value = (byte)(((readOnlySpan[0] & 0x80u) != 0) ? byte.MaxValue : 0); array.AsSpan(readOnlySpan.Length, array.Length - readOnlySpan.Length).Fill(value); readOnlySpan.CopyTo(array); array.AsSpan(0, readOnlySpan.Length).Reverse(); result = new BigInteger(array); } finally { System.Security.Cryptography.CryptoPool.Return(array); } bytesConsumed = bytesConsumed2; return result; } public static bool TryReadInt32(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int value, out int bytesConsumed, Asn1Tag? expectedTag = null) { if (TryReadSignedInteger(source, ruleSet, 4, expectedTag ?? Asn1Tag.Integer, UniversalTagNumber.Integer, out var value2, out bytesConsumed)) { value = (int)value2; return true; } value = 0; return false; } [CLSCompliant(false)] public static bool TryReadUInt32(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out uint value, out int bytesConsumed, Asn1Tag? expectedTag = null) { if (TryReadUnsignedInteger(source, ruleSet, 4, expectedTag ?? Asn1Tag.Integer, UniversalTagNumber.Integer, out var value2, out bytesConsumed)) { value = (uint)value2; return true; } value = 0u; return false; } public static bool TryReadInt64(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out long value, out int bytesConsumed, Asn1Tag? expectedTag = null) { return TryReadSignedInteger(source, ruleSet, 8, expectedTag ?? Asn1Tag.Integer, UniversalTagNumber.Integer, out value, out bytesConsumed); } [CLSCompliant(false)] public static bool TryReadUInt64(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out ulong value, out int bytesConsumed, Asn1Tag? expectedTag = null) { return TryReadUnsignedInteger(source, ruleSet, 8, expectedTag ?? Asn1Tag.Integer, UniversalTagNumber.Integer, out value, out bytesConsumed); } private static ReadOnlySpan<byte> GetIntegerContents(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Asn1Tag expectedTag, UniversalTagNumber tagNumber, out int bytesConsumed) { int bytesConsumed2; ReadOnlySpan<byte> primitiveContentSpan = GetPrimitiveContentSpan(source, ruleSet, expectedTag, tagNumber, out bytesConsumed2); if (primitiveContentSpan.IsEmpty) { throw new AsnContentException(); } if (BinaryPrimitives.TryReadUInt16BigEndian(primitiveContentSpan, out var value)) { ushort num = (ushort)(value & 0xFF80u); if (num == 0 || num == 65408) { throw new AsnContentException(); } } bytesConsumed = bytesConsumed2; return primitiveContentSpan; } private static bool TryReadSignedInteger(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, int sizeLimit, Asn1Tag expectedTag, UniversalTagNumber tagNumber, out long value, out int bytesConsumed) { int bytesConsumed2; ReadOnlySpan<byte> integerContents = GetIntegerContents(source, ruleSet, expectedTag, tagNumber, out bytesConsumed2); if (integerContents.Length > sizeLimit) { value = 0L; bytesConsumed = 0; return false; } long num = (((integerContents[0] & 0x80u) != 0) ? (-1) : 0); for (int i = 0; i < integerContents.Length; i++) { num <<= 8; num |= integerContents[i]; } bytesConsumed = bytesConsumed2; value = num; return true; } private static bool TryReadUnsignedInteger(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, int sizeLimit, Asn1Tag expectedTag, UniversalTagNumber tagNumber, out ulong value, out int bytesConsumed) { int bytesConsumed2; ReadOnlySpan<byte> readOnlySpan = GetIntegerContents(source, ruleSet, expectedTag, tagNumber, out bytesConsumed2); if ((readOnlySpan[0] & 0x80u) != 0) { bytesConsumed = 0; value = 0uL; return false; } if (readOnlySpan.Length > 1 && readOnlySpan[0] == 0) { readOnlySpan = readOnlySpan.Slice(1); } if (readOnlySpan.Length > sizeLimit) { bytesConsumed = 0; value = 0uL; return false; } ulong num = 0uL; for (int i = 0; i < readOnlySpan.Length; i++) { num <<= 8; num |= readOnlySpan[i]; } bytesConsumed = bytesConsumed2; value = num; return true; } public static TFlagsEnum ReadNamedBitListValue<TFlagsEnum>(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) where TFlagsEnum : Enum { Type typeFromHandle = typeof(TFlagsEnum); int bytesConsumed2; TFlagsEnum result = (TFlagsEnum)Enum.ToObject(typeFromHandle, ReadNamedBitListValue(source, ruleSet, typeFromHandle, out bytesConsumed2, expectedTag)); bytesConsumed = bytesConsumed2; return result; } public static Enum ReadNamedBitListValue(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Type flagsEnumType, out int bytesConsumed, Asn1Tag? expectedTag = null) { if (flagsEnumType == null) { throw new ArgumentNullException("flagsEnumType"); } Type enumUnderlyingType = flagsEnumType.GetEnumUnderlyingType(); if (!flagsEnumType.IsDefined(typeof(FlagsAttribute), inherit: false)) { throw new ArgumentException(System.SR.Argument_NamedBitListRequiresFlagsEnum, "flagsEnumType"); } Span<byte> destination = stackalloc byte[8]; destination = destination[..GetPrimitiveIntegerSize(enumUnderlyingType)]; if (!TryReadBitString(source, destination, ruleSet, out var unusedBitCount, out var bytesConsumed2, out var bytesWritten, expectedTag)) { throw new AsnContentException(System.SR.Format(System.SR.ContentException_NamedBitListValueTooBig, flagsEnumType.Name)); } Enum result; if (bytesWritten == 0) { result = (Enum)Enum.ToObject(flagsEnumType, 0); bytesConsumed = bytesConsumed2; return result; } ReadOnlySpan<byte> valueSpan = destination.Slice(0, bytesWritten); if (ruleSet == AsnEncodingRules.DER || ruleSet == AsnEncodingRules.CER) { byte b = valueSpan[bytesWritten - 1]; byte b2 = (byte)(1 << unusedBitCount); if ((b & b2) == 0) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } } result = (Enum)Enum.ToObject(flagsEnumType, InterpretNamedBitListReversed(valueSpan)); bytesConsumed = bytesConsumed2; return result; } public static BitArray ReadNamedBitList(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { int contentOffset; int contentLength; int bytesConsumed2; Asn1Tag tag = ReadEncodedValue(source, ruleSet, out contentOffset, out contentLength, out bytesConsumed2); if (expectedTag.HasValue) { CheckExpectedTag(tag, expectedTag.Value, UniversalTagNumber.BitString); } byte[] array = System.Security.Cryptography.CryptoPool.Rent(contentLength); if (!TryReadBitString(source, array, ruleSet, out var unusedBitCount, out var bytesConsumed3, out var bytesWritten, expectedTag)) { throw new InvalidOperationException(); } int length = checked(bytesWritten * 8 - unusedBitCount); Span<byte> value = array.AsSpan(0, bytesWritten); ReverseBitsPerByte(value); BitArray bitArray = new BitArray(array); System.Security.Cryptography.CryptoPool.Return(array, bytesWritten); bitArray.Length = length; bytesConsumed = bytesConsumed3; return bitArray; } private static long InterpretNamedBitListReversed(ReadOnlySpan<byte> valueSpan) { long num = 0L; long num2 = 1L; for (int i = 0; i < valueSpan.Length; i++) { byte b = valueSpan[i]; for (int num3 = 7; num3 >= 0; num3--) { int num4 = 1 << num3; if ((b & num4) != 0) { num |= num2; } num2 <<= 1; } } return num; } internal static void ReverseBitsPerByte(Span<byte> value) { for (int i = 0; i < value.Length; i++) { value[i] = (byte)((ulong)((value[i] * 8623620610L) & 0x10884422010L) % 1023uL); } } public static void ReadNull(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { if (GetPrimitiveContentSpan(source, ruleSet, expectedTag ?? Asn1Tag.Null, UniversalTagNumber.Null, out var bytesConsumed2).Length != 0) { throw new AsnContentException(); } bytesConsumed = bytesConsumed2; } public static bool TryReadOctetString(ReadOnlySpan<byte> source, Span<byte> destination, AsnEncodingRules ruleSet, out int bytesConsumed, out int bytesWritten, Asn1Tag? expectedTag = null) { if (source.Overlaps(destination)) { throw new ArgumentException(System.SR.Argument_SourceOverlapsDestination, "destination"); } if (TryReadPrimitiveOctetStringCore(source, ruleSet, expectedTag ?? Asn1Tag.PrimitiveOctetString, UniversalTagNumber.OctetString, out var contentLength, out var headerLength, out var contents, out var bytesConsumed2)) { if (contents.Length > destination.Length) { bytesWritten = 0; bytesConsumed = 0; return false; } contents.CopyTo(destination); bytesWritten = contents.Length; bytesConsumed = bytesConsumed2; return true; } int bytesRead; bool flag = TryCopyConstructedOctetStringContents(Slice(source, headerLength, contentLength), ruleSet, destination, !contentLength.HasValue, out bytesRead, out bytesWritten); if (flag) { bytesConsumed = headerLength + bytesRead; } else { bytesConsumed = 0; } return flag; } public static byte[] ReadOctetString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { byte[] rented = null; int bytesConsumed2; ReadOnlySpan<byte> octetStringContents = GetOctetStringContents(source, ruleSet, expectedTag ?? Asn1Tag.PrimitiveOctetString, UniversalTagNumber.OctetString, out bytesConsumed2, ref rented); byte[] result = octetStringContents.ToArray(); if (rented != null) { System.Security.Cryptography.CryptoPool.Return(rented, octetStringContents.Length); } bytesConsumed = bytesConsumed2; return result; } private static bool TryReadPrimitiveOctetStringCore(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Asn1Tag expectedTag, UniversalTagNumber universalTagNumber, out int? contentLength, out int headerLength, out ReadOnlySpan<byte> contents, out int bytesConsumed) { Asn1Tag tag = ReadTagAndLength(source, ruleSet, out contentLength, out headerLength); CheckExpectedTag(tag, expectedTag, universalTagNumber); ReadOnlySpan<byte> readOnlySpan = Slice(source, headerLength, contentLength); if (tag.IsConstructed) { if (ruleSet == AsnEncodingRules.DER) { throw new AsnContentException(System.SR.ContentException_InvalidUnderDer_TryBerOrCer); } contents = default(ReadOnlySpan<byte>); bytesConsumed = 0; return false; } if (ruleSet == AsnEncodingRules.CER && readOnlySpan.Length > 1000) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCer_TryBerOrDer); } contents = readOnlySpan; bytesConsumed = headerLength + readOnlySpan.Length; return true; } public static bool TryReadPrimitiveOctetString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out ReadOnlySpan<byte> value, out int bytesConsumed, Asn1Tag? expectedTag = null) { int? contentLength; int headerLength; return TryReadPrimitiveOctetStringCore(source, ruleSet, expectedTag ?? Asn1Tag.PrimitiveOctetString, UniversalTagNumber.OctetString, out contentLength, out headerLength, out value, out bytesConsumed); } private static int CountConstructedOctetString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, bool isIndefinite) { int bytesRead; int num = CopyConstructedOctetString(source, ruleSet, Span<byte>.Empty, write: false, isIndefinite, out bytesRead); if (ruleSet == AsnEncodingRules.CER && num <= 1000) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } return num; } private static void CopyConstructedOctetString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Span<byte> destination, bool isIndefinite, out int bytesRead, out int bytesWritten) { bytesWritten = CopyConstructedOctetString(source, ruleSet, destination, write: true, isIndefinite, out bytesRead); } private static int CopyConstructedOctetString(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Span<byte> destination, bool write, bool isIndefinite, out int bytesRead) { bytesRead = 0; int num = 1000; ReadOnlySpan<byte> readOnlySpan = source; Stack<(int, int, bool, int)> stack = null; int num2 = 0; Asn1Tag asn1Tag = Asn1Tag.ConstructedBitString; Span<byte> destination2 = destination; while (true) { if (!readOnlySpan.IsEmpty) { asn1Tag = ReadTagAndLength(readOnlySpan, ruleSet, out var contentsLength, out var bytesRead2); if (asn1Tag == Asn1Tag.PrimitiveOctetString) { if (ruleSet == AsnEncodingRules.CER && num != 1000) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } ReadOnlySpan<byte> readOnlySpan2 = Slice(readOnlySpan, bytesRead2, contentsLength.Value); int num3 = bytesRead2 + readOnlySpan2.Length; readOnlySpan = readOnlySpan.Slice(num3); bytesRead += num3; num2 += readOnlySpan2.Length; num = readOnlySpan2.Length; if (ruleSet == AsnEncodingRules.CER && num > 1000) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } if (write) { readOnlySpan2.CopyTo(destination2); destination2 = destination2.Slice(readOnlySpan2.Length); } continue; } if (!(asn1Tag == Asn1Tag.EndOfContents && isIndefinite)) { if (asn1Tag == Asn1Tag.ConstructedOctetString) { if (ruleSet == AsnEncodingRules.CER) { throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer); } if (stack == null) { stack = new Stack<(int, int, bool, int)>(); } if (!source.Overlaps(readOnlySpan, out var elementOffset)) { throw new AsnContentException(); } stack.Push((elementOffset, readOnlySpan.Length, isIndefinite, bytesRead)); readOnlySpan = Slice(readOnlySpan, bytesRead2, contentsLength); bytesRead = bytesRead2; isIndefinite = !contentsLength.HasValue; continue; } throw new AsnContentException(); } ValidateEndOfContents(asn1Tag, contentsLength, bytesRead2); bytesRead += bytesRead2; if (stack != null && stack.Count > 0) { (int, int, bool, int) tuple = stack.Pop(); int item = tuple.Item1; int item2 = tuple.Item2; bool item3 = tuple.Item3; int item4 = tuple.Item4; readOnlySpan = source.Slice(item, item2).Slice(bytesRead); bytesRead += item4; isIndefinite = item3; continue; } } if (isIndefinite && asn1Tag != Asn1Tag.EndOfContents) { throw new AsnContentException(); } if (stack == null || stack.Count <= 0) { break; } (int, int, bool, int) tuple2 = stack.Pop(); int item5 = tuple2.Item1; int item6 = tuple2.Item2; bool item7 = tuple2.Item3; int item8 = tuple2.Item4; readOnlySpan = source.Slice(item5, item6).Slice(bytesRead); isIndefinite = item7; bytesRead += item8; } return num2; } private static bool TryCopyConstructedOctetStringContents(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Span<byte> dest, bool isIndefinite, out int bytesRead, out int bytesWritten) { bytesRead = 0; int num = CountConstructedOctetString(source, ruleSet, isIndefinite); if (dest.Length < num) { bytesWritten = 0; return false; } CopyConstructedOctetString(source, ruleSet, dest, isIndefinite, out bytesRead, out bytesWritten); return true; } private static ReadOnlySpan<byte> GetOctetStringContents(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, Asn1Tag expectedTag, UniversalTagNumber universalTagNumber, out int bytesConsumed, ref byte[] rented, Span<byte> tmpSpace = default(Span<byte>)) { if (TryReadPrimitiveOctetStringCore(source, ruleSet, expectedTag, universalTagNumber, out var contentLength, out var headerLength, out var contents, out bytesConsumed)) { return contents; } contents = source.Slice(headerLength); int num = contentLength ?? SeekEndOfContents(contents, ruleSet); if (tmpSpace.Length > 0 && num > tmpSpace.Length) { bool isIndefinite = !contentLength.HasValue; num = CountConstructedOctetString(contents, ruleSet, isIndefinite); } if (num > tmpSpace.Length) { rented = System.Security.Cryptography.CryptoPool.Rent(num); tmpSpace = rented; } if (TryCopyConstructedOctetStringContents(Slice(source, headerLength, contentLength), ruleSet, tmpSpace, !contentLength.HasValue, out var bytesRead, out var bytesWritten)) { bytesConsumed = headerLength + bytesRead; return tmpSpace.Slice(0, bytesWritten); } throw new AsnContentException(); } public static string ReadObjectIdentifier(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int bytesConsumed, Asn1Tag? expectedTag = null) { int bytesConsumed2; ReadOnlySpan<byte> primitiveContentSpan = GetPrimitiveContentSpan(source, ruleSet, expectedTag ?? Asn1Tag.ObjectIdentifier, UniversalTagNumber.ObjectIdentifier, out bytesConsumed2); string result = ReadObjectIdentifier(primitiveContentSpan); bytesConsumed = bytesConsumed2; return result; } private static void ReadSubIdentifier(ReadOnlySpan<byte> source, out int bytesRead, out long? smallValue, out BigInteger? largeValue) { if (source[0] == 128) { throw new AsnContentException(); } byte b = source[0]; int num = ((b >= 136) ? ((b >= 160) ? ((b < 192) ? (-1) : 0) : ((b < 144) ? (-3) : (-2))) : ((b >= 130) ? ((b < 132) ? (-5) : (-4)) : ((b >= 129) ? (-6) : 0))); int num2 = num; int num3 = -1; int i; for (i = 0; i < source.Length; i++) { bool flag = (source[i] & 0x80) == 0; if (!System.LocalAppContextSwitches.AllowAnySizeOid) { num2 += 7; if (num2 > 128) { throw new AsnContentException(System.SR.ContentException_OidTooBig); } } if (flag) { num3 = i; break; } } if (num3 < 0) { throw new AsnContentException(); } bytesRead = num3 + 1; long num4 = 0L; if (bytesRead <= 9) { for (i = 0; i < bytesRead; i++) { byte b2 = source[i]; num4 <<= 7; num4 |= (byte)(b2 & 0x7F); } largeValue = null; smallValue = num4; return; } int num5 = (bytesRead / 8 + 1) * 7; byte[] array = System.Security.Cryptography.CryptoPool.Rent(num5); Array.Clear(array, 0, array.Length); Span<byte> destination = array; Span<byte> destination2 = stackalloc byte[8]; int num6 = bytesRead; i = bytesRead - 8; while (num6 > 0) { byte b3 = source[i]; num4 <<= 7; num4 |= (byte)(b3 & 0x7F); i++; if (i >= num6) { BinaryPrimitives.WriteInt64LittleEndian(destination2, num4); destination2.Slice(0, 7).CopyTo(destination); destination = destination.Slice(7); num4 = 0L; num6 -= 8; i = Math.Max(0, num6 - 8); } } int num7 = array.Length - destination.Length; int num8 = num5 - num7; largeValue = new BigInteger(array); smallValue = null; System.Security.Cryptography.CryptoPool.Return(array, num7); } private static string ReadObjectIdentifier(ReadOnlySpan<byte> contents) { if (contents.Length < 1) { throw new AsnContentException(); } StringBuilder stringBuilder = new StringBuilder((byte)contents.Length * 4); ReadSubIdentifier(contents, out var bytesRead, out var smallValue, out var largeValue); if (smallValue.HasValue) { long num = smallValue.Value; byte value; if (num < 40) { value = 0; } else if (num < 80) { value = 1; num -= 40; } else { value = 2; num -= 80; } stringBuilder.Append(value); stringBuilder.Append('.'); stringBuilder.Append(num); } else { BigInteger value2 = largeValue.Value; byte value = 2; value2 -= (BigInteger)80; stringBuilder.Append(value); stringBuilder.Append('.'); stringBuilder.Append(value2.ToString()); } contents = contents.Slice(bytesRead); int num2 = 62; while (!contents.IsEmpty) { if (!System.LocalAppContextSwitches.AllowAnySizeOid) { if (num2 <= 0) { throw new AsnContentException(System.SR.ContentException_OidTooBig); } num2--; } ReadSubIdentifier(contents, out bytesRead, out smallValue, out largeValue); stringBuilder.Append('.'); if (smallValue.HasValue) { stringBuilder.Append(smallValue.Value); } else { stringBuilder.Append(largeValue.Value.ToString()); } contents = contents.Slice(bytesRead); } return stringBuilder.ToString(); } public static void ReadSequence(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int contentOffset, out int contentLength, out int bytesConsumed, Asn1Tag? expectedTag = null) { int? contentsLength; int bytesRead; Asn1Tag tag = ReadTagAndLength(source, ruleSet, out contentsLength, out bytesRead); CheckExpectedTag(tag, expectedTag ?? Asn1Tag.Sequence, UniversalTagNumber.Sequence); if (!tag.IsConstructed) { throw new AsnContentException(System.SR.Format(System.SR.ContentException_ConstructedEncodingRequired, UniversalTagNumber.Sequence)); } if (contentsLength.HasValue) { if (contentsLength.Value + bytesRead > source.Length) { throw GetValidityException(LengthValidity.LengthExceedsInput); } contentLength = contentsLength.Value; contentOffset = bytesRead; bytesConsumed = contentLength + bytesRead; } else { int num = (contentLength = SeekEndOfContents(source.Slice(bytesRead), ruleSet)); contentOffset = bytesRead; bytesConsumed = num + bytesRead + 2; } } public static void ReadSetOf(ReadOnlySpan<byte> source, AsnEncodingRules ruleSet, out int contentOffset, out int contentLength, out int bytesConsumed, bool skipSortOrderValidation = false, Asn1Tag? expectedTag = null) { int? contentsLength; int bytesRead; Asn1Tag tag = ReadTagAndLength(source, ruleSet, out contentsLength, out bytesRead); CheckExpectedTag(tag, expectedTag ?? Asn1Tag.SetOf, UniversalTagNumber.Set); if (!tag.IsConstructed) { throw new AsnContentException(System.SR.Format(System.SR.ContentException_ConstructedEncodingRequired, UniversalTagNumber.Set)); } int num; ReadOnlySpan<byte> readOnlySpan; if (contentsLength.HasValue) { num = 0; readOnlySpan = Slice(source, bytesRead, contentsLength.Value); } else { int length = SeekEndOfContents(source.Slice(bytesRead), ruleSet); readOnlySpan = Slice(source, bytesRead, length); num = 2; } if (!skipSortOrderValidation && (ruleSet == AsnEncodingRules.DER || ruleSet == AsnEncodingRules.CER)) { ReadOnlySpan<byte> source2 = readOnlySpan; ReadOnlySpan<byte> y = default(ReadOnlySpan<byte>); while (!source2.IsEmpty) { ReadEncodedValue(source2, ruleSet, out var _, out var _, out var bytesConsumed2); ReadOnlySpan<byte> readOnlySpan2 = source2.Slice(0, bytesConsumed2); source2 = source2.Slice(bytesConsumed2); if (SetOfValueComparer.Compare(readOnlySpan2, y) < 0) { throw new AsnContentException(System.SR.ContentE