Статус: Участник
Группы: Участники
Зарегистрирован: 08.04.2014(UTC) Сообщений: 18  Сказал(а) «Спасибо»: 4 раз
|
Попробовал сделать все заново: создал пустой проект, подключил framework как описано в Readme без поддержки ридеров. Для обращения к провайдеру используется только следующий код: Код:
HCRYPTPROV context = 0;
LPCSTR containerName = (LPCSTR) [@"\\\\.\\HDIMAGE\\test" cStringUsingEncoding:NSUTF8StringEncoding];
LPCSTR providerName = [[NSString stringWithFormat:@"%s",
CP_KC1_GR3410_2001_PROV] cStringUsingEncoding:NSUTF8StringEncoding];
DWORD providerType = PROV_GOST_2001_DH;
NSLog(@"Открываю контекст криптопровайдера с существующим контейнером \"%s\"...", containerName);
CSP_BOOL success = CryptAcquireContextA (&context, containerName, providerName, providerType, CRYPT_MACHINE_KEYSET | CRYPT_SILENT);
if (!success)
{
if (CSP_GetLastError () != NTE_BAD_KEYSET)
{
NSLog(@"Ошибка при открытии контекста: %lx", CSP_GetLastError ());
}
NSLog(@"Контейнер с ключом не существует, создаю контейнер...");
success = CryptAcquireContextA (&context, containerName, providerName, providerType, CRYPT_MACHINE_KEYSET | CRYPT_NEWKEYSET | CRYPT_SILENT);
if (!success)
{
NSLog(@"Ошибка при создании нового контейнера \"%s\": %lx", containerName, CSP_GetLastError ());
return;
}
NSLog(@"Создан и открыт контейнер \"%s\"", containerName);
}
NSLog(@"Открываю ключевую пару AT_KEYEXCHANGE...");
HCRYPTKEY key;
success = CryptGetUserKey (context, AT_KEYEXCHANGE, &key);
if (!success)
{
if (CSP_GetLastError () != NTE_NO_KEY)
{
NSLog(@"Ошибка при открытии ключевой пары AT_KEYEXCHANGE: %lx", CSP_GetLastError ());
CryptReleaseContext (context, 0);
return;
}
NSLog(@"Ключевая пара AT_KEYEXCHANGE не существует");
NSLog(@"Инициализирую ключевую пару AT_KEYEXCHANGE...");
success = CryptGenKey (context, AT_KEYEXCHANGE, 0, &key);
if (!success)
{
NSLog(@"Ошибка при инициализации ключевой пары AT_KEYEXCHANGE: %lx", CSP_GetLastError ());
CryptReleaseContext (context, 0);
return;
}
NSLog(@"Создана экспортируемая ключевая пара AT_KEYEXCHANGE");
}
CryptDestroyKey (key);
success = CryptGetUserKey (context, AT_SIGNATURE, &key);
if (!success)
{
if (CSP_GetLastError () != NTE_NO_KEY)
{
NSLog(@"Ошибка при открытии ключевой пары AT_SIGNATURE: %lx", CSP_GetLastError ());
CryptReleaseContext (context, 0);
return;
}
NSLog(@"Ключевая пара AT_SIGNATURE не существует");
NSLog(@"Инициализирую ключевую пару AT_SIGNATURE...");
success = CryptGenKey (context, AT_SIGNATURE, CRYPT_EXPORTABLE, &key);
if (!success)
{
NSLog(@"Ошибка при инициализации ключевой пары AT_SIGNATURE: %lx", CSP_GetLastError ());
CryptReleaseContext (context, 0);
return;
}
NSLog(@"Создана экспортируемая ключевая пара AT_SIGNATURE");
}
CryptDestroyKey (key);
CryptReleaseContext (context, 0);
Больше нигде обращений к КриптоПРО нету. В консоле такой же результат:
<Error>: cpcsp: 0x3c5d518c: :313 SetPhisicRSG rndm fail <Error>: cpcsp: 0x3c5d518c: :1645 DSRFInitRSG SetPhisicRSG failed <Error>: cpcsp: 0x3c5d518c: :578 CreateCryptObject DSRFInitRSG fail <Error>: cpcsp: 0x3c5d518c: :1771 CPCGenKey : CreateCryptObject fail ret obj
Далее, попробовал вставить этот код в пример sTunnel для iOS, где успешно используется PaneViewController библиотеки и все работает корректно. Там код тоже не работает (такая же ошибка), что наводит на мысль о том, что так использовать КриптоПРО под iOS как я пытаюсь сделать нельзя. Как же тогда положено генерировать ключи на iOS без использования PaneViewController? Есть ли где то рабочий пример под iOS, где без использования какой либо визуализации возможно сгененрировать ключи, а в дальнейшем и запрос на сертификат? Отредактировано пользователем 13 мая 2014 г. 0:48:35(UTC)
| Причина: Не указана
|