Add project
Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
This commit is contained in:
@ -0,0 +1,78 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user