Ошибка памяти pkcs # 11 - какие могут быть общие причины? - PullRequest
4 голосов
/ 12 июля 2010

Я получаю код ошибки CKR_DEVICE_MEMORY для вызова C_Encrypt с использованием библиотеки cryptoki.

Из спецификации PKCS # 11, CKR_DEVICE_MEMORY означает, что токену не хватает памяти для выполнения запрошенной функции.

При каких обстоятельствах мы полностью заполняем память токена?

HSM работает 24x7 в течение 7 дней, непрерывно в основном шифруя и дешифруя файлы в дневное время с двумя параллельными сеансами. Я не звонил C_Finalize за последние 7 дней. поэтому библиотека криптоки работала в своем пространстве памяти с момента инициализации ( см. соответствующий пост по этому ).

Я могу видеть из своих приложений, журнала отладки, что когда-либо, я выделяю, я освобождаю, поэтому нет утечки памяти из кода моего приложения.

ОБНОВЛЕНИЕ 1: Существует подробное обсуждение о том, как я могу позвонить C_Finalize в Application_End ASP.NET. Основная причина, по которой я не смог использовать это, потому что после перезапуска / тайм-аута потоки ASP.net обращаются к одному сеансу, что приводит к ошибке CKR_OPERATION_ACTIVE. В моем случае несколько приложений обращаются к HSM через веб-сервис.

Ответы [ 2 ]

6 голосов
/ 17 октября 2014

Рассмотрим память HSM и хост-компьютера (на котором работает библиотека Cryptoki) отдельно.Правильно реализованная библиотека Cryptoki должна возвращать CKR_DEVICE_MEMORY, если устройство HSM страдает от нехватки памяти, и CKR_HOST_MEMORY, если библиотека Cryptoki не может выделить память хост-компьютера для своих внутренних структур (если она реализована как разделяемая библиотека, то процесс не может выделить память),Таким образом, если ваша библиотека pkcs11 реализована правильно, то CKR_DEVICE_MEMORY означает буквально недостаточную память устройства (HSM).Причин таких ошибок много.Мы не можем рассмотреть все отрасли.Можно ограничить только некоторые вопросы.Отвечая на ваш вопрос, существует три основных распространенных причины проблем с памятью в библиотеке Cryptoki:

  1. Память для операций шифрования.Клиент Cryptoki отвечает за выделение такой памяти, а не библиотеки Cryptoki.Например, клиент библиотеки Cryptoki должен выделить буфер для окончательного результата перед вызовом C_EncryptFinal.Если размера буфера недостаточно, Cryptoki возвращает CKR_BUFFER_TOO_SMALL.
  2. HSM-память.CKR_DEVICE_MEMORY указывает на этот случай, но он не контролируется большинством разработчиков программного обеспечения.
  3. Память для внутренних служебных структур в библиотеке Cryptoki.Например, при открытии сеанса выделяется память для этой структуры.Когда вы останавливаете процесс шифрования и начинаете дешифрование в том же сеансе, режим для этого сеанса изменяется.Библиотека Cryptoki должна поддерживать внутреннее состояние между вызовами, потому что она поддерживает многочастные итерационные операции.При переключении с одного вида операции на другой он должен освободить предыдущие структуры и выделить новые в памяти, такие как куча.Если разработчик приложения имеет библиотечные источники или хочет помочь в поиске ошибки, в этой ситуации стоит сделать следующее (для этого конкретного случая предполагается, что библиотека ошибочно сообщает CKR_DEVICE_MEMORY вместо CKR_HOST_MEMORY).Попробуйте запустить программу только для одного вида операций (скажем, шифрование).Если он работает без ошибок памяти в течение указанного периода времени, то возможно, что утечки памяти происходят при изменении типов операций.Но вы говорите: «один сеанс для шифрования, а другой для дешифрования».Это сужает область.Вероятно, память для хранения состояния для утечек из нескольких частей.Контролируйте объем памяти после нескольких операций.Если вы не используете многокомпонентные операции, то, скорее всего, это случай 2, потому что библиотека Cryptoki в таких обстоятельствах не должна выделять какую-либо не стековую память.

Эти оценки служат только для иллюстрации общих проблем.с памятью в таких библиотеках.

1 голос
/ 12 июля 2010

Вы упоминаете здесь , что вы не закрываете свои сессии.Если это правда, это, скорее всего, причина CKR_DEVICE_MEMORY s.

...