Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,62 @@ namespace Test.Cryptography
{
internal static class PlatformSupport
{
private static readonly RSAParameters s_rsa384Parameters = new RSAParameters
{
Modulus = new byte[]
{
0xDA, 0xCC, 0x22, 0xD8, 0x6E, 0x67, 0x15, 0x75,
0x03, 0x2E, 0x31, 0xF2, 0x06, 0xDC, 0xFC, 0x19,
0x2C, 0x65, 0xE2, 0xD5, 0x10, 0x89, 0xE5, 0x11,
0x2D, 0x09, 0x6F, 0x28, 0x82, 0xAF, 0xDB, 0x5B,
0x78, 0xCD, 0xB6, 0x57, 0x2F, 0xD2, 0xF6, 0x1D,
0xB3, 0x90, 0x47, 0x22, 0x32, 0xE3, 0xD9, 0xF5,
},
Exponent = new byte[]
{
0x01, 0x00, 0x01,
},
D = new byte[]
{
0x7A, 0x59, 0xBD, 0x02, 0x9A, 0x7A, 0x3A, 0x9D,
0x7C, 0x71, 0xD0, 0xAC, 0x2E, 0xFA, 0x54, 0x5F,
0x1F, 0x5C, 0xBA, 0x43, 0xBB, 0x43, 0xE1, 0x3B,
0x78, 0x77, 0xAF, 0x82, 0xEF, 0xEB, 0x40, 0xC3,
0x8D, 0x1E, 0xCD, 0x73, 0x7F, 0x5B, 0xF9, 0xC8,
0x96, 0x92, 0xB2, 0x9C, 0x87, 0x5E, 0xD6, 0xE1,
},
P = new byte[]
{
0xFA, 0xDB, 0xD7, 0xF8, 0xA1, 0x8B, 0x3A, 0x75,
0xA4, 0xF6, 0xDF, 0xAE, 0xE3, 0x42, 0x6F, 0xD0,
0xFF, 0x8B, 0xAC, 0x74, 0xB6, 0x72, 0x2D, 0xEF,
},
DP = new byte[]
{
0x24, 0xFF, 0xBB, 0xD0, 0xDD, 0xF2, 0xAD, 0x02,
0xA0, 0xFC, 0x10, 0x6D, 0xB8, 0xF3, 0x19, 0x8E,
0xD7, 0xC2, 0x00, 0x03, 0x8E, 0xCD, 0x34, 0x5D,
},
Q = new byte[]
{
0xDF, 0x48, 0x14, 0x4A, 0x6D, 0x88, 0xA7, 0x80,
0x14, 0x4F, 0xCE, 0xA6, 0x6B, 0xDC, 0xDA, 0x50,
0xD6, 0x07, 0x1C, 0x54, 0xE5, 0xD0, 0xDA, 0x5B,
},
DQ = new byte[]
{
0x85, 0xDF, 0x73, 0xBB, 0x04, 0x5D, 0x91, 0x00,
0x6C, 0x2D, 0x45, 0x9B, 0xE6, 0xC4, 0x2E, 0x69,
0x95, 0x4A, 0x02, 0x24, 0xAC, 0xFE, 0x42, 0x4D,
},
InverseQ = new byte[]
{
0x1A, 0x3A, 0x76, 0x9C, 0x21, 0x26, 0x2B, 0x84,
0xCA, 0x9C, 0xA9, 0x62, 0x0F, 0x98, 0xD2, 0xF4,
0x3E, 0xAC, 0xCC, 0xD4, 0x87, 0x9A, 0x6F, 0xFD,
},
};

private static Lazy<bool> s_lazyPlatformCryptoProviderFunctional = new Lazy<bool>(static () =>
{
#if !NETFRAMEWORK
Expand Down Expand Up @@ -44,6 +100,31 @@ internal static class PlatformSupport
}
});

private static readonly Lazy<bool> s_lazyIsRSA384Supported = new Lazy<bool>(() =>
{
// Linux and Apple are known to support RSA-384, so return true without checking.
if (PlatformDetection.IsLinux || PlatformDetection.IsOSXLike)
{
return true;
}

RSA rsa = RSA.Create();

try
{
rsa.ImportParameters(s_rsa384Parameters);
return true;
}
catch (CryptographicException)
{
return false;
}
finally
{
rsa.Dispose();
}
});

// Platforms that use Apple Cryptography
internal const TestPlatforms AppleCrypto = TestPlatforms.OSX | TestPlatforms.iOS | TestPlatforms.tvOS | TestPlatforms.MacCatalyst;
internal const TestPlatforms MobileAppleCrypto = TestPlatforms.iOS | TestPlatforms.tvOS | TestPlatforms.MacCatalyst;
Expand All @@ -54,6 +135,8 @@ internal static class PlatformSupport
// Whether or not the current platform supports RC2
internal static readonly bool IsRC2Supported = !PlatformDetection.IsAndroid;

internal static bool IsRSA384Supported => s_lazyIsRSA384Supported.Value;

#if NETCOREAPP
internal static readonly bool IsAndroidVersionAtLeast31 = OperatingSystem.IsAndroidVersionAtLeast(31);
#else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,17 @@
// The .NET Foundation licenses this file to you under the MIT license.

using System.Runtime.InteropServices;
using Test.Cryptography;

namespace System.Security.Cryptography.Rsa.Tests
{
public class RSACngProvider : IRSAProvider
{
private bool? _supports384PrivateKey;

public RSA Create() => new RSACng();

public RSA Create(int keySize) => new RSACng(keySize);

public bool Supports384PrivateKey
{
get
{
if (!_supports384PrivateKey.HasValue)
{
// For Windows 7 (Microsoft Windows 6.1) and Windows 8 (Microsoft Windows 6.2) this is false for RSACng.
_supports384PrivateKey =
!RuntimeInformation.OSDescription.Contains("Windows 6.1") &&
!RuntimeInformation.OSDescription.Contains("Windows 6.2");
}

return _supports384PrivateKey.Value;
}
}
public bool Supports384PrivateKey => PlatformSupport.IsRSA384Supported;

public bool SupportsLargeExponent => true;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Runtime.InteropServices;
using System.Security.Cryptography.Tests;
using Test.Cryptography;

namespace System.Security.Cryptography.Rsa.Tests
{
Expand All @@ -15,7 +16,7 @@ public class RSACryptoServiceProviderProvider : IRSAProvider

public RSA Create(int keySize) => new RSACryptoServiceProvider(keySize);

public bool Supports384PrivateKey => true;
public bool Supports384PrivateKey => PlatformSupport.IsRSA384Supported;

public bool SupportsLargeExponent => false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@

using System.Runtime.InteropServices;
using System.Security.Cryptography.Tests;
using Test.Cryptography;

namespace System.Security.Cryptography.Rsa.Tests
{
public class DefaultRSAProvider : IRSAProvider
{
private bool? _supports384PrivateKey;
private bool? _supportsSha1Signatures;
private bool? _supportsMd5Signatures;

Expand All @@ -26,21 +26,7 @@ public RSA Create(int keySize)
#endif
}

public bool Supports384PrivateKey
{
get
{
if (!_supports384PrivateKey.HasValue)
{
// For Windows 7 (Microsoft Windows 6.1) and Windows 8 (Microsoft Windows 6.2) this is false for RSACng.
_supports384PrivateKey = !RuntimeInformation.OSDescription.Contains("Windows 6.1") &&
!RuntimeInformation.OSDescription.Contains("Windows 6.2");
}

return _supports384PrivateKey.Value;
}
}

public bool Supports384PrivateKey => PlatformSupport.IsRSA384Supported;
public bool SupportsSha1Signatures => _supportsSha1Signatures ??= SignatureSupport.CanProduceSha1Signature(Create());
public bool SupportsMd5Signatures => _supportsMd5Signatures ??= SignatureSupport.CanProduceMd5Signature(Create());

Expand Down
Loading