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

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);
}

Оглавление