ocehb: (Default)
ocehb ([personal profile] ocehb) wrote2014-07-29 01:22 pm
Entry tags:

Проблема в CryptoPro CSP


КриптоПро CSP библиотека имеет особенность работы с контейнерами и
криптоконтекстами: если криптоконтейнер существует, и
CryptAcquireContext вызывается с флагом CRYPT_NEWKEYSET, то код
возврата false и GetLastError() возвращает 0x8009000f (NTE_EXISTS),
и, дополнительно, пишет в syslog


Jul 29 10:24:19 vbox cprdr[22554]: cpcsp:!carrier_shortcut!rdr_shortcut_get fail!
Jul 29 10:24:19 vbox cprdr[22554]: cpcsp:!CreateContainer!CreateContainer: key_carrier_open faild!!


что нервирует клиентов. Если же контейнер не существует, а
CryptAcquireContext вызывается без флага CRYPT_NEWKEYSET, то код
возврата тоже false, и GetLastError() 0x80090019 (NTE_KEYSET_NOT_DEF)
и текст в syslog


Jul 29 10:30:36 vbox cprdr[22626]: cpcsp:!read_keyset!code==RDR_ERR_FILE_NOT_FOUND fail!
Jul 29 10:30:36 vbox cprdr[22626]: cpcsp:!OpenContainer!OpenContainer key_carrier_open fail (0x80090019)!


Да, можно искать существующие контейнеры через CryptGetProvParam с
флагами CRYPT_FIRST/CRYPT_NEXT, и это работает с контейнерами, которые
сохранены на диске. Но не работает с контейнерами, которые только
созданы, но ещё не сохранены на диск. А сохраняются они на диск
только если на них созданы ключи.

Одно из решений -- перехватывать вызовы CryptAcquireContext и
CryptReleaseContext и использовать кеш криптоконтекстов и имён
криптоконтейнеров для разрешения конфликтов существования/отсутствия.

[identity profile] drf-ckoff.livejournal.com 2014-07-29 11:15 am (UTC)(link)
если мне не изменяет мой склероз - там была какая-то черезжопная возможность то ли подменить функцию логирования то ли заткнуть пасть егойной.