summary refs log tree commit diff
path: root/crypto/test
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2024-05-31 16:26:03 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2024-05-31 16:26:03 +0700
commitc01ec062d9bad1c532b03a39c3d8eb6873904b9b (patch)
tree56cccdb592c50ae6abfc1fce055a6d29b04cb0b9 /crypto/test
parentFix data length check (diff)
downloadBouncyCastle.NET-ed25519-c01ec062d9bad1c532b03a39c3d8eb6873904b9b.tar.xz
Thread-safe lazy init for test generators
Diffstat (limited to 'crypto/test')
-rw-r--r--crypto/test/src/cms/test/CMSTestUtil.cs102
1 files changed, 28 insertions, 74 deletions
diff --git a/crypto/test/src/cms/test/CMSTestUtil.cs b/crypto/test/src/cms/test/CMSTestUtil.cs
index e7ec50f53..74517910c 100644
--- a/crypto/test/src/cms/test/CMSTestUtil.cs
+++ b/crypto/test/src/cms/test/CMSTestUtil.cs
@@ -2,6 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Text;
+using System.Threading;
 
 using Org.BouncyCastle.Asn1;
 using Org.BouncyCastle.Asn1.CryptoPro;
@@ -80,86 +81,39 @@ namespace Org.BouncyCastle.Cms.Tests
 			+ "6asYwy151HshbPNYz+Cgeqs45KkVzh7bL/0e1r8sDVIaaGIkjHK3CqBABnfSayr3"
 			+ "Rd1yBoDdEv8Qb+3eEPH6ab9021AsLEnJ6LWTmybbOpMNZ3tv");
 
-		private static IAsymmetricCipherKeyPairGenerator Kpg
-		{
-			get
-			{
-				if (kpg == null)
-				{
-					kpg = GeneratorUtilities.GetKeyPairGenerator("RSA");
-					kpg.Init(new RsaKeyGenerationParameters(
-						BigInteger.ValueOf(17), Random, 1024, 25));
-				}
-
-				return kpg;
-			}
-		}
-
-		private static IAsymmetricCipherKeyPairGenerator GostKpg
-		{
-			get
-			{
-				if (gostKpg == null)
-				{
-					gostKpg = GeneratorUtilities.GetKeyPairGenerator("GOST3410");
-					gostKpg.Init(
-						new Gost3410KeyGenerationParameters(
-							Random,
-							CryptoProObjectIdentifiers.GostR3410x94CryptoProA));
-				}
+        public static IAsymmetricCipherKeyPairGenerator InitKpg(ref IAsymmetricCipherKeyPairGenerator kpg,
+			string algorithm, Func<KeyGenerationParameters> createParameters)
+        {
+            var current = Volatile.Read(ref kpg);
+            if (null != current)
+                return current;
 
-				return gostKpg;
-			}
-		}
+			var candidate = GeneratorUtilities.GetKeyPairGenerator(algorithm);
+			candidate.Init(createParameters());
 
-		private static IAsymmetricCipherKeyPairGenerator DsaKpg
-		{
-			get
-			{
-				if (dsaKpg == null)
-				{
-					DsaParameters dsaSpec = new DsaParameters(
-						new BigInteger("7434410770759874867539421675728577177024889699586189000788950934679315164676852047058354758883833299702695428196962057871264685291775577130504050839126673"),
-						new BigInteger("1138656671590261728308283492178581223478058193247"),
-						new BigInteger("4182906737723181805517018315469082619513954319976782448649747742951189003482834321192692620856488639629011570381138542789803819092529658402611668375788410"));
-					dsaKpg = GeneratorUtilities.GetKeyPairGenerator("DSA");
-					dsaKpg.Init(new DsaKeyGenerationParameters(Random, dsaSpec));
-				}
+            return Interlocked.CompareExchange(ref kpg, candidate, null) ?? candidate;
+        }
 
-				return dsaKpg;
-			}
-		}
+		private static IAsymmetricCipherKeyPairGenerator Kpg => InitKpg(ref kpg, "RSA", () =>
+			new RsaKeyGenerationParameters(BigInteger.ValueOf(17), Random, 1024, 25));
 
-		private static IAsymmetricCipherKeyPairGenerator ECGostKpg
-		{
-			get
-			{
-				if (ecGostKpg == null)
-				{
-					ecGostKpg = GeneratorUtilities.GetKeyPairGenerator("ECGOST3410");
-					ecGostKpg.Init(
-						new ECKeyGenerationParameters(
-							CryptoProObjectIdentifiers.GostR3410x2001CryptoProA,
-							new SecureRandom()));
-				}
+        private static IAsymmetricCipherKeyPairGenerator GostKpg => InitKpg(ref gostKpg, "GOST3410", () =>
+			new Gost3410KeyGenerationParameters(Random, CryptoProObjectIdentifiers.GostR3410x94CryptoProA));
 
-				return ecGostKpg;
-			}
-		}
-
-		private static IAsymmetricCipherKeyPairGenerator ECDsaKpg
+		private static IAsymmetricCipherKeyPairGenerator DsaKpg => InitKpg(ref dsaKpg, "DSA", () =>
 		{
-			get
-			{
-				if (ecDsaKpg == null)
-				{
-					ecDsaKpg = GeneratorUtilities.GetKeyPairGenerator("ECDSA");
-					ecDsaKpg.Init(new KeyGenerationParameters(Random, 239));
-				}
-
-				return ecDsaKpg;
-			}
-		}
+            DsaParameters dsaSpec = new DsaParameters(
+                new BigInteger("7434410770759874867539421675728577177024889699586189000788950934679315164676852047058354758883833299702695428196962057871264685291775577130504050839126673"),
+                new BigInteger("1138656671590261728308283492178581223478058193247"),
+                new BigInteger("4182906737723181805517018315469082619513954319976782448649747742951189003482834321192692620856488639629011570381138542789803819092529658402611668375788410"));
+            return new DsaKeyGenerationParameters(Random, dsaSpec);
+        });
+
+        private static IAsymmetricCipherKeyPairGenerator ECGostKpg => InitKpg(ref ecGostKpg, "ECGOST3410", () =>
+            new ECKeyGenerationParameters(CryptoProObjectIdentifiers.GostR3410x2001CryptoProA, Random));
+
+        private static IAsymmetricCipherKeyPairGenerator ECDsaKpg => InitKpg(ref ecDsaKpg, "ECDSA", () =>
+            new KeyGenerationParameters(Random, 239));
 
 		static CmsTestUtil()
 		{