Функции выработки электронной подписи и имитовставки

C.SignInit, C.Sign, C.SignUpdate и C.SignFinal

C.SignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey)
Параметры:
  • hSession (in) – дескриптор сеанса.
  • pMechanism (in) – указатель на механизм.
  • hKey (in) – указатель на ключ.

Инициализирует операцию подписи для указанного ключа, выработки имитовставки и вычисления HMAC.

Механизм формирования ЭП и имитовставки задаётся в поле mechanism структуры CK_MECHANISM. Для формирования ЭП и имитовставки библиотека Cryptoki поддерживает механизмы, перечисленные ниже.

Для апплета Криптотокен:

  • CKM_GOSTR3410 (0x00001201) – механизм для генерации и проверки ЭП, соответствующий стандарту

    ГОСТ Р 34.10-2001. Использует в качестве входного параметра ранее вычисленное 32-байтовое значение хэш-функции.

  • CKM_GOSTR3410_WITH_GOSTR3411 (0x00001202) – механизм для генерации и проверки ЭП (ГОСТ Р 34.10-2001) с

    хэшированием (ГОСТ Р 34.11-94) подаваемых на вход данных. Размер данных не ограничен.

  • CKM_GOST28147_MAC (0x00001223) – механизм выработки и проверки имитовставки, соответствующий стандарту

    ГОСТ 28147-89. Размер входных данных не ограничен.

Запускается в режимах

См.также

C.Sign(), C.SignUpdate() и C.SignFinal().

Результат:
  • CKR_ARGUMENTS_BAD – недопустимые аргументы.
  • CKR_CRYPTOKI_NOT_INITIALIZED – функция не может быть выполнена, т.к. библиотека Cryptoki еще не была инициализирована (см. C.Initialize()).
  • CKR_DEVICE_ERROR – возникла проблема с токеном и/или слотом.
  • CKR_DEVICE_MEMORY – памяти токена недостаточно для данной операции.
  • CKR_DEVICE_REMOVED – токен был изъят из слота.
  • CKR_FUNCTION_CANCELED – функция была отменена в момент исполнения.
  • CKR_FUNCTION_FAILED – выполнение функции было прервано или она не может быть выполнена.
  • CKR_GENERAL_ERROR – общий сбой при работе с библиотекой.
  • CKR_HOST_MEMORY – компьютер, на котором запущена библиотека, не имеет достаточно памяти для выполнения функции.
  • CKR_KEY_FUNCTION_NOT_PERMITTED – атрибуты ключа не позволяют его использование данным образом.
  • CKR_KEY_HANDLE_INVALID – недопустимый дескриптор ключа.
  • CKR_KEY_SIZE_RANGE – размер ключа лежит за пределами, поддерживаемыми библиотекой Cryptoki.
  • CKR_KEY_TYPE_INCONSISTENT – данный ключ невозможно использовать с указанным механизмом.
  • CKR_MECHANISM_INVALID – недопустимый механизм.
  • CKR_MECHANISM_PARAM_INVALID – недопустимый параметр механизма.
  • CKR_OK – функция выполнена успешно.
  • CKR_OPERATION_ACTIVE – на устройстве уже есть активная операция, что не позволяет активизировать данную операцию.
  • CKR_OPERATION_NOT_INITIALIZED – операция подписи для указанного ключа не может быть инициализирована, т.к. ключ не был сгенерирован или импортирован.
  • CKR_PIN_EXPIRED – срок действия указанного PIN-кода истек.
  • CKR_SESSION_CLOSED – сеанс был закрыт в момент выполнения функции.
  • CKR_SESSION_HANDLE_INVALID – недопустимый дескриптор сеанса.
  • CKR_USER_NOT_LOGGED_IN – действие не может быть выполнено, т.к. пользователь не залогинен.

Совет

Полный список ошибок см. в приложении.

C.Sign(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
Параметры:
  • hSession (in) – дескриптор сеанса.
  • pData (in) – указатель на данные.
  • ulDataLen (in) – размер данных.
  • pSignature (out) – указатель на подпись.
  • pulSignatureLen (out) – размер подписи.

Осуществляет единоразовую подпись, т.е подписывает только один блок данных. Либо вычисляет HMAC от одного блока данных, вырабатывает имитовставку от одного блока данных – конкретная операция зависит от того, с каким значением параметра pMechanism была инициализирована операция подписи.

Примечание

Если операция подписи инициализирована с механизмом CKM_GOSTR3410 (см. C.SignInit()), то поддерживается только 32-байтовый размер данных.

Запускается в режимах

Результат:
  • CKR_ARGUMENTS_BAD – недопустимые аргументы.
  • CKR_BUFFER_TOO_SMALL – вывод функции слишком велик для предоставленного буфера.
  • CKR_CRYPTOKI_NOT_INITIALIZED – функция не может быть выполнена, т.к. библиотека Cryptoki еще не была инициализирована (см. C.Initialize()).
  • CKR_DATA_INVALID – недопустимые данные.
  • CKR_DATA_LEN_RANGE – недопустимый размер данных.
  • CKR_DEVICE_ERROR – возникла проблема с токеном и/или слотом.
  • CKR_DEVICE_MEMORY – памяти токена недостаточно для данной операции.
  • CKR_DEVICE_REMOVED – токен был изъят из слота.
  • CKR_FUNCTION_CANCELED – функция была отменена в момент исполнения.
  • CKR_FUNCTION_FAILED – выполнение функции было прервано или она не может быть выполнена.
  • CKR_GENERAL_ERROR – общий сбой при работе с библиотекой.
  • CKR_HOST_MEMORY – компьютер, на котором запущена библиотека, не имеет достаточно памяти для выполнения функции.
  • CKR_OK – функция выполнена успешно.
  • CKR_OPERATION_NOT_INITIALIZED – в указанном сеансе нет активной операции данного типа.
  • CKR_SESSION_CLOSED – сеанс был закрыт в момент выполнения функции.
  • CKR_SESSION_HANDLE_INVALID – недопустимый дескриптор сеанса.
  • CKR_USER_NOT_LOGGED_IN – действие не может быть выполнено, т.к. пользователь не залогинен.
  • CKR_FUNCTION_REJECTED – запрос на подпись отклонен пользователем.

Совет

Полный список ошибок см. в приложении.

C.SignUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
Параметры:
  • hSession (in) – дескриптор сеанса.
  • pPart (in) – указатель на блок данных.
  • ulPartLen (in) – размер блока данных.

Продолжает составную операцию подписи – подписывает очередной блок данных, вычисляет HMAC или вырабатывает имитовставку для очередного блока данных.

При работе с апплетом Криптотокен функция C.SignUpdate() поддерживает только механизмы CKM_GOSTR3410_WITH_GOSTR3411 и CKM_GOST28147_MAC.

Примечание

Механизмы, используемые в процессе выработки электронной подписи или имитовставки предварительно задаются функцией C.SignInit().

Запускается в режимах

См.также

C.SignInit(), C.Sign() и C.SignFinal().

Результат:
  • CKR_ARGUMENTS_BAD – недопустимые аргументы.
  • CKR_CRYPTOKI_NOT_INITIALIZED – функция не может быть выполнена, т.к. библиотека Cryptoki еще не была инициализирована (см. C.Initialize()).
  • CKR_DATA_LEN_RANGE – недопустимый размер данных.
  • CKR_DEVICE_ERROR – возникла проблема с токеном и/или слотом.
  • CKR_DEVICE_MEMORY – памяти токена недостаточно для данной операции.
  • CKR_DEVICE_REMOVED – токен был изъят из слота.
  • CKR_FUNCTION_CANCELED – функция была отменена в момент исполнения.
  • CKR_FUNCTION_FAILED – выполнение функции было прервано или она не может быть выполнена.
  • CKR_GENERAL_ERROR – общий сбой при работе с библиотекой.
  • CKR_HOST_MEMORY – компьютер, на котором запущена библиотека, не имеет достаточно памяти для выполнения функции.
  • CKR_OK – функция выполнена успешно.
  • CKR_OPERATION_NOT_INITIALIZED – в указанном сеансе нет активной операции данного типа.
  • CKR_SESSION_CLOSED – сеанс был закрыт в момент выполнения функции.
  • CKR_SESSION_HANDLE_INVALID – недопустимый дескриптор сеанса.
  • CKR_USER_NOT_LOGGED_IN – действие не может быть выполнено, т.к. пользователь не залогинен.

Совет

Полный список ошибок см. в приложении.

C.SignFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
Параметры:
  • hSession (in) – дескриптор сеанса.
  • pSignature (out) – указатель на подпись.
  • pulSignatureLen (out) – размер подписи.

Завершает составную операцию подписи, вычисления HMAC или выработки имитовставки.

При работе с апплетом Криптотокен функция C.SignFinal() поддерживает только механизмы CKM_GOSTR3410_WITH_GOSTR3411 и CKM_GOST28147_MAC.

Примечание

Механизмы, используемые в процессе выработки электронной подписи или имитовставки предварительно задаются функцией C.SignInit().

Запускается в режимах

См.также

C.SignInit(), C.SignUpdate() и C.Sign().

Результат:
  • CKR_ARGUMENTS_BAD – недопустимые аргументы.
  • CKR_BUFFER_TOO_SMALL – вывод функции слишком велик для предоставленного буфера.
  • CKR_CRYPTOKI_NOT_INITIALIZED – функция не может быть выполнена, т.к. библиотека Cryptoki еще не была инициализирована (см. C.Initialize()).
  • CKR_DATA_LEN_RANGE – недопустимый размер данных.
  • CKR_DEVICE_ERROR – возникла проблема с токеном и/или слотом.
  • CKR_DEVICE_MEMORY – памяти токена недостаточно для данной операции.
  • CKR_DEVICE_REMOVED – токен был изъят из слота.
  • CKR_FUNCTION_CANCELED – функция была отменена в момент исполнения.
  • CKR_FUNCTION_FAILED – выполнение функции было прервано или она не может быть выполнена.
  • CKR_GENERAL_ERROR – общий сбой при работе с библиотекой.
  • CKR_HOST_MEMORY – компьютер, на котором запущена библиотека, не имеет достаточно памяти для выполнения функции.
  • CKR_OK – функция выполнена успешно.
  • CKR_OPERATION_NOT_INITIALIZED – в указанном сеансе нет активной операции данного типа.
  • CKR_SESSION_CLOSED – сеанс был закрыт в момент выполнения функции.
  • CKR_SESSION_HANDLE_INVALID – недопустимый дескриптор сеанса.
  • CKR_USER_NOT_LOGGED_IN – действие не может быть выполнено, т.к. пользователь не залогинен.
  • CKR_FUNCTION_REJECTED – запрос на подпись отклонен пользователем.

Совет

Полный список ошибок см. в приложении.

Пример использования

Для обеспечения успешной подписи данных, необходимо, чтобы функции в алгоритме были использованы в одной из следующих последовательностей:

Для единоразовой операции подписи Для составной операции подписи
  1. C.SignInit(),
  2. C.Sign().
  1. C.SignInit(),
  2. C.SignUpdate() (один или более раз),
  3. C.SignFinal().

Пример выработки ЭЦП на языке Java для ОС Android:

// дескриптор сессии
LongRef session = new LongRef();
// дескриптор закрытого ключа
LongRef prKeyHandle = new LongRef();
// буфер для результирующей хэш-последовательности
byte[] hash = new byte[32];
// механизм для формирования ЭЦП по ГОСТ Р34.10-2001
CKM signMech = new CKM(CKM.GOSTR3410, null);
// буфер для результирующей подписи
byte[] signature = new byte[64];
// длина буфера для подписи
LongRef signatureLength = new LongRef(signature.length);

// задание ключа подписи и механизма
rv = C.SignInit(session.value, signMech, prKeyHandle.value);
if(rv != CKR.OK)
{
        throw new CKRException("C.SignInit", rv);
}

// подпись данных
rv = C.Sign(session.value, hash, signature, signatureLength);
if(rv != CKR.OK)
{
        throw new CKRException("C.Sign", rv);
}

Оглавление