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

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 4 раз
В config.ini уже было проставлено 15. Я сделал clean проекта, удалил с устройства приложение и перезапустил все заново. В результате получил в логе следующее:



По логам видно, что CryptSetProvParam не происходит, но в консоли приложения он, почему то, упорно пытается обратиться к физическому RNG:



Глупое предположение, но может ли влиять на поведение приложения то, что оно собрано с поддержкой считываетелей и пытается обратиться к датчику случайных чисел неподключенной смарт карты?
Offline alexey.rogatkin  
#12 Оставлено : 13 мая 2014 г. 0:47:40(UTC)
alexey.rogatkin

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

Группы: Участники
Зарегистрирован: 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);


Больше нигде обращений к КриптоПРО нету. В консоле такой же результат:



Далее, попробовал вставить этот код в пример sTunnel для iOS, где успешно используется PaneViewController библиотеки и все работает корректно. Там код тоже не работает (такая же ошибка), что наводит на мысль о том, что так использовать КриптоПРО под iOS как я пытаюсь сделать нельзя.

Как же тогда положено генерировать ключи на iOS без использования PaneViewController? Есть ли где то рабочий пример под iOS, где без использования какой либо визуализации возможно сгененрировать ключи, а в дальнейшем и запрос на сертификат?

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

Offline alexey.rogatkin  
#13 Оставлено : 13 мая 2014 г. 1:33:17(UTC)
alexey.rogatkin

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

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

Сказал(а) «Спасибо»: 4 раз
Решил проблему, а она заключалась в общей дурости и намыленном глазе :) Судя по всему ошибка происходила потому, что я по запарке оставил флаг CRYPT_MACHINE_KEYSET при создании контекста.
Offline Татьяна  
#14 Оставлено : 13 мая 2014 г. 11:48:26(UTC)
Татьяна

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

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

Поблагодарили: 40 раз в 37 постах
Почитала код внимательнее, на самом деле, похоже проблема была в CRYPT_SILENT -- это режим, в котором провайдер не может выводить окна. Поэтому он не может отрисовать биологический датчик, и использовать не биологический тоже не удается (его нет) -- отсюда и ошибки при поиске ДСЧ в логе.

Татьяна
ООО Крипто-Про
thanks 1 пользователь поблагодарил Татьяна за этот пост.
alexey.rogatkin оставлено 13.05.2014(UTC)
Offline alexey.rogatkin  
#15 Оставлено : 13 мая 2014 г. 11:50:27(UTC)
alexey.rogatkin

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

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

Сказал(а) «Спасибо»: 4 раз
Да, спасибо. Действительно, я убрал оба флага отовсюду и заработало, так что вероятно дело и в нем.
Offline alexey.rogatkin  
#16 Оставлено : 13 мая 2014 г. 16:42:28(UTC)
alexey.rogatkin

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

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

Сказал(а) «Спасибо»: 4 раз
Доброго дня.
Создав ключи и получив сертификат с УЦ я хочу сохранить их на смарт карте в качестве защищенных объектов используя JaCarta SDK. Но я столкнулся с тем, что при включенном флаге Dead code stripping перестает работать КриптоПРО, а при выключенном перестает линковаться проект с ошибкой:

Код:

Undefined symbols for architecture armv7:
  "_iR301SetTimeout", referenced from:
      ___SCardSetTimeout_block_invoke in libjcPKCS11.a(iReader301.o)
  "_iR301Transmit", referenced from:
      ___SCardTransmit_block_invoke in libjcPKCS11.a(iReader301.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)


Я не знаю, к сожалению, что с этим сделать. Написал в техподдержку JaCarta (поскольку при отключенном флаге, как мне подсказывает логика, линковка должна работать всегда), но они пока сохраняют таинственное молчание. Подумал, что возможно можно сделать как то так, чтобы КриптоПРО работало при включенном флаге? Или сделать какой то другой workaround?
Offline Татьяна  
#17 Оставлено : 13 мая 2014 г. 17:19:57(UTC)
Татьяна

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

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

Поблагодарили: 40 раз в 37 постах
А модули поддержки считывателя штатные из состава фреймворка или какие-то другие (новые от аладдин, например)?
Если штатные, то какую версию фреймворка исползуете? Версию можно посмотреть в config.ini в секции [Parameters] PKZI_Build=xxxx.
Татьяна
ООО Крипто-Про
Offline alexey.rogatkin  
#18 Оставлено : 13 мая 2014 г. 17:28:12(UTC)
alexey.rogatkin

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

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

Сказал(а) «Спасибо»: 4 раз
Новое SDK от Аладдин, спрашивал у них напрямую. SDK предназначено для низкоуровневой работы непосредственно со смарт картой и несколько поддерживаемых высокоуровневых функций в стиле шифрования, подписи и так далее. Меня интересует только хранения данных на карте. (SDK к КриптоПРО не имеет никакого отношения, но ломает его работу из-за флага)
SDK подключается отдельно файлами libjcPKCS11.a и libjcPKCS11x.a.

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

Offline Татьяна  
#19 Оставлено : 14 мая 2014 г. 11:17:22(UTC)
Татьяна

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

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

Поблагодарили: 40 раз в 37 постах
Понятно. Нашему провайдеру, к сожалению, в данный момент архитектура не позволяет собираться с Dead code Stripping, могу посоветовать только сделать функции-заглушки с нужными прототипами, чтобы слинковаться, но это костыль конечно же.
Татьяна
ООО Крипто-Про
thanks 1 пользователь поблагодарил Татьяна за этот пост.
alexey.rogatkin оставлено 14.05.2014(UTC)
Offline alexey.rogatkin  
#20 Оставлено : 14 мая 2014 г. 11:39:37(UTC)
alexey.rogatkin

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

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

Сказал(а) «Спасибо»: 4 раз
Спасибо, хорошая идея, меня устроит и такой костыль
Татьяна, а можете порекомендовать какую-нибудь статейку, которую почитать на тему функций-заглушек? Представляю о чем речь, но есть ряд вопросов наподобии таких, как "как узнать какие аргументы у функций, чтобы сделать корректные прототипы" и сопутствующие вопросы связанные с этим
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.