Decompiled source of System Security Cryptography Pkcs v8.0.0

BepInEx/core/System.Security.Cryptography.Pkcs/netstandard2.1/System.Security.Cryptography.Pkcs.dll

Decompiled 7 months ago
using System;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Formats.Asn1;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.Asn1;
using System.Security.Cryptography.Asn1.Pkcs12;
using System.Security.Cryptography.Asn1.Pkcs7;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.Pkcs.Asn1;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using FxResources.System.Security.Cryptography.Pkcs;
using Internal.Cryptography;
using Internal.Cryptography.Pal.AnyOS;
using Microsoft.CodeAnalysis;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyMetadata("Serviceable", "True")]
[assembly: AssemblyMetadata("PreferInbox", "True")]
[assembly: AssemblyDefaultAlias("System.Security.Cryptography.Pkcs")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: CLSCompliant(true)]
[assembly: AssemblyMetadata("IsTrimmable", "True")]
[assembly: UnsupportedOSPlatform("browser")]
[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.System32 | DllImportSearchPath.AssemblyDirectory)]
[assembly: AssemblyCompany("Microsoft Corporation")]
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
[assembly: AssemblyDescription("Provides support for PKCS and CMS algorithms.\r\n\r\nCommonly Used Types:\r\nSystem.Security.Cryptography.Pkcs.EnvelopedCms")]
[assembly: AssemblyFileVersion("8.0.23.53103")]
[assembly: AssemblyInformationalVersion("8.0.0+5535e31a712343a63f5d7d796cd874e563e5ac14")]
[assembly: AssemblyProduct("Microsoft® .NET")]
[assembly: AssemblyTitle("System.Security.Cryptography.Pkcs")]
[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]
	[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.Security.Cryptography.Pkcs
{
	internal static class SR
	{
	}
}
namespace Internal.Cryptography
{
	internal abstract class DecryptorPal : IDisposable
	{
		public RecipientInfoCollection RecipientInfos { get; }

		internal DecryptorPal(RecipientInfoCollection recipientInfos)
		{
			RecipientInfos = recipientInfos;
		}

		public abstract ContentInfo TryDecrypt(RecipientInfo recipientInfo, X509Certificate2 cert, AsymmetricAlgorithm privateKey, X509Certificate2Collection originatorCerts, X509Certificate2Collection extraStore, out Exception exception);

		public abstract void Dispose();
	}
	internal abstract class KeyAgreeRecipientInfoPal : RecipientInfoPal
	{
		public abstract DateTime Date { get; }

		public abstract SubjectIdentifierOrKey OriginatorIdentifierOrKey { get; }

		public abstract CryptographicAttributeObject OtherKeyAttribute { get; }

		internal KeyAgreeRecipientInfoPal()
		{
		}
	}
	internal static class KeyLengths
	{
		public const int Rc2_40Bit = 40;

		public const int Rc2_56Bit = 56;

		public const int Rc2_64Bit = 64;

		public const int Rc2_128Bit = 128;

		public const int Rc4Max_128Bit = 128;

		public const int Des_64Bit = 64;

		public const int TripleDes_192Bit = 192;

		public const int DefaultKeyLengthForRc2AndRc4 = 128;
	}
	internal abstract class KeyTransRecipientInfoPal : RecipientInfoPal
	{
		internal KeyTransRecipientInfoPal()
		{
		}
	}
	internal static class PkcsHelpers
	{
		private static readonly bool s_oidIsInitOnceOnly = DetectInitOnlyOid();

		private static bool DetectInitOnlyOid()
		{
			Oid oid = new Oid("2.16.840.1.101.3.4.2.1", null);
			try
			{
				oid.Value = "2.16.840.1.101.3.4.2.2";
				return false;
			}
			catch (PlatformNotSupportedException)
			{
				return true;
			}
		}

		internal static HashAlgorithmName GetDigestAlgorithm(Oid oid)
		{
			return GetDigestAlgorithm(oid.Value);
		}

		internal static HashAlgorithmName GetDigestAlgorithm(string oidValue, bool forVerification = false)
		{
			switch (oidValue)
			{
			case "1.2.840.113549.1.1.4":
				if (!forVerification)
				{
					break;
				}
				goto case "1.2.840.113549.2.5";
			case "1.2.840.113549.2.5":
				return HashAlgorithmName.MD5;
			case "1.2.840.113549.1.1.5":
				if (!forVerification)
				{
					break;
				}
				goto case "1.3.14.3.2.26";
			case "1.3.14.3.2.26":
				return HashAlgorithmName.SHA1;
			case "1.2.840.113549.1.1.11":
				if (!forVerification)
				{
					break;
				}
				goto case "2.16.840.1.101.3.4.2.1";
			case "2.16.840.1.101.3.4.2.1":
				return HashAlgorithmName.SHA256;
			case "1.2.840.113549.1.1.12":
				if (!forVerification)
				{
					break;
				}
				goto case "2.16.840.1.101.3.4.2.2";
			case "2.16.840.1.101.3.4.2.2":
				return HashAlgorithmName.SHA384;
			case "1.2.840.113549.1.1.13":
				if (!forVerification)
				{
					break;
				}
				goto case "2.16.840.1.101.3.4.2.3";
			case "2.16.840.1.101.3.4.2.3":
				return HashAlgorithmName.SHA512;
			}
			throw new CryptographicException(System.SR.Cryptography_UnknownHashAlgorithm, oidValue);
		}

		internal static string GetOidFromHashAlgorithm(HashAlgorithmName algName)
		{
			if (algName == HashAlgorithmName.MD5)
			{
				return "1.2.840.113549.2.5";
			}
			if (algName == HashAlgorithmName.SHA1)
			{
				return "1.3.14.3.2.26";
			}
			if (algName == HashAlgorithmName.SHA256)
			{
				return "2.16.840.1.101.3.4.2.1";
			}
			if (algName == HashAlgorithmName.SHA384)
			{
				return "2.16.840.1.101.3.4.2.2";
			}
			if (algName == HashAlgorithmName.SHA512)
			{
				return "2.16.840.1.101.3.4.2.3";
			}
			throw new CryptographicException(System.SR.Cryptography_Cms_UnknownAlgorithm, algName.Name);
		}

		public static byte[] Resize(this byte[] a, int size)
		{
			Array.Resize(ref a, size);
			return a;
		}

		public static void RemoveAt<T>(ref T[] arr, int idx)
		{
			if (arr.Length == 1)
			{
				arr = Array.Empty<T>();
				return;
			}
			T[] array = new T[arr.Length - 1];
			if (idx != 0)
			{
				Array.Copy(arr, array, idx);
			}
			if (idx < array.Length)
			{
				Array.Copy(arr, idx + 1, array, idx, array.Length - idx);
			}
			arr = array;
		}

		public static System.Security.Cryptography.Asn1.AttributeAsn[] NormalizeAttributeSet(System.Security.Cryptography.Asn1.AttributeAsn[] setItems, Action<byte[]> encodedValueProcessor = null)
		{
			AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
			asnWriter.PushSetOf();
			foreach (System.Security.Cryptography.Asn1.AttributeAsn attributeAsn in setItems)
			{
				attributeAsn.Encode(asnWriter);
			}
			asnWriter.PopSetOf();
			byte[] array = asnWriter.Encode();
			encodedValueProcessor?.Invoke(array);
			try
			{
				System.Formats.Asn1.AsnValueReader reader = new System.Formats.Asn1.AsnValueReader(array, AsnEncodingRules.DER).ReadSetOf();
				System.Security.Cryptography.Asn1.AttributeAsn[] array2 = new System.Security.Cryptography.Asn1.AttributeAsn[setItems.Length];
				int num = 0;
				while (reader.HasData)
				{
					System.Security.Cryptography.Asn1.AttributeAsn.Decode(ref reader, array, out var decoded);
					array2[num] = decoded;
					num++;
				}
				return array2;
			}
			catch (AsnContentException inner)
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
			}
		}

		internal static byte[] EncodeContentInfo(ReadOnlyMemory<byte> content, string contentType, AsnEncodingRules ruleSet = AsnEncodingRules.DER)
		{
			System.Security.Cryptography.Asn1.Pkcs7.ContentInfoAsn contentInfoAsn = default(System.Security.Cryptography.Asn1.Pkcs7.ContentInfoAsn);
			contentInfoAsn.ContentType = contentType;
			contentInfoAsn.Content = content;
			System.Security.Cryptography.Asn1.Pkcs7.ContentInfoAsn contentInfoAsn2 = contentInfoAsn;
			AsnWriter asnWriter = new AsnWriter(ruleSet);
			contentInfoAsn2.Encode(asnWriter);
			return asnWriter.Encode();
		}

		public static CmsRecipientCollection DeepCopy(this CmsRecipientCollection recipients)
		{
			CmsRecipientCollection cmsRecipientCollection = new CmsRecipientCollection();
			CmsRecipientEnumerator enumerator = recipients.GetEnumerator();
			while (enumerator.MoveNext())
			{
				CmsRecipient current = enumerator.Current;
				X509Certificate2 certificate = current.Certificate;
				X509Certificate2 certificate2 = new X509Certificate2(certificate.Handle);
				CmsRecipient recipient = (((object)current.RSAEncryptionPadding != null) ? new CmsRecipient(current.RecipientIdentifierType, certificate2, current.RSAEncryptionPadding) : new CmsRecipient(current.RecipientIdentifierType, certificate2));
				cmsRecipientCollection.Add(recipient);
				GC.KeepAlive(certificate);
			}
			return cmsRecipientCollection;
		}

		public static byte[] UnicodeToOctetString(this string s)
		{
			byte[] array = new byte[2 * (s.Length + 1)];
			Encoding.Unicode.GetBytes(s, 0, s.Length, array, 0);
			return array;
		}

		public static string OctetStringToUnicode(this byte[] octets)
		{
			if (octets.Length < 2)
			{
				return string.Empty;
			}
			int num = octets.Length;
			int num2 = num - 1;
			for (int i = 0; i < num2; i += 2)
			{
				if (octets[i] == 0 && octets[i + 1] == 0)
				{
					num = i;
					break;
				}
			}
			return Encoding.Unicode.GetString(octets, 0, num);
		}

		public static X509Certificate2Collection GetStoreCertificates(StoreName storeName, StoreLocation storeLocation, bool openExistingOnly)
		{
			using X509Store x509Store = new X509Store(storeName, storeLocation);
			OpenFlags openFlags = OpenFlags.IncludeArchived;
			if (openExistingOnly)
			{
				openFlags |= OpenFlags.OpenExistingOnly;
			}
			x509Store.Open(openFlags);
			return x509Store.Certificates;
		}

		public static X509Certificate2 TryFindMatchingCertificate(this X509Certificate2Collection certs, SubjectIdentifier recipientIdentifier)
		{
			switch (recipientIdentifier.Type)
			{
			case SubjectIdentifierType.IssuerAndSerialNumber:
			{
				X509IssuerSerial x509IssuerSerial = (X509IssuerSerial)recipientIdentifier.Value;
				byte[] ba2 = x509IssuerSerial.SerialNumber.ToSerialBytes();
				string issuerName = x509IssuerSerial.IssuerName;
				X509Certificate2Enumerator enumerator2 = certs.GetEnumerator();
				while (enumerator2.MoveNext())
				{
					X509Certificate2 current2 = enumerator2.Current;
					byte[] serialNumber = current2.GetSerialNumber();
					if (AreByteArraysEqual(serialNumber, ba2) && current2.Issuer == issuerName)
					{
						return current2;
					}
				}
				break;
			}
			case SubjectIdentifierType.SubjectKeyIdentifier:
			{
				string skiString = (string)recipientIdentifier.Value;
				byte[] ba = skiString.ToSkiBytes();
				X509Certificate2Enumerator enumerator = certs.GetEnumerator();
				while (enumerator.MoveNext())
				{
					X509Certificate2 current = enumerator.Current;
					byte[] subjectKeyIdentifier = PkcsPal.Instance.GetSubjectKeyIdentifier(current);
					if (AreByteArraysEqual(ba, subjectKeyIdentifier))
					{
						return current;
					}
				}
				break;
			}
			default:
				throw new CryptographicException();
			}
			return null;
		}

		internal static bool AreByteArraysEqual(byte[] ba1, byte[] ba2)
		{
			return ba1.AsSpan().SequenceEqual(ba2.AsSpan());
		}

		internal static byte[] ToSkiBytes(this string skiString)
		{
			return skiString.UpperHexStringToByteArray();
		}

		public static string ToSkiString(this byte[] skiBytes)
		{
			return ToUpperHexString(skiBytes);
		}

		public static string ToBigEndianHex(this ReadOnlySpan<byte> bytes)
		{
			return ToUpperHexString(bytes);
		}

		internal static byte[] ToSerialBytes(this string serialString)
		{
			byte[] array = serialString.UpperHexStringToByteArray();
			Array.Reverse(array);
			return array;
		}

		public static string ToSerialString(this byte[] serialBytes)
		{
			serialBytes = serialBytes.CloneByteArray();
			Array.Reverse(serialBytes);
			return ToUpperHexString(serialBytes);
		}

		private static string ToUpperHexString(ReadOnlySpan<byte> ba)
		{
			return System.HexConverter.ToString(ba);
		}

		private static byte[] UpperHexStringToByteArray(this string normalizedString)
		{
			byte[] array = new byte[normalizedString.Length / 2];
			for (int i = 0; i < array.Length; i++)
			{
				char c = normalizedString[i * 2];
				byte b = (byte)(UpperHexCharToNybble(c) << 4);
				c = normalizedString[i * 2 + 1];
				b |= UpperHexCharToNybble(c);
				array[i] = b;
			}
			return array;
		}

		private static byte UpperHexCharToNybble(char c)
		{
			if (c >= '0' && c <= '9')
			{
				return (byte)(c - 48);
			}
			if (c >= 'A' && c <= 'F')
			{
				return (byte)(c - 65 + 10);
			}
			throw new CryptographicException();
		}

		public static Pkcs9AttributeObject CreateBestPkcs9AttributeObjectAvailable(Oid oid, ReadOnlySpan<byte> encodedAttribute)
		{
			return oid.Value switch
			{
				"1.3.6.1.4.1.311.88.2.1" => new Pkcs9DocumentName(encodedAttribute), 
				"1.3.6.1.4.1.311.88.2.2" => new Pkcs9DocumentDescription(encodedAttribute), 
				"1.2.840.113549.1.9.5" => new Pkcs9SigningTime(encodedAttribute), 
				"1.2.840.113549.1.9.3" => new Pkcs9ContentType(encodedAttribute), 
				"1.2.840.113549.1.9.4" => new Pkcs9MessageDigest(encodedAttribute), 
				"1.2.840.113549.1.9.21" => new Pkcs9LocalKeyId
				{
					RawData = encodedAttribute.ToArray()
				}, 
				_ => new Pkcs9AttributeObject(oid, encodedAttribute), 
			};
		}

		internal static byte[] OneShot(this ICryptoTransform transform, byte[] data)
		{
			return transform.OneShot(data, 0, data.Length);
		}

		internal static byte[] OneShot(this ICryptoTransform transform, byte[] data, int offset, int length)
		{
			if (transform.CanTransformMultipleBlocks)
			{
				return transform.TransformFinalBlock(data, offset, length);
			}
			using MemoryStream memoryStream = new MemoryStream(length);
			using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
			{
				cryptoStream.Write(data, offset, length);
			}
			return memoryStream.ToArray();
		}

		public static void EnsureSingleBerValue(ReadOnlySpan<byte> source)
		{
			if (!AsnDecoder.TryReadEncodedValue(source, AsnEncodingRules.BER, out var _, out var _, out var _, out var bytesConsumed) || bytesConsumed != source.Length)
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
			}
		}

		public static int FirstBerValueLength(ReadOnlySpan<byte> source)
		{
			if (!AsnDecoder.TryReadEncodedValue(source, AsnEncodingRules.BER, out var _, out var _, out var _, out var bytesConsumed))
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
			}
			return bytesConsumed;
		}

		public static ReadOnlyMemory<byte> DecodeOctetStringAsMemory(ReadOnlyMemory<byte> encodedOctetString)
		{
			try
			{
				ReadOnlySpan<byte> span = encodedOctetString.Span;
				if (AsnDecoder.TryReadPrimitiveOctetString(span, AsnEncodingRules.BER, out var value, out var bytesConsumed))
				{
					if (bytesConsumed != span.Length)
					{
						throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
					}
					if (span.Overlaps(value, out var elementOffset))
					{
						return encodedOctetString.Slice(elementOffset, value.Length);
					}
				}
				byte[] array = AsnDecoder.ReadOctetString(span, AsnEncodingRules.BER, out bytesConsumed);
				if (bytesConsumed != span.Length)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
				}
				return array;
			}
			catch (AsnContentException inner)
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
			}
		}

		public static byte[] DecodeOctetString(ReadOnlyMemory<byte> encodedOctets)
		{
			try
			{
				int bytesConsumed;
				byte[] result = AsnDecoder.ReadOctetString(encodedOctets.Span, AsnEncodingRules.BER, out bytesConsumed);
				if (bytesConsumed != encodedOctets.Length)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
				}
				return result;
			}
			catch (AsnContentException inner)
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
			}
		}

		public static byte[] EncodeOctetString(byte[] octets)
		{
			AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
			asnWriter.WriteOctetString(octets);
			return asnWriter.Encode();
		}

		public static byte[] EncodeUtcTime(DateTime utcTime)
		{
			AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
			try
			{
				if (utcTime.Kind == DateTimeKind.Unspecified)
				{
					asnWriter.WriteUtcTime(utcTime.ToLocalTime(), 2049);
				}
				else
				{
					asnWriter.WriteUtcTime(utcTime, 2049);
				}
				return asnWriter.Encode();
			}
			catch (ArgumentException ex)
			{
				throw new CryptographicException(ex.Message, ex);
			}
		}

		public static DateTime DecodeUtcTime(byte[] encodedUtcTime)
		{
			try
			{
				int bytesConsumed;
				DateTimeOffset dateTimeOffset = AsnDecoder.ReadUtcTime(encodedUtcTime, AsnEncodingRules.BER, out bytesConsumed);
				if (bytesConsumed != encodedUtcTime.Length)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
				}
				return dateTimeOffset.UtcDateTime;
			}
			catch (AsnContentException inner)
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
			}
		}

		public static string DecodeOid(ReadOnlySpan<byte> encodedOid)
		{
			if (encodedOid.Length == 2 && encodedOid[0] == 6 && encodedOid[1] == 0)
			{
				return string.Empty;
			}
			try
			{
				int bytesConsumed;
				string result = AsnDecoder.ReadObjectIdentifier(encodedOid, AsnEncodingRules.BER, out bytesConsumed);
				if (bytesConsumed != encodedOid.Length)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
				}
				return result;
			}
			catch (AsnContentException inner)
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
			}
		}

		public static bool TryGetRsaOaepEncryptionPadding(ReadOnlyMemory<byte>? parameters, [NotNullWhen(true)] out RSAEncryptionPadding rsaEncryptionPadding, [NotNullWhen(false)] out Exception exception)
		{
			exception = null;
			rsaEncryptionPadding = null;
			if (!parameters.HasValue || parameters.Value.IsEmpty)
			{
				exception = new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
				return false;
			}
			try
			{
				OaepParamsAsn oaepParamsAsn = OaepParamsAsn.Decode(parameters.Value, AsnEncodingRules.DER);
				if (oaepParamsAsn.MaskGenFunc.Algorithm != "1.2.840.113549.1.1.8" || !oaepParamsAsn.MaskGenFunc.Parameters.HasValue || oaepParamsAsn.PSourceFunc.Algorithm != "1.2.840.113549.1.1.9")
				{
					exception = new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
					return false;
				}
				if (System.Security.Cryptography.Asn1.AlgorithmIdentifierAsn.Decode(oaepParamsAsn.MaskGenFunc.Parameters.Value, AsnEncodingRules.DER).Algorithm != oaepParamsAsn.HashFunc.Algorithm)
				{
					exception = new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
					return false;
				}
				ReadOnlySpan<byte> other = new byte[2] { 4, 0 };
				if (oaepParamsAsn.PSourceFunc.Parameters.HasValue && !oaepParamsAsn.PSourceFunc.Parameters.Value.Span.SequenceEqual(other))
				{
					exception = new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
					return false;
				}
				switch (oaepParamsAsn.HashFunc.Algorithm)
				{
				case "1.3.14.3.2.26":
					rsaEncryptionPadding = RSAEncryptionPadding.OaepSHA1;
					return true;
				case "2.16.840.1.101.3.4.2.1":
					rsaEncryptionPadding = RSAEncryptionPadding.OaepSHA256;
					return true;
				case "2.16.840.1.101.3.4.2.2":
					rsaEncryptionPadding = RSAEncryptionPadding.OaepSHA384;
					return true;
				case "2.16.840.1.101.3.4.2.3":
					rsaEncryptionPadding = RSAEncryptionPadding.OaepSHA512;
					return true;
				default:
					exception = new CryptographicException(System.SR.Cryptography_Cms_UnknownAlgorithm, oaepParamsAsn.HashFunc.Algorithm);
					return false;
				}
			}
			catch (CryptographicException ex)
			{
				exception = ex;
				return false;
			}
		}

		[return: NotNullIfNotNull("oid")]
		public static Oid CopyOid(this Oid oid)
		{
			if (s_oidIsInitOnceOnly)
			{
				return oid;
			}
			if (oid != null)
			{
				return new Oid(oid);
			}
			return null;
		}
	}
	internal abstract class PkcsPal
	{
		private protected static readonly byte[] s_rsaOaepSha1Parameters = new byte[2] { 48, 0 };

		private protected static readonly byte[] s_rsaOaepSha256Parameters = new byte[49]
		{
			48, 47, 160, 15, 48, 13, 6, 9, 96, 134,
			72, 1, 101, 3, 4, 2, 1, 5, 0, 161,
			28, 48, 26, 6, 9, 42, 134, 72, 134, 247,
			13, 1, 1, 8, 48, 13, 6, 9, 96, 134,
			72, 1, 101, 3, 4, 2, 1, 5, 0
		};

		private protected static readonly byte[] s_rsaOaepSha384Parameters = new byte[49]
		{
			48, 47, 160, 15, 48, 13, 6, 9, 96, 134,
			72, 1, 101, 3, 4, 2, 2, 5, 0, 161,
			28, 48, 26, 6, 9, 42, 134, 72, 134, 247,
			13, 1, 1, 8, 48, 13, 6, 9, 96, 134,
			72, 1, 101, 3, 4, 2, 2, 5, 0
		};

		private protected static readonly byte[] s_rsaOaepSha512Parameters = new byte[49]
		{
			48, 47, 160, 15, 48, 13, 6, 9, 96, 134,
			72, 1, 101, 3, 4, 2, 3, 5, 0, 161,
			28, 48, 26, 6, 9, 42, 134, 72, 134, 247,
			13, 1, 1, 8, 48, 13, 6, 9, 96, 134,
			72, 1, 101, 3, 4, 2, 3, 5, 0
		};

		private protected static readonly byte[] s_rsaPkcsParameters = new byte[2] { 5, 0 };

		private static readonly PkcsPal s_instance = new ManagedPkcsPal();

		public static PkcsPal Instance => s_instance;

		public abstract byte[] Encrypt(CmsRecipientCollection recipients, ContentInfo contentInfo, AlgorithmIdentifier contentEncryptionAlgorithm, X509Certificate2Collection originatorCerts, CryptographicAttributeObjectCollection unprotectedAttributes);

		public abstract DecryptorPal Decode(ReadOnlySpan<byte> encodedMessage, out int version, out ContentInfo contentInfo, out AlgorithmIdentifier contentEncryptionAlgorithm, out X509Certificate2Collection originatorCerts, out CryptographicAttributeObjectCollection unprotectedAttributes);

		public abstract Oid GetEncodedMessageType(ReadOnlySpan<byte> encodedMessage);

		public abstract void AddCertsFromStoreForDecryption(X509Certificate2Collection certs);

		public abstract Exception CreateRecipientsNotFoundException();

		public abstract Exception CreateRecipientInfosAfterEncryptException();

		public abstract Exception CreateDecryptAfterEncryptException();

		public abstract Exception CreateDecryptTwiceException();

		public abstract byte[] GetSubjectKeyIdentifier(X509Certificate2 certificate);

		public abstract T GetPrivateKeyForSigning<T>(X509Certificate2 certificate, bool silent) where T : AsymmetricAlgorithm;

		public abstract T GetPrivateKeyForDecryption<T>(X509Certificate2 certificate, bool silent) where T : AsymmetricAlgorithm;
	}
	internal abstract class RecipientInfoPal
	{
		public abstract byte[] EncryptedKey { get; }

		public abstract AlgorithmIdentifier KeyEncryptionAlgorithm { get; }

		public abstract SubjectIdentifier RecipientIdentifier { get; }

		public abstract int Version { get; }

		internal RecipientInfoPal()
		{
		}
	}
	internal static class Helpers
	{
		[UnsupportedOSPlatformGuard("browser")]
		internal static bool HasSymmetricEncryption { get; } = true;


		public static bool IsDSASupported => true;

		public static bool IsRC2Supported => true;

		[UnsupportedOSPlatformGuard("browser")]
		internal static bool HasMD5 { get; } = true;


		[return: NotNullIfNotNull("src")]
		public static byte[] CloneByteArray(this byte[] src)
		{
			if (src == null)
			{
				return null;
			}
			return (byte[])src.Clone();
		}

		internal static bool TryCopyToDestination(this ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten)
		{
			if (source.TryCopyTo(destination))
			{
				bytesWritten = source.Length;
				return true;
			}
			bytesWritten = 0;
			return false;
		}

		internal static int HashOidToByteLength(string hashOid)
		{
			return hashOid switch
			{
				"2.16.840.1.101.3.4.2.1" => 32, 
				"2.16.840.1.101.3.4.2.2" => 48, 
				"2.16.840.1.101.3.4.2.3" => 64, 
				"1.3.14.3.2.26" => 20, 
				"1.2.840.113549.2.5" => 16, 
				_ => throw new CryptographicException(System.SR.Format(System.SR.Cryptography_UnknownHashAlgorithm, hashOid)), 
			};
		}
	}
}
namespace Internal.Cryptography.Pal.AnyOS
{
	internal static class AsnHelpers
	{
		internal static SubjectIdentifierOrKey ToSubjectIdentifierOrKey(this OriginatorIdentifierOrKeyAsn originator)
		{
			if (originator.IssuerAndSerialNumber.HasValue)
			{
				X500DistinguishedName x500DistinguishedName = new X500DistinguishedName(originator.IssuerAndSerialNumber.Value.Issuer.ToArray());
				return new SubjectIdentifierOrKey(SubjectIdentifierOrKeyType.IssuerAndSerialNumber, new X509IssuerSerial(x500DistinguishedName.Name, originator.IssuerAndSerialNumber.Value.SerialNumber.Span.ToBigEndianHex()));
			}
			if (originator.SubjectKeyIdentifier.HasValue)
			{
				return new SubjectIdentifierOrKey(SubjectIdentifierOrKeyType.SubjectKeyIdentifier, originator.SubjectKeyIdentifier.Value.Span.ToBigEndianHex());
			}
			if (originator.OriginatorKey.HasValue)
			{
				OriginatorPublicKeyAsn value = originator.OriginatorKey.Value;
				return new SubjectIdentifierOrKey(SubjectIdentifierOrKeyType.PublicKeyInfo, new PublicKeyInfo(value.Algorithm.ToPresentationObject(), value.PublicKey.ToArray()));
			}
			return new SubjectIdentifierOrKey(SubjectIdentifierOrKeyType.Unknown, string.Empty);
		}

		internal static AlgorithmIdentifier ToPresentationObject(this System.Security.Cryptography.Asn1.AlgorithmIdentifierAsn asn)
		{
			byte[] parameters = Array.Empty<byte>();
			int keyLength;
			switch (asn.Algorithm)
			{
			case "1.2.840.113549.3.2":
			{
				if (!asn.Parameters.HasValue)
				{
					keyLength = 0;
					break;
				}
				int effectiveKeyBits = System.Security.Cryptography.Asn1.Rc2CbcParameters.Decode(asn.Parameters.Value, AsnEncodingRules.BER).GetEffectiveKeyBits();
				switch (effectiveKeyBits)
				{
				case 40:
				case 56:
				case 64:
				case 128:
					keyLength = effectiveKeyBits;
					break;
				default:
					keyLength = 0;
					break;
				}
				break;
			}
			case "1.2.840.113549.3.4":
			{
				if (!asn.Parameters.HasValue)
				{
					keyLength = 0;
					break;
				}
				int bytesWritten = 0;
				try
				{
					AsnReader asnReader = new AsnReader(asn.Parameters.Value, AsnEncodingRules.BER);
					if (asnReader.PeekTag() != Asn1Tag.Null)
					{
						if (asnReader.TryReadPrimitiveOctetString(out var contents))
						{
							bytesWritten = contents.Length;
						}
						else
						{
							Span<byte> destination = stackalloc byte[16];
							if (!asnReader.TryReadOctetString(destination, out bytesWritten))
							{
								throw new CryptographicException();
							}
						}
					}
				}
				catch (AsnContentException inner)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
				}
				keyLength = 128 - 8 * bytesWritten;
				break;
			}
			case "1.3.14.3.2.7":
				keyLength = 64;
				break;
			case "1.2.840.113549.3.7":
				keyLength = 192;
				break;
			case "1.2.840.113549.1.1.7":
				if (!asn.HasNullEquivalentParameters())
				{
					keyLength = 0;
					parameters = asn.Parameters.Value.ToArray();
					break;
				}
				goto default;
			default:
				keyLength = 0;
				break;
			}
			return new AlgorithmIdentifier(new Oid(asn.Algorithm), keyLength)
			{
				Parameters = parameters
			};
		}
	}
	internal sealed class ManagedPkcsPal : PkcsPal
	{
		internal sealed class ManagedDecryptorPal : DecryptorPal
		{
			private readonly byte[] _dataCopy;

			private EnvelopedDataAsn _envelopedData;

			public ManagedDecryptorPal(byte[] dataCopy, EnvelopedDataAsn envelopedDataAsn, RecipientInfoCollection recipientInfos)
				: base(recipientInfos)
			{
				_dataCopy = dataCopy;
				_envelopedData = envelopedDataAsn;
			}

			public unsafe override ContentInfo TryDecrypt(RecipientInfo recipientInfo, X509Certificate2 cert, AsymmetricAlgorithm privateKey, X509Certificate2Collection originatorCerts, X509Certificate2Collection extraStore, out Exception exception)
			{
				if (recipientInfo.Pal is ManagedKeyTransPal managedKeyTransPal)
				{
					RSA rSA = privateKey as RSA;
					if (privateKey != null && rSA == null)
					{
						exception = new CryptographicException(System.SR.Cryptography_Cms_Ktri_RSARequired);
						return null;
					}
					byte[] array = managedKeyTransPal.DecryptCek(cert, rSA, out exception);
					fixed (byte* ptr = array)
					{
						try
						{
							if (exception != null)
							{
								return null;
							}
							return TryDecryptCore(array, _envelopedData.EncryptedContentInfo.ContentType, _envelopedData.EncryptedContentInfo.EncryptedContent, _envelopedData.EncryptedContentInfo.ContentEncryptionAlgorithm, out exception);
						}
						finally
						{
							if (array != null)
							{
								Array.Clear(array, 0, array.Length);
							}
						}
					}
				}
				exception = new CryptographicException(System.SR.Cryptography_Cms_RecipientType_NotSupported, recipientInfo.Type.ToString());
				return null;
			}

			public static ContentInfo TryDecryptCore(byte[] cek, string contentType, ReadOnlyMemory<byte>? content, System.Security.Cryptography.Asn1.AlgorithmIdentifierAsn contentEncryptionAlgorithm, out Exception exception)
			{
				if (!content.HasValue)
				{
					exception = null;
					return new ContentInfo(new Oid(contentType), Array.Empty<byte>());
				}
				byte[] array = DecryptContent(content.Value, cek, contentEncryptionAlgorithm, out exception);
				if (exception != null)
				{
					return null;
				}
				if (contentType != "1.2.840.113549.1.7.1")
				{
					array = GetAsnSequenceWithContentNoValidation(array);
				}
				exception = null;
				return new ContentInfo(new Oid(contentType), array);
			}

			private static byte[] GetAsnSequenceWithContentNoValidation(ReadOnlySpan<byte> content)
			{
				AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.BER);
				asnWriter.WriteOctetString(content);
				byte[] array = asnWriter.Encode();
				array[0] = 48;
				return array;
			}

			private static byte[] DecryptContent(ReadOnlyMemory<byte> encryptedContent, byte[] cek, System.Security.Cryptography.Asn1.AlgorithmIdentifierAsn contentEncryptionAlgorithm, out Exception exception)
			{
				exception = null;
				if (encryptedContent.IsEmpty)
				{
					return Array.Empty<byte>();
				}
				int length = encryptedContent.Length;
				byte[] array = System.Security.Cryptography.CryptoPool.Rent(length);
				try
				{
					encryptedContent.CopyTo(array);
					using SymmetricAlgorithm symmetricAlgorithm = OpenAlgorithm(contentEncryptionAlgorithm);
					ICryptoTransform cryptoTransform;
					try
					{
						cryptoTransform = symmetricAlgorithm.CreateDecryptor(cek, symmetricAlgorithm.IV);
					}
					catch (ArgumentException inner)
					{
						throw new CryptographicException(System.SR.Cryptography_Cms_InvalidSymmetricKey, inner);
					}
					using (cryptoTransform)
					{
						return cryptoTransform.OneShot(array, 0, length);
					}
				}
				catch (CryptographicException ex)
				{
					exception = ex;
					return null;
				}
				finally
				{
					System.Security.Cryptography.CryptoPool.Return(array, length);
				}
			}

			public override void Dispose()
			{
			}
		}

		private sealed class ManagedKeyAgreePal : KeyAgreeRecipientInfoPal
		{
			private readonly KeyAgreeRecipientInfoAsn _asn;

			private readonly int _index;

			public override byte[] EncryptedKey => _asn.RecipientEncryptedKeys[_index].EncryptedKey.ToArray();

			public override AlgorithmIdentifier KeyEncryptionAlgorithm => _asn.KeyEncryptionAlgorithm.ToPresentationObject();

			public override SubjectIdentifier RecipientIdentifier => new SubjectIdentifier(_asn.RecipientEncryptedKeys[_index].Rid.IssuerAndSerialNumber, _asn.RecipientEncryptedKeys[_index].Rid.RKeyId?.SubjectKeyIdentifier);

			public override int Version => _asn.Version;

			public override DateTime Date
			{
				get
				{
					KeyAgreeRecipientIdentifierAsn rid = _asn.RecipientEncryptedKeys[_index].Rid;
					if (!rid.RKeyId.HasValue)
					{
						throw new InvalidOperationException(System.SR.Cryptography_Cms_Key_Agree_Date_Not_Available);
					}
					if (!rid.RKeyId.Value.Date.HasValue)
					{
						return DateTime.FromFileTimeUtc(0L);
					}
					return rid.RKeyId.Value.Date.Value.LocalDateTime;
				}
			}

			public override SubjectIdentifierOrKey OriginatorIdentifierOrKey => _asn.Originator.ToSubjectIdentifierOrKey();

			public override CryptographicAttributeObject OtherKeyAttribute
			{
				get
				{
					KeyAgreeRecipientIdentifierAsn rid = _asn.RecipientEncryptedKeys[_index].Rid;
					if (!rid.RKeyId.HasValue)
					{
						throw new InvalidOperationException(System.SR.Cryptography_Cms_Key_Agree_Date_Not_Available);
					}
					if (!rid.RKeyId.Value.Other.HasValue)
					{
						return null;
					}
					Oid oid = new Oid(rid.RKeyId.Value.Other.Value.KeyAttrId);
					ReadOnlySpan<byte> encodedData = ReadOnlySpan<byte>.Empty;
					if (rid.RKeyId.Value.Other.Value.KeyAttr.HasValue)
					{
						encodedData = rid.RKeyId.Value.Other.Value.KeyAttr.Value.Span;
					}
					Pkcs9AttributeObject asnEncodedData = new Pkcs9AttributeObject(oid, encodedData);
					AsnEncodedDataCollection values = new AsnEncodedDataCollection(asnEncodedData);
					return new CryptographicAttributeObject(oid, values);
				}
			}

			internal ManagedKeyAgreePal(KeyAgreeRecipientInfoAsn asn, int index)
			{
				_asn = asn;
				_index = index;
			}
		}

		internal sealed class ManagedKeyTransPal : KeyTransRecipientInfoPal
		{
			private readonly KeyTransRecipientInfoAsn _asn;

			public override byte[] EncryptedKey => _asn.EncryptedKey.ToArray();

			public override AlgorithmIdentifier KeyEncryptionAlgorithm => _asn.KeyEncryptionAlgorithm.ToPresentationObject();

			public override SubjectIdentifier RecipientIdentifier => new SubjectIdentifier(_asn.Rid.IssuerAndSerialNumber, _asn.Rid.SubjectKeyIdentifier);

			public override int Version => _asn.Version;

			internal ManagedKeyTransPal(KeyTransRecipientInfoAsn asn)
			{
				_asn = asn;
			}

			internal byte[] DecryptCek(X509Certificate2 cert, RSA privateKey, out Exception exception)
			{
				ReadOnlyMemory<byte>? parameters = _asn.KeyEncryptionAlgorithm.Parameters;
				string algorithm = _asn.KeyEncryptionAlgorithm.Algorithm;
				if (!(algorithm == "1.2.840.113549.1.1.1"))
				{
					if (!(algorithm == "1.2.840.113549.1.1.7"))
					{
						exception = new CryptographicException(System.SR.Cryptography_Cms_UnknownAlgorithm, _asn.KeyEncryptionAlgorithm.Algorithm);
						return null;
					}
				}
				else if (parameters.HasValue && !parameters.Value.Span.SequenceEqual(PkcsPal.s_rsaPkcsParameters))
				{
					exception = new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
					return null;
				}
				return DecryptCekCore(cert, privateKey, _asn.EncryptedKey.Span, algorithm, parameters, out exception);
			}

			internal static byte[] DecryptCekCore(X509Certificate2 cert, RSA privateKey, ReadOnlySpan<byte> encryptedKey, string keyEncryptionAlgorithm, ReadOnlyMemory<byte>? algorithmParameters, out Exception exception)
			{
				RSAEncryptionPadding rsaEncryptionPadding;
				if (!(keyEncryptionAlgorithm == "1.2.840.113549.1.1.1"))
				{
					if (!(keyEncryptionAlgorithm == "1.2.840.113549.1.1.7"))
					{
						exception = new CryptographicException(System.SR.Cryptography_Cms_UnknownAlgorithm, keyEncryptionAlgorithm);
						return null;
					}
					if (!PkcsHelpers.TryGetRsaOaepEncryptionPadding(algorithmParameters, out rsaEncryptionPadding, out exception))
					{
						return null;
					}
				}
				else
				{
					rsaEncryptionPadding = RSAEncryptionPadding.Pkcs1;
				}
				if (privateKey != null)
				{
					return DecryptKey(privateKey, rsaEncryptionPadding, encryptedKey, out exception);
				}
				using RSA privateKey2 = cert.GetRSAPrivateKey();
				return DecryptKey(privateKey2, rsaEncryptionPadding, encryptedKey, out exception);
			}
		}

		public override void AddCertsFromStoreForDecryption(X509Certificate2Collection certs)
		{
			certs.AddRange(PkcsHelpers.GetStoreCertificates(StoreName.My, StoreLocation.CurrentUser, openExistingOnly: false));
			try
			{
				certs.AddRange(PkcsHelpers.GetStoreCertificates(StoreName.My, StoreLocation.LocalMachine, openExistingOnly: false));
			}
			catch (CryptographicException)
			{
			}
		}

		public override byte[] GetSubjectKeyIdentifier(X509Certificate2 certificate)
		{
			X509Extension x509Extension = certificate.Extensions["2.5.29.14"] ?? new X509SubjectKeyIdentifierExtension(certificate.PublicKey, X509SubjectKeyIdentifierHashAlgorithm.CapiSha1, critical: false);
			try
			{
				System.Formats.Asn1.AsnValueReader asnValueReader = new System.Formats.Asn1.AsnValueReader(x509Extension.RawData, AsnEncodingRules.DER);
				if (asnValueReader.TryReadPrimitiveOctetString(out var value))
				{
					asnValueReader.ThrowIfNotEmpty();
					return value.ToArray();
				}
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
			}
			catch (AsnContentException inner)
			{
				throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
			}
		}

		public override T GetPrivateKeyForSigning<T>(X509Certificate2 certificate, bool silent)
		{
			return GetPrivateKey<T>(certificate);
		}

		public override T GetPrivateKeyForDecryption<T>(X509Certificate2 certificate, bool silent)
		{
			return GetPrivateKey<T>(certificate);
		}

		private static T GetPrivateKey<T>(X509Certificate2 certificate) where T : AsymmetricAlgorithm
		{
			if (typeof(T) == typeof(RSA))
			{
				return (T)(AsymmetricAlgorithm)certificate.GetRSAPrivateKey();
			}
			if (typeof(T) == typeof(ECDsa))
			{
				return (T)(AsymmetricAlgorithm)certificate.GetECDsaPrivateKey();
			}
			if (typeof(T) == typeof(DSA) && Internal.Cryptography.Helpers.IsDSASupported)
			{
				return (T)(AsymmetricAlgorithm)certificate.GetDSAPrivateKey();
			}
			return null;
		}

		private static SymmetricAlgorithm OpenAlgorithm(System.Security.Cryptography.Asn1.AlgorithmIdentifierAsn contentEncryptionAlgorithm)
		{
			SymmetricAlgorithm symmetricAlgorithm = OpenAlgorithm(contentEncryptionAlgorithm.Algorithm);
			if (symmetricAlgorithm is RC2)
			{
				if (!contentEncryptionAlgorithm.Parameters.HasValue)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
				}
				System.Security.Cryptography.Asn1.Rc2CbcParameters rc2CbcParameters = System.Security.Cryptography.Asn1.Rc2CbcParameters.Decode(contentEncryptionAlgorithm.Parameters.Value, AsnEncodingRules.BER);
				symmetricAlgorithm.KeySize = rc2CbcParameters.GetEffectiveKeyBits();
				symmetricAlgorithm.IV = rc2CbcParameters.Iv.ToArray();
			}
			else
			{
				if (!contentEncryptionAlgorithm.Parameters.HasValue)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
				}
				try
				{
					AsnReader asnReader = new AsnReader(contentEncryptionAlgorithm.Parameters.Value, AsnEncodingRules.BER);
					symmetricAlgorithm.IV = asnReader.ReadOctetString();
					if (symmetricAlgorithm.IV.Length != symmetricAlgorithm.BlockSize / 8)
					{
						throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding);
					}
				}
				catch (AsnContentException inner)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
				}
			}
			return symmetricAlgorithm;
		}

		private static SymmetricAlgorithm OpenAlgorithm(AlgorithmIdentifier algorithmIdentifier)
		{
			SymmetricAlgorithm symmetricAlgorithm = OpenAlgorithm(algorithmIdentifier.Oid.Value);
			if (symmetricAlgorithm is RC2)
			{
				if (algorithmIdentifier.KeyLength != 0)
				{
					symmetricAlgorithm.KeySize = algorithmIdentifier.KeyLength;
				}
				else
				{
					symmetricAlgorithm.KeySize = 128;
				}
			}
			return symmetricAlgorithm;
		}

		private static SymmetricAlgorithm OpenAlgorithm(string algorithmIdentifier)
		{
			SymmetricAlgorithm symmetricAlgorithm;
			switch (algorithmIdentifier)
			{
			case "1.2.840.113549.3.2":
				if (!Internal.Cryptography.Helpers.IsRC2Supported)
				{
					throw new PlatformNotSupportedException(System.SR.Format(System.SR.Cryptography_AlgorithmNotSupported, "RC2"));
				}
				symmetricAlgorithm = RC2.Create();
				break;
			case "1.3.14.3.2.7":
				symmetricAlgorithm = DES.Create();
				break;
			case "1.2.840.113549.3.7":
				symmetricAlgorithm = TripleDES.Create();
				break;
			case "2.16.840.1.101.3.4.1.2":
				symmetricAlgorithm = Aes.Create();
				symmetricAlgorithm.KeySize = 128;
				break;
			case "2.16.840.1.101.3.4.1.22":
				symmetricAlgorithm = Aes.Create();
				symmetricAlgorithm.KeySize = 192;
				break;
			case "2.16.840.1.101.3.4.1.42":
				symmetricAlgorithm = Aes.Create();
				symmetricAlgorithm.KeySize = 256;
				break;
			default:
				throw new CryptographicException(System.SR.Cryptography_Cms_UnknownAlgorithm, algorithmIdentifier);
			}
			symmetricAlgorithm.Padding = PaddingMode.PKCS7;
			symmetricAlgorithm.Mode = CipherMode.CBC;
			return symmetricAlgorithm;
		}

		public unsafe override Oid GetEncodedMessageType(ReadOnlySpan<byte> encodedMessage)
		{
			fixed (byte* pointer = encodedMessage)
			{
				using System.Buffers.PointerMemoryManager<byte> pointerMemoryManager = new System.Buffers.PointerMemoryManager<byte>(pointer, encodedMessage.Length);
				System.Formats.Asn1.AsnValueReader reader = new System.Formats.Asn1.AsnValueReader(encodedMessage, AsnEncodingRules.BER);
				System.Security.Cryptography.Asn1.Pkcs7.ContentInfoAsn.Decode(ref reader, pointerMemoryManager.Memory, out var decoded);
				switch (decoded.ContentType)
				{
				case "1.2.840.113549.1.7.1":
				case "1.2.840.113549.1.7.2":
				case "1.2.840.113549.1.7.3":
				case "1.2.840.113549.1.7.4":
				case "1.2.840.113549.1.7.5":
				case "1.2.840.113549.1.7.6":
					return new Oid(decoded.ContentType);
				default:
					throw new CryptographicException(System.SR.Cryptography_Cms_InvalidMessageType);
				}
			}
		}

		public override DecryptorPal Decode(ReadOnlySpan<byte> encodedMessage, out int version, out ContentInfo contentInfo, out AlgorithmIdentifier contentEncryptionAlgorithm, out X509Certificate2Collection originatorCerts, out CryptographicAttributeObjectCollection unprotectedAttributes)
		{
			byte[] array = CopyContent(encodedMessage);
			EnvelopedDataAsn envelopedDataAsn = EnvelopedDataAsn.Decode(array, AsnEncodingRules.BER);
			version = envelopedDataAsn.Version;
			contentInfo = new ContentInfo(new Oid(envelopedDataAsn.EncryptedContentInfo.ContentType), envelopedDataAsn.EncryptedContentInfo.EncryptedContent?.ToArray() ?? Array.Empty<byte>());
			contentEncryptionAlgorithm = envelopedDataAsn.EncryptedContentInfo.ContentEncryptionAlgorithm.ToPresentationObject();
			originatorCerts = new X509Certificate2Collection();
			if (envelopedDataAsn.OriginatorInfo.HasValue && envelopedDataAsn.OriginatorInfo.Value.CertificateSet != null)
			{
				CertificateChoiceAsn[] certificateSet = envelopedDataAsn.OriginatorInfo.Value.CertificateSet;
				for (int i = 0; i < certificateSet.Length; i++)
				{
					CertificateChoiceAsn certificateChoiceAsn = certificateSet[i];
					if (certificateChoiceAsn.Certificate.HasValue)
					{
						originatorCerts.Add(new X509Certificate2(certificateChoiceAsn.Certificate.Value.ToArray()));
					}
				}
			}
			unprotectedAttributes = SignerInfo.MakeAttributeCollection(envelopedDataAsn.UnprotectedAttributes);
			List<RecipientInfo> list = new List<RecipientInfo>();
			RecipientInfoAsn[] recipientInfos = envelopedDataAsn.RecipientInfos;
			for (int j = 0; j < recipientInfos.Length; j++)
			{
				RecipientInfoAsn recipientInfoAsn = recipientInfos[j];
				if (recipientInfoAsn.Ktri.HasValue)
				{
					list.Add(new KeyTransRecipientInfo(new ManagedKeyTransPal(recipientInfoAsn.Ktri.Value)));
					continue;
				}
				if (recipientInfoAsn.Kari.HasValue)
				{
					for (int k = 0; k < recipientInfoAsn.Kari.Value.RecipientEncryptedKeys.Length; k++)
					{
						list.Add(new KeyAgreeRecipientInfo(new ManagedKeyAgreePal(recipientInfoAsn.Kari.Value, k)));
					}
					continue;
				}
				throw new CryptographicException();
			}
			return new ManagedDecryptorPal(array, envelopedDataAsn, new RecipientInfoCollection(list));
		}

		private unsafe static byte[] CopyContent(ReadOnlySpan<byte> encodedMessage)
		{
			fixed (byte* pointer = encodedMessage)
			{
				using System.Buffers.PointerMemoryManager<byte> pointerMemoryManager = new System.Buffers.PointerMemoryManager<byte>(pointer, encodedMessage.Length);
				System.Formats.Asn1.AsnValueReader reader = new System.Formats.Asn1.AsnValueReader(encodedMessage, AsnEncodingRules.BER);
				System.Security.Cryptography.Asn1.Pkcs7.ContentInfoAsn.Decode(ref reader, pointerMemoryManager.Memory, out var decoded);
				if (decoded.ContentType != "1.2.840.113549.1.7.3")
				{
					throw new CryptographicException(System.SR.Cryptography_Cms_InvalidMessageType);
				}
				return decoded.Content.ToArray();
			}
		}

		public unsafe override byte[] Encrypt(CmsRecipientCollection recipients, ContentInfo contentInfo, AlgorithmIdentifier contentEncryptionAlgorithm, X509Certificate2Collection originatorCerts, CryptographicAttributeObjectCollection unprotectedAttributes)
		{
			byte[] cek;
			byte[] parameterBytes;
			byte[] encryptedContent = EncryptContent(contentInfo, contentEncryptionAlgorithm, out cek, out parameterBytes);
			fixed (byte* ptr = cek)
			{
				try
				{
					return Encrypt(recipients, contentInfo, contentEncryptionAlgorithm, originatorCerts, unprotectedAttributes, encryptedContent, cek, parameterBytes);
				}
				finally
				{
					Array.Clear(cek, 0, cek.Length);
				}
			}
		}

		private byte[] Encrypt(CmsRecipientCollection recipients, ContentInfo contentInfo, AlgorithmIdentifier contentEncryptionAlgorithm, X509Certificate2Collection originatorCerts, CryptographicAttributeObjectCollection unprotectedAttributes, byte[] encryptedContent, byte[] cek, byte[] parameterBytes)
		{
			EnvelopedDataAsn envelopedDataAsn = default(EnvelopedDataAsn);
			envelopedDataAsn.EncryptedContentInfo.ContentType = contentInfo.ContentType.Value;
			envelopedDataAsn.EncryptedContentInfo.ContentEncryptionAlgorithm.Algorithm = contentEncryptionAlgorithm.Oid.Value;
			envelopedDataAsn.EncryptedContentInfo.ContentEncryptionAlgorithm.Parameters = parameterBytes;
			envelopedDataAsn.EncryptedContentInfo.EncryptedContent = encryptedContent;
			EnvelopedDataAsn envelopedDataAsn2 = envelopedDataAsn;
			if (unprotectedAttributes != null && unprotectedAttributes.Count > 0)
			{
				List<System.Security.Cryptography.Asn1.AttributeAsn> list = CmsSigner.BuildAttributes(unprotectedAttributes);
				envelopedDataAsn2.UnprotectedAttributes = PkcsHelpers.NormalizeAttributeSet(list.ToArray());
			}
			if (originatorCerts != null && originatorCerts.Count > 0)
			{
				CertificateChoiceAsn[] array = new CertificateChoiceAsn[originatorCerts.Count];
				for (int i = 0; i < originatorCerts.Count; i++)
				{
					array[i].Certificate = originatorCerts[i].RawData;
				}
				envelopedDataAsn2.OriginatorInfo = new OriginatorInfoAsn
				{
					CertificateSet = array
				};
			}
			envelopedDataAsn2.RecipientInfos = new RecipientInfoAsn[recipients.Count];
			bool flag = true;
			for (int j = 0; j < recipients.Count; j++)
			{
				CmsRecipient cmsRecipient = recipients[j];
				RecipientInfoAsn[] recipientInfos = envelopedDataAsn2.RecipientInfos;
				int num = j;
				_ = ref recipientInfos[num];
				string keyAlgorithm = cmsRecipient.Certificate.GetKeyAlgorithm();
				if (keyAlgorithm == "1.2.840.113549.1.1.1")
				{
					bool v0Recipient;
					KeyTransRecipientInfoAsn value = MakeKtri(cek, cmsRecipient, out v0Recipient);
					recipientInfos[num].Ktri = value;
					flag = flag && v0Recipient;
					continue;
				}
				throw new CryptographicException(System.SR.Cryptography_Cms_UnknownAlgorithm, cmsRecipient.Certificate.GetKeyAlgorithm());
			}
			if (envelopedDataAsn2.OriginatorInfo.HasValue || !flag || envelopedDataAsn2.UnprotectedAttributes != null)
			{
				envelopedDataAsn2.Version = 2;
			}
			AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
			envelopedDataAsn2.Encode(asnWriter);
			return PkcsHelpers.EncodeContentInfo(asnWriter.Encode(), "1.2.840.113549.1.7.3");
		}

		private static byte[] EncryptContent(ContentInfo contentInfo, AlgorithmIdentifier contentEncryptionAlgorithm, out byte[] cek, out byte[] parameterBytes)
		{
			using (SymmetricAlgorithm symmetricAlgorithm = OpenAlgorithm(contentEncryptionAlgorithm))
			{
				cek = symmetricAlgorithm.Key;
				if (symmetricAlgorithm is RC2)
				{
					System.Security.Cryptography.Asn1.Rc2CbcParameters rc2CbcParameters = new System.Security.Cryptography.Asn1.Rc2CbcParameters(symmetricAlgorithm.IV, symmetricAlgorithm.KeySize);
					AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
					rc2CbcParameters.Encode(asnWriter);
					parameterBytes = asnWriter.Encode();
				}
				else
				{
					parameterBytes = PkcsHelpers.EncodeOctetString(symmetricAlgorithm.IV);
				}
				byte[] content = contentInfo.Content;
				if (contentInfo.ContentType.Value == "1.2.840.113549.1.7.1" || contentInfo.Content.Length == 0)
				{
					return EncryptOneShot(symmetricAlgorithm, contentInfo.Content);
				}
				try
				{
					AsnDecoder.ReadEncodedValue(contentInfo.Content, AsnEncodingRules.BER, out var contentOffset, out var contentLength, out var _);
					ReadOnlySpan<byte> plaintext2 = contentInfo.Content.AsSpan(contentOffset, contentLength);
					return EncryptOneShot(symmetricAlgorithm, plaintext2);
				}
				catch (AsnContentException inner)
				{
					throw new CryptographicException(System.SR.Cryptography_Der_Invalid_Encoding, inner);
				}
			}
			static byte[] EncryptOneShot(SymmetricAlgorithm alg, ReadOnlySpan<byte> plaintext)
			{
				using ICryptoTransform transform = alg.CreateEncryptor();
				return transform.OneShot(plaintext.ToArray());
			}
		}

		public override Exception CreateRecipientsNotFoundException()
		{
			return new CryptographicException(System.SR.Cryptography_Cms_RecipientNotFound);
		}

		public override Exception CreateRecipientInfosAfterEncryptException()
		{
			return CreateInvalidMessageTypeException();
		}

		public override Exception CreateDecryptAfterEncryptException()
		{
			return CreateInvalidMessageTypeException();
		}

		public override Exception CreateDecryptTwiceException()
		{
			return CreateInvalidMessageTypeException();
		}

		private static CryptographicException CreateInvalidMessageTypeException()
		{
			return new CryptographicException(System.SR.Cryptography_Cms_InvalidMessageType);
		}

		private KeyTransRecipientInfoAsn MakeKtri(byte[] cek, CmsRecipient recipient, out bool v0Recipient)
		{
			KeyTransRecipientInfoAsn result = default(KeyTransRecipientInfoAsn);
			if (recipient.RecipientIdentifierType == SubjectIdentifierType.SubjectKeyIdentifier)
			{
				result.Version = 2;
				result.Rid.SubjectKeyIdentifier = GetSubjectKeyIdentifier(recipient.Certificate);
			}
			else
			{
				if (recipient.RecipientIdentifierType != SubjectIdentifierType.IssuerAndSerialNumber)
				{
					throw new CryptographicException(System.SR.Cryptography_Cms_Invalid_Subject_Identifier_Type, recipient.RecipientIdentifierType.ToString());
				}
				byte[] serialNumber = recipient.Certificate.GetSerialNumber();
				Array.Reverse(serialNumber);
				IssuerAndSerialNumberAsn issuerAndSerialNumberAsn = default(IssuerAndSerialNumberAsn);
				issuerAndSerialNumberAsn.Issuer = recipient.Certificate.IssuerName.RawData;
				issuerAndSerialNumberAsn.SerialNumber = serialNumber;
				IssuerAndSerialNumberAsn value = issuerAndSerialNumberAsn;
				result.Rid.IssuerAndSerialNumber = value;
			}
			RSAEncryptionPadding rSAEncryptionPadding = recipient.RSAEncryptionPadding ?? RSAEncryptionPadding.Pkcs1;
			if (rSAEncryptionPadding == RSAEncryptionPadding.Pkcs1)
			{
				result.KeyEncryptionAlgorithm.Algorithm = "1.2.840.113549.1.1.1";
				result.KeyEncryptionAlgorithm.Parameters = PkcsPal.s_rsaPkcsParameters;
			}
			else if (rSAEncryptionPadding == RSAEncryptionPadding.OaepSHA1)
			{
				result.KeyEncryptionAlgorithm.Algorithm = "1.2.840.113549.1.1.7";
				result.KeyEncryptionAlgorithm.Parameters = PkcsPal.s_rsaOaepSha1Parameters;
			}
			else if (rSAEncryptionPadding == RSAEncryptionPadding.OaepSHA256)
			{
				result.KeyEncryptionAlgorithm.Algorithm = "1.2.840.113549.1.1.7";
				result.KeyEncryptionAlgorithm.Parameters = PkcsPal.s_rsaOaepSha256Parameters;
			}
			else if (rSAEncryptionPadding == RSAEncryptionPadding.OaepSHA384)
			{
				result.KeyEncryptionAlgorithm.Algorithm = "1.2.840.113549.1.1.7";
				result.KeyEncryptionAlgorithm.Parameters = PkcsPal.s_rsaOaepSha384Parameters;
			}
			else
			{
				if (!(rSAEncryptionPadding == RSAEncryptionPadding.OaepSHA512))
				{
					throw new CryptographicException(System.SR.Cryptography_Cms_UnknownAlgorithm);
				}
				result.KeyEncryptionAlgorithm.Algorithm = "1.2.840.113549.1.1.7";
				result.KeyEncryptionAlgorithm.Parameters = PkcsPal.s_rsaOaepSha512Parameters;
			}
			using (RSA rSA = recipient.Certificate.GetRSAPublicKey())
			{
				result.EncryptedKey = rSA.Encrypt(cek, rSAEncryptionPadding);
			}
			v0Recipient = result.Version == 0;
			return result;
		}

		private static byte[] DecryptKey(RSA privateKey, RSAEncryptionPadding encryptionPadding, ReadOnlySpan<byte> encryptedKey, out Exception exception)
		{
			if (privateKey == null)
			{
				exception = new CryptographicException(System.SR.Cryptography_Cms_Signing_RequiresPrivateKey);
				return null;
			}
			byte[] array = null;
			int bytesWritten = 0;
			try
			{
				array = System.Security.Cryptography.CryptoPool.Rent(privateKey.KeySize / 8);
				if (!privateKey.TryDecrypt(encryptedKey, array, encryptionPadding, out bytesWritten))
				{
					exception = new CryptographicException();
					return null;
				}
				exception = null;
				return new Span<byte>(array, 0, bytesWritten).ToArray();
			}
			catch (CryptographicException ex)
			{
				exception = ex;
				return null;
			}
			finally
			{
				if (array != null)
				{
					System.Security.Cryptography.CryptoPool.Return(array, bytesWritten);
				}
			}
		}
	}
}
namespace System
{
	internal static class HexConverter
	{
		public enum Casing : uint
		{
			Upper = 0u,
			Lower = 8224u
		}

		public static ReadOnlySpan<byte> CharToHexLookup => new byte[256]
		{
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 0, 1,
			2, 3, 4, 5, 6, 7, 8, 9, 255, 255,
			255, 255, 255, 255, 255, 10, 11, 12, 13, 14,
			15, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 10, 11, 12,
			13, 14, 15, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255
		};

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static void ToBytesBuffer(byte value, Span<byte> buffer, int startingIndex = 0, Casing casing = Casing.Upper)
		{
			uint num = (uint)(((value & 0xF0) << 4) + (value & 0xF) - 35209);
			uint num2 = ((((0 - num) & 0x7070) >> 4) + num + 47545) | (uint)casing;
			buffer[startingIndex + 1] = (byte)num2;
			buffer[startingIndex] = (byte)(num2 >> 8);
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static void ToCharsBuffer(byte value, Span<char> buffer, int startingIndex = 0, Casing casing = Casing.Upper)
		{
			uint num = (uint)(((value & 0xF0) << 4) + (value & 0xF) - 35209);
			uint num2 = ((((0 - num) & 0x7070) >> 4) + num + 47545) | (uint)casing;
			buffer[startingIndex + 1] = (char)(num2 & 0xFFu);
			buffer[startingIndex] = (char)(num2 >> 8);
		}

		public static void EncodeToUtf16(ReadOnlySpan<byte> bytes, Span<char> chars, Casing casing = Casing.Upper)
		{
			for (int i = 0; i < bytes.Length; i++)
			{
				ToCharsBuffer(bytes[i], chars, i * 2, casing);
			}
		}

		public unsafe static string ToString(ReadOnlySpan<byte> bytes, Casing casing = Casing.Upper)
		{
			return string.Create(bytes.Length * 2, ((IntPtr)(&bytes), casing), delegate(Span<char> chars, (IntPtr RosPtr, Casing casing) args)
			{
				EncodeToUtf16(*(ReadOnlySpan<byte>*)(void*)args.RosPtr, chars, args.casing);
			});
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static char ToCharUpper(int value)
		{
			value &= 0xF;
			value += 48;
			if (value > 57)
			{
				value += 7;
			}
			return (char)value;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static char ToCharLower(int value)
		{
			value &= 0xF;
			value += 48;
			if (value > 57)
			{
				value += 39;
			}
			return (char)value;
		}

		public static bool TryDecodeFromUtf16(ReadOnlySpan<char> chars, Span<byte> bytes)
		{
			int charsProcessed;
			return TryDecodeFromUtf16(chars, bytes, out charsProcessed);
		}

		public static bool TryDecodeFromUtf16(ReadOnlySpan<char> chars, Span<byte> bytes, out int charsProcessed)
		{
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			int num4 = 0;
			while (num2 < bytes.Length)
			{
				num3 = FromChar(chars[num + 1]);
				num4 = FromChar(chars[num]);
				if ((num3 | num4) == 255)
				{
					break;
				}
				bytes[num2++] = (byte)((num4 << 4) | num3);
				num += 2;
			}
			if (num3 == 255)
			{
				num++;
			}
			charsProcessed = num;
			return (num3 | num4) != 255;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static int FromChar(int c)
		{
			if (c < CharToHexLookup.Length)
			{
				return CharToHexLookup[c];
			}
			return 255;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static int FromUpperChar(int c)
		{
			if (c <= 71)
			{
				return CharToHexLookup[c];
			}
			return 255;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static int FromLowerChar(int c)
		{
			switch (c)
			{
			case 48:
			case 49:
			case 50:
			case 51:
			case 52:
			case 53:
			case 54:
			case 55:
			case 56:
			case 57:
				return c - 48;
			case 97:
			case 98:
			case 99:
			case 100:
			case 101:
			case 102:
				return c - 97 + 10;
			default:
				return 255;
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static bool IsHexChar(int c)
		{
			if (IntPtr.Size == 8)
			{
				ulong num = (uint)(c - 48);
				ulong num2 = (ulong)(-17875860044349952L << (int)num);
				ulong num3 = num - 64;
				return (long)(num2 & num3) < 0L;
			}
			return FromChar(c) != 255;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static bool IsHexUpperChar(int c)
		{
			if ((uint)(c - 48) > 9u)
			{
				return (uint)(c - 65) <= 5u;
			}
			return true;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public static bool IsHexLowerChar(int c)
		{
			if ((uint)(c - 48) > 9u)
			{
				return (uint)(c - 97) <= 5u;
			}
			return true;
		}
	}
	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 Arg_EmptyOrNullString_Named => GetResourceString("Arg_EmptyOrNullString_Named");

		internal static string Arg_RankMultiDimNotSupported => GetResourceString("Arg_RankMultiDimNotSupported");

		internal static string Argument_EncodeDestinationTooSmall => GetResourceString("Argument_EncodeDestinationTooSmall");

		internal static string Argument_InvalidOffLen => GetResourceString("Argument_InvalidOffLen");

		internal static string Argument_InvalidOidValue => GetResourceString("Argument_InvalidOidValue");

		internal static string Argument_InvalidValue => GetResourceString("Argument_InvalidValue");

		internal static string Argument_InvalidRsaSignaturePadding => GetResourceString("Argument_InvalidRsaSignaturePadding");

		internal static string ArgumentOutOfRange_IndexMustBeLess => GetResourceString("ArgumentOutOfRange_IndexMustBeLess");

		internal static string ArgumentOutOfRange_IndexMustBeLessOrEqual => GetResourceString("ArgumentOutOfRange_IndexMustBeLessOrEqual");

		internal static string ArgumentOutOfRange_NeedPosNum => GetResourceString("ArgumentOutOfRange_NeedPosNum");

		internal static string Cryptography_AlgKdfRequiresChars => GetResourceString("Cryptography_AlgKdfRequiresChars");

		internal static string Cryptography_BadHashValue => GetResourceString("Cryptography_BadHashValue");

		internal static string Cryptography_BadSignature => GetResourceString("Cryptography_BadSignature");

		internal static string Cryptography_Cms_CannotDetermineSignatureAlgorithm => GetResourceString("Cryptography_Cms_CannotDetermineSignatureAlgorithm");

		internal static string Cryptography_Cms_IncompleteCertChain => GetResourceString("Cryptography_Cms_IncompleteCertChain");

		internal static string Cryptography_Cms_Invalid_Originator_Identifier_Choice => GetResourceString("Cryptography_Cms_Invalid_Originator_Identifier_Choice");

		internal static string Cryptography_Cms_Invalid_Subject_Identifier_Type => GetResourceString("Cryptography_Cms_Invalid_Subject_Identifier_Type");

		internal static string Cryptography_Cms_InvalidMessageType => GetResourceString("Cryptography_Cms_InvalidMessageType");

		internal static string Cryptography_Cms_InvalidSignerHashForSignatureAlg => GetResourceString("Cryptography_Cms_InvalidSignerHashForSignatureAlg");

		internal static string Cryptography_Cms_Key_Agree_Date_Not_Available => GetResourceString("Cryptography_Cms_Key_Agree_Date_Not_Available");

		internal static string Cryptography_Cms_MessageNotEncrypted => GetResourceString("Cryptography_Cms_MessageNotEncrypted");

		internal static string Cryptography_Cms_MessageNotSigned => GetResourceString("Cryptography_Cms_MessageNotSigned");

		internal static string Cryptography_Cms_MissingAuthenticatedAttribute => GetResourceString("Cryptography_Cms_MissingAuthenticatedAttribute");

		internal static string Cryptography_Cms_NoCounterCounterSigner => GetResourceString("Cryptography_Cms_NoCounterCounterSigner");

		internal static string Cryptography_Cms_NoRecipients => GetResourceString("Cryptography_Cms_NoRecipients");

		internal static string Cryptography_Cms_NoSignerCert => GetResourceString("Cryptography_Cms_NoSignerCert");

		internal static string Cryptography_Cms_NoSignerCertSilent => GetResourceString("Cryptography_Cms_NoSignerCertSilent");

		internal static string Cryptography_Cms_NoSignerAtIndex => GetResourceString("Cryptography_Cms_NoSignerAtIndex");

		internal static string Cryptography_Cms_RecipientNotFound => GetResourceString("Cryptography_Cms_RecipientNotFound");

		internal static string Cryptography_Cms_RecipientType_NotSupported => GetResourceString("Cryptography_Cms_RecipientType_NotSupported");

		internal static string Cryptography_Cms_Sign_Empty_Content => GetResourceString("Cryptography_Cms_Sign_Empty_Content");

		internal static string Cryptography_Cms_Sign_No_Signature_First_Signer => GetResourceString("Cryptography_Cms_Sign_No_Signature_First_Signer");

		internal static string Cryptography_Cms_SignerNotFound => GetResourceString("Cryptography_Cms_SignerNotFound");

		internal static string Cryptography_Cms_Signing_RequiresPrivateKey => GetResourceString("Cryptography_Cms_Signing_RequiresPrivateKey");

		internal static string Cryptography_Cms_Ktri_RSARequired => GetResourceString("Cryptography_Cms_Ktri_RSARequired");

		internal static string Cryptography_Cms_Recipient_RSARequired_RSAPaddingModeSupplied => GetResourceString("Cryptography_Cms_Recipient_RSARequired_RSAPaddingModeSupplied");

		internal static string Cryptography_Cms_TrustFailure => GetResourceString("Cryptography_Cms_TrustFailure");

		internal static string Cryptography_Cms_UnknownAlgorithm => GetResourceString("Cryptography_Cms_UnknownAlgorithm");

		internal static string Cryptography_Cms_UnknownKeySpec => GetResourceString("Cryptography_Cms_UnknownKeySpec");

		internal static string Cryptography_Cms_WrongKeyUsage => GetResourceString("Cryptography_Cms_WrongKeyUsage");

		internal static string Cryptography_NotValidPublicOrPrivateKey => GetResourceString("Cryptography_NotValidPublicOrPrivateKey");

		internal static string Cryptography_Pkcs12_CannotProcessEncryptedSafeContents => GetResourceString("Cryptography_Pkcs12_CannotProcessEncryptedSafeContents");

		internal static string Cryptography_Pkcs12_CertBagNotX509 => GetResourceString("Cryptography_Pkcs12_CertBagNotX509");

		internal static string Cryptography_Pkcs12_PfxIsSealed => GetResourceString("Cryptography_Pkcs12_PfxIsSealed");

		internal static string Cryptography_Pkcs12_PfxMustBeSealed => GetResourceString("Cryptography_Pkcs12_PfxMustBeSealed");

		internal static string Cryptography_Pkcs12_SafeContentsIsEncrypted => GetResourceString("Cryptography_Pkcs12_SafeContentsIsEncrypted");

		internal static string Cryptography_Pkcs12_SafeContentsIsReadOnly => GetResourceString("Cryptography_Pkcs12_SafeContentsIsReadOnly");

		internal static string Cryptography_Pkcs12_WrongModeForDecrypt => GetResourceString("Cryptography_Pkcs12_WrongModeForDecrypt");

		internal static string Cryptography_Pkcs12_WrongModeForVerify => GetResourceString("Cryptography_Pkcs12_WrongModeForVerify");

		internal static string Cryptography_Pkcs_InvalidSignatureParameters => GetResourceString("Cryptography_Pkcs_InvalidSignatureParameters");

		internal static string Cryptography_Pkcs8_EncryptedReadFailed => GetResourceString("Cryptography_Pkcs8_EncryptedReadFailed");

		internal static string Cryptography_Pkcs9_AttributeMismatch => GetResourceString("Cryptography_Pkcs9_AttributeMismatch");

		internal static string Cryptography_Pkcs9_MultipleSigningTimeNotAllowed => GetResourceString("Cryptography_Pkcs9_MultipleSigningTimeNotAllowed");

		internal static string Cryptography_Pkcs_PssParametersMissing => GetResourceString("Cryptography_Pkcs_PssParametersMissing");

		internal static string Cryptography_Pkcs_PssParametersHashMismatch => GetResourceString("Cryptography_Pkcs_PssParametersHashMismatch");

		internal static string Cryptography_Pkcs_PssParametersMgfHashMismatch => GetResourceString("Cryptography_Pkcs_PssParametersMgfHashMismatch");

		internal static string Cryptography_Pkcs_PssParametersMgfNotSupported => GetResourceString("Cryptography_Pkcs_PssParametersMgfNotSupported");

		internal static string Cryptography_Pkcs_PssParametersSaltMismatch => GetResourceString("Cryptography_Pkcs_PssParametersSaltMismatch");

		internal static string Cryptography_TimestampReq_BadNonce => GetResourceString("Cryptography_TimestampReq_BadNonce");

		internal static string Cryptography_TimestampReq_BadResponse => GetResourceString("Cryptography_TimestampReq_BadResponse");

		internal static string Cryptography_TimestampReq_Failure => GetResourceString("Cryptography_TimestampReq_Failure");

		internal static string Cryptography_TimestampReq_NoCertFound => GetResourceString("Cryptography_TimestampReq_NoCertFound");

		internal static string Cryptography_TimestampReq_UnexpectedCertFound => GetResourceString("Cryptography_TimestampReq_UnexpectedCertFound");

		internal static string InvalidOperation_DuplicateItemNotAllowed => GetResourceString("InvalidOperation_DuplicateItemNotAllowed");

		internal static string InvalidOperation_WrongOidInAsnCollection => GetResourceString("InvalidOperation_WrongOidInAsnCollection");

		internal static string PlatformNotSupported_CryptographyPkcs => GetResourceString("PlatformNotSupported_CryptographyPkcs");

		internal static string Cryptography_AlgorithmNotSupported => GetResourceString("Cryptography_AlgorithmNotSupported");

		internal static string Cryptography_Der_Invalid_Encoding => GetResourceString("Cryptography_Der_Invalid_Encoding");

		internal static string Cryptography_Invalid_IA5String => GetResourceString("Cryptography_Invalid_IA5String");

		internal static string Cryptography_UnknownAlgorithmIdentifier => GetResourceString("Cryptography_UnknownAlgorithmIdentifier");

		internal static string Cryptography_UnknownHashAlgorithm => GetResourceString("Cryptography_UnknownHashAlgorithm");

		internal static string Cryptography_Cms_NoAttributeFound => GetResourceString("Cryptography_Cms_NoAttributeFound");

		internal static string Cryptography_Cms_NoCertificateFound => GetResourceString("Cryptography_Cms_NoCertificateFound");

		internal static string Cryptography_Cms_CertificateAlreadyInCollection => GetResourceString("Cryptography_Cms_CertificateAlreadyInCollection");

		internal static string Cryptography_Cms_InvalidSymmetricKey => GetResourceString("Cryptography_Cms_InvalidSymmetricKey");

		internal static string Cryptography_X509_PfxWithoutPassword_MaxAllowedIterationsExceeded => GetResourceString("Cryptography_X509_PfxWithoutPassword_MaxAllowedIterationsExceeded");

		internal static string Cryptography_X509_PfxWithoutPassword_ProblemFound => GetResourceString("Cryptography_X509_PfxWithoutPassword_ProblemFound");

		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.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.Versioning
{
	internal abstract class OSPlatformAttribute : Attribute
	{
		public string PlatformName { get; }

		private protected OSPlatformAttribute(string platformName)
		{
			PlatformName = platformName;
		}
	}
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = false)]
	internal sealed class TargetPlatformAttribute : OSPlatformAttribute
	{
		public TargetPlatformAttribute(string platformName)
			: base(platformName)
		{
		}
	}
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface, AllowMultiple = true, Inherited = false)]
	internal sealed class SupportedOSPlatformAttribute : OSPlatformAttribute
	{
		public SupportedOSPlatformAttribute(string platformName)
			: base(platformName)
		{
		}
	}
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface, AllowMultiple = true, Inherited = false)]
	internal sealed class UnsupportedOSPlatformAttribute : OSPlatformAttribute
	{
		public string Message { get; }

		public UnsupportedOSPlatformAttribute(string platformName)
			: base(platformName)
		{
		}

		public UnsupportedOSPlatformAttribute(string platformName, string message)
			: base(platformName)
		{
			Message = message;
		}
	}
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface, AllowMultiple = true, Inherited = false)]
	internal sealed class ObsoletedOSPlatformAttribute : OSPlatformAttribute
	{
		public string Message { get; }

		public string Url { get; set; }

		public ObsoletedOSPlatformAttribute(string platformName)
			: base(platformName)
		{
		}

		public ObsoletedOSPlatformAttribute(string platformName, string message)
			: base(platformName)
		{
			Message = message;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = false)]
	internal sealed class SupportedOSPlatformGuardAttribute : OSPlatformAttribute
	{
		public SupportedOSPlatformGuardAttribute(string platformName)
			: base(platformName)
		{
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = false)]
	internal sealed class UnsupportedOSPlatformGuardAttribute : OSPlatformAttribute
	{
		public UnsupportedOSPlatformGuardAttribute(string platformName)
			: base(platformName)
		{
		}
	}
}
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.Buffers
{
	internal sealed class PointerMemoryManager<T> : MemoryManager<T> where T : struct
	{
		private unsafe readonly void* _pointer;

		private readonly int _length;

		internal unsafe PointerMemoryManager(void* pointer, int length)
		{
			_pointer = pointer;
			_length = length;
		}

		protected override void Dispose(bool disposing)
		{
		}

		public unsafe override Span<T> GetSpan()
		{
			return new Span<T>(_pointer, _length);
		}

		public override MemoryHandle Pin(int elementIndex = 0)
		{
			throw new NotSupportedException();
		}

		public override void Unpin()
		{
		}
	}
}
namespace System.Security.Cryptography
{
	public sealed class CryptographicAttributeObject
	{
		private readonly Oid _oid;

		public Oid Oid => _oid.CopyOid();

		public AsnEncodedDataCollection Values { get; }

		public CryptographicAttributeObject(Oid oid)
			: this(oid, new AsnEncodedDataCollection())
		{
		}

		public CryptographicAttributeObject(Oid oid, AsnEncodedDataCollection? values)
		{
			_oid = oid.CopyOid();
			if (values == null)
			{
				Values = new AsnEncodedDataCollection();
				return;
			}
			AsnEncodedDataEnumerator enumerator = values.GetEnumerator();
			while (enumerator.MoveNext())
			{
				AsnEncodedData current = enumerator.Current;
				if (current.Oid == null)
				{
					throw new ArgumentException(System.SR.Argument_InvalidOidValue, "values");
				}
				if (!string.Equals(current.Oid.Value, oid.Value, StringComparison.Ordinal))
				{
					throw new InvalidOperationException(System.SR.Format(System.SR.InvalidOperation_WrongOidInAsnCollection, oid.Value, current.Oid.Value));
				}
			}
			Values = values;
		}
	}
	public sealed class CryptographicAttributeObjectCollection : ICollection, IEnumerable
	{
		private readonly List<CryptographicAttributeObject> _list;

		public CryptographicAttributeObject this[int index] => _list[index];

		public int Count => _list.Count;

		public bool IsSynchronized => false;

		public object SyncRoot => this;

		public CryptographicAttributeObjectCollection()
		{
			_list = new List<CryptographicAttributeObject>();
		}

		public CryptographicAttributeObjectCollection(CryptographicAttributeObject attribute)
		{
			_list = new List<CryptographicAttributeObject>();
			_list.Add(attribute);
		}

		public int Add(AsnEncodedData asnEncodedData)
		{
			if (asnEncodedData == null)
			{
				throw new ArgumentNullException("asnEncodedData");
			}
			return Add(new CryptographicAttributeObject(asnEncodedData.Oid, new AsnEncodedDataCollection(asnEncodedData)));
		}

		public int Add(CryptographicAttributeObject attribute)
		{
			if (attribute == null)
			{
				throw new ArgumentNullException("attribute");
			}
			string value = attribute.Oid.Value;
			for (int i = 0; i < _list.Count; i++)
			{
				CryptographicAttributeObject cryptographicAttributeObject = _list[i];
				if (cryptographicAttributeObject.Values == attribute.Values)
				{
					throw new InvalidOperationException(System.SR.InvalidOperation_DuplicateItemNotAllowed);
				}
				string value2 = cryptographicAttributeObject.Oid.Value;
				if (string.Equals(value, value2, StringComparison.OrdinalIgnoreCase))
				{
					if (string.Equals(value, "1.2.840.113549.1.9.5", StringComparison.OrdinalIgnoreCase))
					{
						throw new CryptographicException(System.SR.Cryptography_Pkcs9_MultipleSigningTimeNotAllowed);
					}
					AsnEncodedDataEnumerator enumerator = attribute.Values.GetEnumerator();
					while (enumerator.MoveNext())
					{
						AsnEncodedData current = enumerator.Current;
						cryptographicAttributeObject.Values.Add(current);
					}
					return i;
				}
			}
			int count = _list.Count;
			_list.Add(attribute);
			return count;
		}

		internal void AddWithoutMerge(CryptographicAttributeObject attribute)
		{
			_list.Add(attribute);
		}

		public void Remove(CryptographicAttributeObject attribute)
		{
			if (attribute == null)
			{
				throw new ArgumentNullException("attribute");
			}
			_list.Remove(attribute);
		}

		public CryptographicAttributeObjectEnumerator GetEnumerator()
		{
			return new CryptographicAttributeObjectEnumerator(this);
		}

		IEnumerator IEnumerable.GetEnumerator()
		{
			return new CryptographicAttributeObjectEnumerator(this);
		}

		void ICollection.CopyTo(Array array, int index)
		{
			if (array == null)
			{
				throw new ArgumentNullException("array");
			}
			if (array.Rank != 1)
			{
				throw new ArgumentException(System.SR.Arg_RankMultiDimNotSupported);
			}
			if (index < 0 || index >= array.Length)
			{
				throw new ArgumentOutOfRangeException("index", System.SR.ArgumentOutOfRange_IndexMustBeLess);
			}
			if (index > array.Length - Count)
			{
				throw new ArgumentException(System.SR.Argument_InvalidOffLen);
			}
			for (int i = 0; i < Count; i++)
			{
				array.SetValue(this[i], index);
				index++;
			}
		}

		public void CopyTo(CryptographicAttributeObject[] array, int index)
		{
			if (array == null)
			{
				throw new ArgumentNullException("array");
			}
			if (index < 0 || index >= array.Length)
			{
				throw new ArgumentOutOfRangeException("index", System.SR.ArgumentOutOfRange_IndexMustBeLess);
			}
			if (index > array.Length - Count)
			{
				throw new ArgumentException(System.SR.Argument_InvalidOffLen);
			}
			_list.CopyTo(array, index);
		}
	}
	public sealed class CryptographicAttributeObjectEnumerator : IEnumerator
	{
		private readonly CryptographicAttributeObjectCollection _attributes;

		private int _current;

		public CryptographicAttributeObject Current => _attributes[_current];

		object IEnumerator.Current => _attributes[_current];

		internal CryptographicAttributeObjectEnumerator(CryptographicAttributeObjectCollection attributes)
		{
			_attributes = attributes;
			_current = -1;
		}

		public bool MoveNext()
		{
			if (_current >= _attributes.Count - 1)
			{
				return false;
			}
			_current++;
			return true;
		}

		public void Reset()
		{
			_current = -1;
		}
	}
	internal static class CryptoPool
	{
		internal const int ClearAll = -1;

		internal static byte[] Rent(int minimumLength)
		{
			return ArrayPool<byte>.Shared.Rent(minimumLength);
		}

		internal static void Return(ArraySegment<byte> arraySegment)
		{
			Return(arraySegment.Array, arraySegment.Count);
		}

		internal static void Return(byte[] array, int clearSize = -1)
		{
			bool flag = clearSize < 0;
			if (!flag && clearSize != 0)
			{
				CryptographicOperations.ZeroMemory(array.AsSpan(0, clearSize));
			}
			ArrayPool<byte>.Shared.Return(array, flag);
		}
	}
	internal static class Oids
	{
		internal const string Rc2Cbc = "1.2.840.113549.3.2";

		internal const string Rc4 = "1.2.840.113549.3.4";

		internal const string TripleDesCbc = "1.2.840.113549.3.7";

		internal const string DesCbc = "1.3.14.3.2.7";

		internal const string Aes128Cbc = "2.16.840.1.101.3.4.1.2";

		internal const string Aes192Cbc = "2.16.840.1.101.3.4.1.22";

		internal const string Aes256Cbc = "2.16.840.1.101.3.4.1.42";

		internal const string Dsa = "1.2.840.10040.4.1";

		internal const string Rsa = "1.2.840.113549.1.1.1";

		internal const string RsaOaep = "1.2.840.113549.1.1.7";

		internal const string RsaPss = "1.2.840.113549.1.1.10";

		internal const string RsaPkcs1Md5 = "1.2.840.113549.1.1.4";

		internal const string RsaPkcs1Sha1 = "1.2.840.113549.1.1.5";

		internal const string RsaPkcs1Sha256 = "1.2.840.113549.1.1.11";

		internal const string RsaPkcs1Sha384 = "1.2.840.113549.1.1.12";

		internal const string RsaPkcs1Sha512 = "1.2.840.113549.1.1.13";

		internal const string RsaPkcs1Sha3_256 = "2.16.840.1.101.3.4.3.14";

		internal const string RsaPkcs1Sha3_384 = "2.16.840.1.101.3.4.3.15";

		internal const string RsaPkcs1Sha3_512 = "2.16.840.1.101.3.4.3.16";

		internal const string Esdh = "1.2.840.113549.1.9.16.3.5";

		internal const string EcDiffieHellman = "1.3.132.1.12";

		internal const string DiffieHellman = "1.2.840.10046.2.1";

		internal const string DiffieHellmanPkcs3 = "1.2.840.113549.1.3.1";

		internal const string SigningTime = "1.2.840.113549.1.9.5";

		internal const string ContentType = "1.2.840.113549.1.9.3";

		internal const string DocumentDescription = "1.3.6.1.4.1.311.88.2.2";

		internal const string MessageDigest = "1.2.840.113549.1.9.4";

		internal const string CounterSigner = "1.2.840.113549.1.9.6";

		internal const string SigningCertificate = "1.2.840.113549.1.9.16.2.12";

		internal const string SigningCertificateV2 = "1.2.840.113549.1.9.16.2.47";

		internal const string DocumentName = "1.3.6.1.4.1.311.88.2.1";

		internal const string LocalKeyId = "1.2.840.113549.1.9.21";

		internal const string EnrollCertTypeExtension = "1.3.6.1.4.1.311.20.2";

		internal const string UserPrincipalName = "1.3.6.1.4.1.311.20.2.3";

		internal const string CertificateTemplate = "1.3.6.1.4.1.311.21.7";

		internal const string ApplicationCertPolicies = "1.3.6.1.4.1.311.21.10";

		internal const string AuthorityInformationAccess = "1.3.6.1.5.5.7.1.1";

		internal const string OcspEndpoint = "1.3.6.1.5.5.7.48.1";

		internal const string CertificateAuthorityIssuers = "1.3.6.1.5.5.7.48.2";

		internal const string Pkcs9ExtensionRequest = "1.2.840.113549.1.9.14";

		internal const string CmsRc2Wrap = "1.2.840.113549.1.9.16.3.7";

		internal const string Cms3DesWrap = "1.2.840.113549.1.9.16.3.6";

		internal const string Pkcs7Data = "1.2.840.113549.1.7.1";

		internal const string Pkcs