25.07.2003 13:05:03Не могу создать Key Container (keyset) Ответов: 4
Maxim Egorushkin
Установил carrier -> registry

// Создаю keyset
HCRYPTPROV prov;
::CryptAcquireContext(&prov, _T("the_container"), CP_DEF_PROV, type, CRYPT_NEWKEYSET); // == S_OK
::CryptReleaseContext(prov, 0);

// создаю еще раз - возвращает S_OK, как будто он до этого не был создан

// открываю криптопровайдера с контейнером
::CryptAcquireContext(&prov, _T("the_container"), CP_DEF_PROV, type, 0); // диалог - "Keyset does not exist"

Вопрос: как создать keyset?

P.S. С Microsoft’овскими провайдерами все Ok.
 
Ответы:
25.07.2003 13:30:31Maxim Egorushkin
Оказалось, что после создания keyset’a в него надо обязательно положить ключ.

Зачем такие неудобства?
Почему, когда я создаю контейнер, который уже существует, мне не возвращается ошибка NTE_EXISTS? Почему, когда ключ клонируется, не клонируется его вектор инициализации. Почему CBC не режим по-умолчанию для блочного ключа?

Как можно работать с таким API? Основная цель создания Microsoft’ом Crypto API была предоставить возможность приложениям полиморфно работать с любыми криптопровайдерами, поддерживающими необходимые алгоритмы/протоколы. Т.е. логика приложения не должна зависеть от конретного криптопровайдера. С КриптоПро же все по-другому. Приходится специально затачивать код, чтобы обходится значительно урезанной нелогичной функциональностью.

Зачем так сделано? Случайно ведь так сложно сделать. Я не понимаю... Чтобы для галочки написать "у нас MS-compatible CSP"?
25.07.2003 14:37:47kure
Зачем так сразу много упреков.
По-моему вы просто не разобрались.

Вы хотите сказать, что Микрософтовский провайдер после CryptAcquireContext (..CRYPT_NEWKEYSET) делает долговременные ключи???

Посмотрите внимательно в документации как создаются ключи. Они создаются функцией CPGenKey

The CPGenKey function generates a random cryptographic key or key pair.


25.07.2003 14:49:43Maxim Egorushkin
Да, возможно не разобрался.

Но проблема в том, что поведение КриптоПро CSP значительно отличается от того, что написано в MSDN и от поведения Microsoft’овских провайдеров в худшую сторону. Складывается впечатление, что криптопровайдер написан крайне небрежно. Это очень расстраивает.

С Microsoft провайдером я могу создать keyset, не создавая в нем ключей. В КриптоПро это нельзя сделать - нужно обязательно создать в контейнере ключ. В чем причина такого ограничения?
25.07.2003 15:28:33Александр
По скольку мы используем в качестве ключевого носителя не только реестр (а например, смарт-карты), то для того чтобы создать контейнер в момент CryptAcquireContext необходим пароль или pin-код. Microsoft запрещает вывод диалогового окна с запросом пароля во время выполнения CryptAcquireContext, для того чтобы этот пароль можно было установить в SILENT режиме, через функцию CryptSetProvParam.
Из этой ситуации создатели крипто-провайдеров выходят по разному, кто-то это правило нарушает, кто-то передает дополнительные параметры (pin) через ИМЯ контейнера.
Мы просто не создаем этот контейнер при AcquireContext, Microsoft это не запрещает.
У нас нигде не написано, что "MS-compatible CSP", у нас провайдер сделан в соответствии с интерфейсом CSP; и если Microsoft рекомендует не выводить окон, то мы стараемся этого не делать.