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