From b2e483e3d500989cac05c7faf2122560b5ee9e9b Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Fri, 30 Jul 2021 13:46:23 -0400 Subject: [PATCH] Enable skipped SSC.Algorithms tests on Andorid (#56573) DSAKeyGeneration.GenerateSecondMinKey and DSAKeyGeneration.GenerateMinKey no longer fail. Added validation in RSAAndroid.cs to make RSAXml.FromNonsenseXml pass. Fixes #50580 Fixes #50581 --- .../Security/Cryptography/RSAAndroid.cs | 44 +++++++++++++++++++ .../DSA/DSAKeyGeneration.cs | 2 - .../AlgorithmImplementations/RSA/RSAXml.cs | 2 +- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/libraries/Common/src/System/Security/Cryptography/RSAAndroid.cs b/src/libraries/Common/src/System/Security/Cryptography/RSAAndroid.cs index 6f5a3c88fba10..afe27f535cd26 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/RSAAndroid.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/RSAAndroid.cs @@ -381,6 +381,50 @@ public override void ImportParameters(RSAParameters parameters) ValidateParameters(ref parameters); ThrowIfDisposed(); + if (parameters.Exponent == null || parameters.Modulus == null) + { + throw new CryptographicException(SR.Cryptography_InvalidRsaParameters); + } + + // Check that either all parameters are not null or all are null, if a subset were set, then the parameters are invalid. + // If the parameters are all not null, verify the integrity of their lengths. + if (parameters.D == null) + { + if (parameters.P != null || + parameters.DP != null || + parameters.Q != null || + parameters.DQ != null || + parameters.InverseQ != null) + { + throw new CryptographicException(SR.Cryptography_InvalidRsaParameters); + } + } + else + { + if (parameters.P == null || + parameters.DP == null || + parameters.Q == null || + parameters.DQ == null || + parameters.InverseQ == null) + { + throw new CryptographicException(SR.Cryptography_InvalidRsaParameters); + } + + // Half, rounded up. + int halfModulusLength = (parameters.Modulus.Length + 1) / 2; + + // Matching the .NET Framework RSACryptoServiceProvider behavior, as that's the .NET de facto standard + if (parameters.D.Length != parameters.Modulus.Length || + parameters.P.Length != halfModulusLength || + parameters.Q.Length != halfModulusLength || + parameters.DP.Length != halfModulusLength || + parameters.DQ.Length != halfModulusLength || + parameters.InverseQ.Length != halfModulusLength) + { + throw new CryptographicException(SR.Cryptography_InvalidRsaParameters); + } + } + SafeRsaHandle key = Interop.AndroidCrypto.RsaCreate(); bool imported = false; diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/DSA/DSAKeyGeneration.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/DSA/DSAKeyGeneration.cs index bb65dd3d95017..d26dce7b36712 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/DSA/DSAKeyGeneration.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/DSA/DSAKeyGeneration.cs @@ -24,14 +24,12 @@ public static void VerifyDefaultKeySize_Fips186_2() } [ConditionalFact(nameof(SupportsKeyGeneration))] - [ActiveIssue("https://github.com/dotnet/runtime/issues/50580", TestPlatforms.Android)] public static void GenerateMinKey() { GenerateKey(dsa => GetMin(dsa.LegalKeySizes)); } [ConditionalFact(nameof(SupportsKeyGeneration), nameof(HasSecondMinSize))] - [ActiveIssue("https://github.com/dotnet/runtime/issues/50580", TestPlatforms.Android)] public static void GenerateSecondMinKey() { GenerateKey(dsa => GetSecondMin(dsa.LegalKeySizes)); diff --git a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAXml.cs b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAXml.cs index 0427e190772b5..666f9bea3c409 100644 --- a/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAXml.cs +++ b/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAXml.cs @@ -1340,7 +1340,7 @@ public static void FromInvalidXml() } [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/29515", TestPlatforms.OSX | TestPlatforms.Android)] + [ActiveIssue("https://github.com/dotnet/runtime/issues/29515", TestPlatforms.OSX)] public static void FromNonsenseXml() { // This is DiminishedDPParameters XML, but with a P that is way too long.