Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline alexey.rogatkin  
#1 Оставлено : 12 мая 2014 г. 13:34:35(UTC)
alexey.rogatkin

Статус: Участник

Группы: Участники
Зарегистрирован: 08.04.2014(UTC)
Сообщений: 18
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Добрый день.
Я пытаюсь сделать следующее:

Достать 3 элемента:
1. Цепочку сертификатов удаленного УЦ (успешно сделано).
2. Экспортируемую ключевую пару в BLOB.
3. Сертификат, выписанный означенным УЦ.

Закодировать эти три элемента в base64 если необходимо и сохранить на смарт карте для переноса.

Я пытаюсь сделать это все в iOS приложении и сейчас остановился на генерации ключей (Использую в качестве примера известную программу):

Код:


- (void)test
{
    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 ());
//            return;
        }
        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);
    }

    success = CryptSetProvParam (context, PP_USE_HARDWARE_RNG, NULL, 0); //попытка-workaround
    if (!success)
    {
        NSLog(@"Не могу инициализировать ДСЧ. Ошибка %lx", CSP_GetLastError ());
    }


    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);
}



Лог приложения при этом такой:



Всвязи с этим у меня возникает несколько вопросов:

1. Почему каждый раз создается контейнер и не сохраняется персистентно?
2. Почему все же происходит ошибка 0x80090019, а не NTE_BAD_KEYSET как ожидается?
3. Почему не генерируется ключ. Мне кажется дело связано с ДСЧ и если это так, то подскажите пожалуйста как это дело настроить
Offline Татьяна  
#2 Оставлено : 12 мая 2014 г. 16:51:15(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
для ios не существует сертифицированного ФСБ аппаратного датчика, поэтому CryptSetProvParam (context, PP_USE_HARDWARE_RNG, NULL, 0) приводит к ошибке -- HARDWARE_RNG не существует, поэтому его нельзя использовать.

Отредактировано пользователем 12 мая 2014 г. 16:52:17(UTC)  | Причина: Не указана

Татьяна
ООО Крипто-Про
Offline alexey.rogatkin  
#3 Оставлено : 12 мая 2014 г. 17:16:52(UTC)
alexey.rogatkin

Статус: Участник

Группы: Участники
Зарегистрирован: 08.04.2014(UTC)
Сообщений: 18
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Спасибо, но это попутный вопрос. В общем то нас устроит и биологический, но все же не ясно почему не работает указанный код пускай и с биологическим датчиком? Как сконфигурировать приложение так, чтобы это заработало?
Offline Татьяна  
#4 Оставлено : 12 мая 2014 г. 17:21:28(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
Прежде чем сделать CryptGetUserKey нужно ключ создать. Создать ключ можно фукнцией CryptGenKey.
Татьяна
ООО Крипто-Про
Offline alexey.rogatkin  
#5 Оставлено : 12 мая 2014 г. 17:34:57(UTC)
alexey.rogatkin

Статус: Участник

Группы: Участники
Зарегистрирован: 08.04.2014(UTC)
Сообщений: 18
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Автор: Татьяна Перейти к цитате
Прежде чем сделать CryptGetUserKey нужно ключ создать. Создать ключ можно фукнцией CryptGenKey.


Да, я понимаю это. Собственно поэтому он создается в случае, если CryptGetUserKey не срабатывает вот тут:

Код:



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);
    }




Однако, судя по логу, приложение, как раз, не в состоянии справиться с CryptGenKey, в этом и заключается вопрос. Мне кажется, что тут он пытается обратиться к ДСЧ, но не может этого сделать по неясным мне причинам. В чем она может быть? Может я что-то забыл сконфигурировать?

Отредактировано пользователем 12 мая 2014 г. 17:35:30(UTC)  | Причина: Не указана

Offline Татьяна  
#6 Оставлено : 12 мая 2014 г. 17:41:58(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
а что в логах в консоли (органайзер - ваше устройство - консоль)? возможно с ресурсами какие-то проблемы, по логам это должно быть видно.
config.ini не меняли?
Татьяна
ООО Крипто-Про
thanks 1 пользователь поблагодарил Татьяна за этот пост.
alexey.rogatkin оставлено 12.05.2014(UTC)
Offline alexey.rogatkin  
#7 Оставлено : 12 мая 2014 г. 17:51:07(UTC)
alexey.rogatkin

Статус: Участник

Группы: Участники
Зарегистрирован: 08.04.2014(UTC)
Сообщений: 18
Российская Федерация

Сказал(а) «Спасибо»: 4 раз


Вот логи консоли. Очевидно я как то неверно сконфигурировал приложение, хотя вроде все делал по инструкции. А что такое config.ini я немного не знаю - не сталкивался еще с ним Anxious
Offline Татьяна  
#8 Оставлено : 12 мая 2014 г. 17:58:59(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
ошибка при попытке использовать аппаратный датчик, уберите

success = CryptSetProvParam (context, PP_USE_HARDWARE_RNG, NULL, 0); //попытка-workaround
if (!success)
{
NSLog(@"Не могу инициализировать ДСЧ. Ошибка %lx", CSP_GetLastError ());
}
Татьяна
ООО Крипто-Про
Offline alexey.rogatkin  
#9 Оставлено : 12 мая 2014 г. 18:23:46(UTC)
alexey.rogatkin

Статус: Участник

Группы: Участники
Зарегистрирован: 08.04.2014(UTC)
Сообщений: 18
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Это был workaround.
Убрал и запустил, но логи такие же (за исключением 2-х строчек которые убрал), но консоль теперь пуста.
Offline Татьяна  
#10 Оставлено : 12 мая 2014 г. 18:33:37(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
интересно что в этом районе:

May 12 17:49:34 iPad-Alexey-Rogatkin cpcsp[10381] <Error>: cpcsp: 0x3c5d518c: :578 CreateCryptObject DSRFInitRSG fail
May 12 17:49:34 iPad-Alexey-Rogatkin cpcsp[10381] <Error>: cpcsp: 0x3c5d518c: :1771 CPCGenKey : CreateCryptObject fail ret obj

на консоли.
В норме она не должна быть пуста -- большинство событий там не относилось к CryptSetProvParam (context, PP_USE_HARDWARE_RNG, NULL, 0), поэтому не должны были исчезнуть.
Должен быть какой-то лог от CPCGenKey. Раньше он обламывался при инициализации аппаратного ДСЧ. Теперь должно быть что-то другое.

Можно повысить количество информации, выводящейся на консоль, поменяв в config.ini в секции debud

cpcsp=1

на cpcsp=15
Татьяна
ООО Крипто-Про
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.