Files
hcs/Hcs.Client/GostCryptography/Reflection/CspKeyContainerInfoHelper.cs
HOME-LAPTOP\kshkulev 33ab055b43 Add project
Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
2025-08-12 11:21:10 +09:00

79 lines
2.8 KiB
C#

using System.Reflection;
using System.Security.Cryptography;
namespace GostCryptography.Reflection
{
static class CspKeyContainerInfoHelper
{
private static readonly object CspKeyContainerInfoConstructorSync = new object();
private static volatile ConstructorInfo _cspKeyContainerInfoConstructor;
public static CspKeyContainerInfo CreateCspKeyContainerInfo(CspParameters parameters, bool randomKeyContainer)
{
CspKeyContainerInfo result = null;
if (_cspKeyContainerInfoConstructor == null)
{
lock (CspKeyContainerInfoConstructorSync)
{
if (_cspKeyContainerInfoConstructor == null)
{
_cspKeyContainerInfoConstructor = typeof(CspKeyContainerInfo).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(CspParameters), typeof(bool) }, null);
}
}
}
if (_cspKeyContainerInfoConstructor != null)
{
try
{
result = (CspKeyContainerInfo)_cspKeyContainerInfoConstructor.Invoke(new object[] { parameters, randomKeyContainer });
}
catch (TargetInvocationException exception)
{
if (exception.InnerException != null)
{
throw exception.InnerException;
}
throw;
}
if (result.KeyNumber == ((KeyNumber)(-1)))
{
var containerPatameters = GetCspKeyContainerInfoPatameters(result);
containerPatameters.KeyNumber = (int)KeyNumber.Exchange;
}
}
return result;
}
private static readonly object CspKeyContainerInfoPatametersFieldSync = new object();
private static volatile FieldInfo _cspKeyContainerInfoPatametersField;
private static CspParameters GetCspKeyContainerInfoPatameters(CspKeyContainerInfo cspKeyContainerInfo)
{
CspParameters result = null;
if (_cspKeyContainerInfoPatametersField == null)
{
lock (CspKeyContainerInfoPatametersFieldSync)
{
if (_cspKeyContainerInfoPatametersField == null)
{
_cspKeyContainerInfoPatametersField = typeof(CspKeyContainerInfo).GetField("m_parameters", BindingFlags.Instance | BindingFlags.NonPublic);
}
}
}
if (_cspKeyContainerInfoPatametersField != null)
{
result = _cspKeyContainerInfoPatametersField.GetValue(cspKeyContainerInfo) as CspParameters;
}
return result;
}
}
}