86 lines
3.2 KiB
C#
86 lines
3.2 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.using System;
|
|
|
|
using System;
|
|
using System.Security.Cryptography;
|
|
using Microsoft.AspNetCore.Testing.xunit;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Logging.Testing;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace Microsoft.AspNetCore.Identity.Service
|
|
{
|
|
public class CryptographyIssuesTests : LoggedTest
|
|
{
|
|
public CryptographyIssuesTests(ITestOutputHelper output) : base(output)
|
|
{
|
|
}
|
|
|
|
[ConditionalFact(Skip = "https://github.com/aspnet/Identity/issues/1630")]
|
|
[FrameworkSkipCondition(RuntimeFrameworks.CoreCLR)]
|
|
public void ImportRsaParameters_CLR()
|
|
{
|
|
RunTest(nameof(ImportRsaParameters_CLR));
|
|
}
|
|
|
|
[ConditionalFact(Skip = "https://github.com/aspnet/Identity/issues/1630")]
|
|
[FrameworkSkipCondition(RuntimeFrameworks.CLR)]
|
|
public void ImportRsaParameters_CoreCLR()
|
|
{
|
|
RunTest(nameof(ImportRsaParameters_CoreCLR));
|
|
}
|
|
|
|
private void RunTest(string testFlavor)
|
|
{
|
|
using (StartLog(out var loggerFactory, testFlavor))
|
|
{
|
|
var logger = loggerFactory.CreateLogger(testFlavor);
|
|
for (var i = 0; i < 100; i++)
|
|
{
|
|
var key = CryptoUtilities.CreateTestKey();
|
|
try
|
|
{
|
|
CryptographyHelpers.GetRSAParameters(new SigningCredentials(key, "RS256"));
|
|
}
|
|
catch (CryptographicException e)
|
|
{
|
|
LogKeyData(logger, i, key, e);
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void LogKeyData(ILogger logger, int i, SecurityKey key, CryptographicException e)
|
|
{
|
|
logger.LogCritical(e.Message);
|
|
logger.LogCritical($"Iteration {i}:");
|
|
logger.LogCritical($"Key length: {key.KeySize}");
|
|
var data = key as RsaSecurityKey;
|
|
logger.LogCritical($"RSA Key length: {data.Rsa.KeySize}");
|
|
RSAParameters parameters = data.Rsa.ExportParameters(includePrivateParameters: true);
|
|
LogParameter(logger, "M", parameters.Modulus);
|
|
LogParameter(logger, "E", parameters.Exponent);
|
|
LogParameter(logger, "D", parameters.D);
|
|
LogParameter(logger, "P", parameters.P);
|
|
LogParameter(logger, "Q", parameters.Q);
|
|
LogParameter(logger, "1/Q", parameters.InverseQ);
|
|
LogParameter(logger, "DP", parameters.DP);
|
|
LogParameter(logger, "DQ", parameters.DQ);
|
|
}
|
|
|
|
private static void LogParameter(ILogger logger, string name, byte[] parameter)
|
|
{
|
|
if (parameter == null)
|
|
{
|
|
logger.LogCritical($"Key parameter '{name}' is 'null'");
|
|
}
|
|
else
|
|
{
|
|
logger.LogCritical($"Key parameter '{name}' (Base64Encoded): '{Convert.ToBase64String(parameter)}'");
|
|
}
|
|
}
|
|
}
|
|
}
|