aspnetcore/test/Service.Core.Test/CryptographyIssuesTests.cs

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)}'");
}
}
}
}