Перейти к контенту

Рекомендуемые сообщения

Добрый день!

Помогите, пожалуйста, с решением проблемы.

Имеется контейнер с ключевой парой. Имеется связанный с этой парой сертификат. Нужно решить задачу экспорта сессионного ключа на открытом ключе сертификата. Написал такой код (C#):


IntPtr providerHandler = IntPtr.Zero;
IntPtr sessionKeyHandler = IntPtr.Zero;
IntPtr publicKeyHandler = IntPtr.Zero;

try
{
if (!CryptoApi.CryptAcquireContext(
ref providerHandler,
null,
CryptoConstants.VPN_DEF_PROV,
CryptoConstants.VPN_PROV_TYPE,
CryptoConstants.CRYPT_VERIFYCONTEXT))
{
throw new Win32Exception();
}

if (!CryptoApi.CryptGenKey(
providerHandler,
CryptoConstants.CPCSP_ENCRYPT_ID,
CryptoConstants.CRYPT_EXPORTABLE,
ref sessionKeyHandler))
{
throw new Win32Exception();
}

X509Store store = new X509Store(STORE_NAME, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

X509Certificate2 cert = null;

try
{
cert = store.Certificates.Find(X509FindType.FindByThumbprint, "285d213829798dac59d75274b247e3a35a5a0630", false)[0];
}
finally
{
store.Close();
}

IntPtr subjectPublicKeyInfoPointer = IntPtr.Zero;

try
{
var certContextStruct = MarshalPtrToStructure<CryptoStructs.CERT_CONTEXT>(cert.Handle);
var certInfoStruct = MarshalPtrToStructure<CryptoStructs.CERT_INFO>(certContextStruct.pCertInfo);

subjectPublicKeyInfoPointer = Marshal.AllocHGlobal(Marshal.SizeOf(certInfoStruct.SubjectPublicKeyInfo));
Marshal.StructureToPtr(certInfoStruct.SubjectPublicKeyInfo, subjectPublicKeyInfoPointer, false);

if (!CryptoApi.CryptImportPublicKeyInfo(providerHandler, CERT_ENCODING_TYPE, subjectPublicKeyInfoPointer, ref publicKeyHandler))
{
throw new Win32Exception();
}
}
finally
{
Marshal.FreeHGlobal(subjectPublicKeyInfoPointer);
subjectPublicKeyInfoPointer = IntPtr.Zero;
}

uint sessionKeyBlobLength = 0;

if (!CryptoApi.CryptExportKey(
sessionKeyHandler,
publicKeyHandler,
CryptoConstants.SIMPLEBLOB,
0,
null,
ref sessionKeyBlobLength))
{
throw new Win32Exception();
}

byte[] sessionKeyBlob = new byte[sessionKeyBlobLength];

if (!CryptoApi.CryptExportKey(
sessionKeyHandler,
publicKeyHandler,
CryptoConstants.SIMPLEBLOB,
0,
sessionKeyBlob,
ref sessionKeyBlobLength))
{
throw new Win32Exception();
}
}
finally
{
if (publicKeyHandler != IntPtr.Zero)
{
CryptoApi.CryptDestroyKey(publicKeyHandler);
}

if (sessionKeyHandler != IntPtr.Zero)
{
CryptoApi.CryptDestroyKey(sessionKeyHandler);
}

if (providerHandler != IntPtr.Zero)
{
CryptoApi.CryptReleaseContext(providerHandler, 0);
}
}

На последней строчке до finally валится с ошибкой "Набор ключей не существует". Все указатели не нулевые, sessionKeyBlobLength = 71 (т.е. длина рассчитывается). Мучаюсь уже несколько дней.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...

Важная информация

Продолжая пользоваться сайтом вы принимаете Условия использования.