From 5e0509e00ee714824f0b859a8be2b6da469a3d0a Mon Sep 17 00:00:00 2001 From: Alexander Scheel Date: Mon, 12 Feb 2024 12:37:42 -0500 Subject: Correctly disable tests on Linux The SP800-38G tests fail to execute on Linux, due to the inability to set environment variables documented in a dotnet runtime issue. This uses RuntimeInformation to conditionally exclude the test from being run on Linux. Switch from SupportedOSPlatform to RuntimeInformation.IsOSPlatform for TestRsaInterop Guard this by a NET 6.0 requirement so that it doesn't affect old Windows-only .NET framework versions. Note: this only appears to fail on Linux when building from the CLI: > dotnet test -v:normal -l \"console;verbosity=detailed\" Building from an IDE (e.g., Rider) does not seem to be affected. Signed-off-by: Alexander Scheel --- crypto/test/src/crypto/test/SP80038GTest.cs | 34 +++++++++++++++++-------- crypto/test/src/security/test/TestDotNetUtil.cs | 17 ++++++++++--- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/crypto/test/src/crypto/test/SP80038GTest.cs b/crypto/test/src/crypto/test/SP80038GTest.cs index c1eac2a24..13f67e485 100644 --- a/crypto/test/src/crypto/test/SP80038GTest.cs +++ b/crypto/test/src/crypto/test/SP80038GTest.cs @@ -1,5 +1,9 @@ using System; +#if NET6_0_OR_GREATER +using System.Runtime.InteropServices; +#endif + using NUnit.Framework; using Org.BouncyCastle.Crypto.Utilities; @@ -146,7 +150,7 @@ namespace Org.BouncyCastle.Crypto.Tests try { fpeEngine.ProcessBlock(plainText, 0, plainText.Length, plainText, 0); - Fail("no exception"); + Fail("no exception - ImplTestFF1 first"); } catch (ArgumentException e) { @@ -156,7 +160,7 @@ namespace Org.BouncyCastle.Crypto.Tests try { fpeEngine.ProcessBlock(new byte[] { 1 }, 0, 1, plainText, 0); - Fail("no exception"); + Fail("no exception - ImplTestFF1 second"); } catch (ArgumentException e) { @@ -217,7 +221,7 @@ namespace Org.BouncyCastle.Crypto.Tests try { fpeEngine.ProcessBlock(plainText, 0, plainText.Length, plainText, 0); - Fail("no exception"); + Fail("no exception - ImplTestFF3_1 first"); } catch (ArgumentException e) { @@ -228,7 +232,7 @@ namespace Org.BouncyCastle.Crypto.Tests { fpeEngine.Init(true, new FpeParameters(new KeyParameter(key), 24, Hex.Decode("beef"))); - Fail("no exception"); + Fail("no exception - ImplTestFF3_1 second"); } catch (ArgumentException e) { @@ -277,7 +281,7 @@ namespace Org.BouncyCastle.Crypto.Tests try { ImplTestFF1(); - Fail("no exception"); + Fail("no exception - ImplTestDisable first"); } catch (InvalidOperationException e) { @@ -287,7 +291,7 @@ namespace Org.BouncyCastle.Crypto.Tests try { ImplTestFF3_1(); - Fail("no exception"); + Fail("no exception - ImplTestDisable second"); } catch (InvalidOperationException e) { @@ -299,7 +303,7 @@ namespace Org.BouncyCastle.Crypto.Tests try { ImplTestFF1(); - Fail("no exception"); + Fail("no exception - ImplTestDisable third"); } catch (InvalidOperationException e) { @@ -390,7 +394,7 @@ namespace Org.BouncyCastle.Crypto.Tests fpeEngine.Init(true, new FpeParameters(new KeyParameter(key), alphabetMapper.Radix, tweak)); ImplProcess(fpeEngine, new byte[] { 1, 2, 3 }); - Fail("no exception"); + Fail("no exception - ImplTestFF1Bounds first"); } catch (ArgumentException e) { @@ -405,7 +409,7 @@ namespace Org.BouncyCastle.Crypto.Tests alphabetMapper.Radix, tweak)); ImplProcess(fpeEngine, new byte[] { 1, 2, 3 }); - Fail("no exception"); + Fail("no exception - ImplTestFF1Bounds second"); } catch (ArgumentException e) { @@ -522,6 +526,11 @@ namespace Org.BouncyCastle.Crypto.Tests IsTrue("no match", Arrays.AreEqual(input, decrypted)); } + // On Linux platforms, ImplTestDisable requires setting + // environment variables, which isn't fully supported by + // dotnet due to libc's lack of locking semantics, which + // can result in race conditions reading and writing + // environment variables. public override void PerformTest() { ImplTestFF1(); @@ -532,7 +541,12 @@ namespace Org.BouncyCastle.Crypto.Tests ImplTestFF3_1w(); ImplTestFF3_1_255(); ImplTestFF3_1Bounds(); - ImplTestDisable(); +#if NET6_0_OR_GREATER + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + ImplTestDisable(); + } +#endif ImplTestUtility(); } diff --git a/crypto/test/src/security/test/TestDotNetUtil.cs b/crypto/test/src/security/test/TestDotNetUtil.cs index 5d0177ead..77a975c19 100644 --- a/crypto/test/src/security/test/TestDotNetUtil.cs +++ b/crypto/test/src/security/test/TestDotNetUtil.cs @@ -1,8 +1,14 @@ using System; using System.Collections.Generic; + #if NET5_0_OR_GREATER using System.Runtime.Versioning; #endif + +#if NET6_0_OR_GREATER +using System.Runtime.InteropServices; +#endif + using System.Security.Cryptography; using SystemX509 = System.Security.Cryptography.X509Certificates; @@ -52,13 +58,16 @@ namespace Org.BouncyCastle.Security.Tests } #endif -//#if NET5_0_OR_GREATER -#if NET6_0_OR_GREATER - [SupportedOSPlatform("windows")] -#endif [Test] public void TestRsaInterop() { +#if NET6_0_OR_GREATER + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return; + } +#endif + for (int i = 0; i < 10; ++i) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512); -- cgit 1.4.1