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

C.VerifyInit, C.Verify, C.VerifyUpdate и C.VerifyFinal

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

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

Механизм проверки ЭП и имитовставки задается в поле mechanism структуры CK_MECHANISM, на которую ссылается второй аргумент функции C.VerifyInit. Для формирования ЭП и имитовставки библиотека 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. Размер входных данных не ограничен.

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

Результат:
  • 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.Verify(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 (in) – указатель на подпись.
  • pulSignatureLen (in) – размер подписи.

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

Примечание

В случае инициализации операции проверки (см. C.VerifyInit()) с механизмом CKM_GOSTR3410 размер данных должен быть 32-байта.

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

Результат:
  • CKR_ARGUMENTS_BAD – недопустимые аргументы.
  • 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_SIGNATURE_INVALID – неверная подпись.
  • CKR_SIGNATURE_LEN_RANGE – недопустимый размер подписи.

Совет

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

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

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

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

Примечание

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

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

Результат:
  • 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 – недопустимый дескриптор сеанса.

Совет

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

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

Завершает операцию проверки подписи, проверки HMAC или проверки имитовставки.

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

Примечание

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

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

Результат:
  • 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_SIGNATURE_INVALID – неверная подпись.
  • CKR_SIGNATURE_LEN_RANGE – недопустимый размер подписи.

Совет

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

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

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

Для единоразовой операции проверки Для составной операции проверки
  1. C.VerifyInit(),
  2. C.Verify().
  1. C.VerifyInit(),
  2. C.VerifyUpdate() (один или более раз),
  3. C.VerifyFinal().

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

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

// инициализация проверки ЭЦП
rv = C.VerifyInit(session.value, verifyMech, pubKeyHandle.value);
if(rv != CKR.OK)
{
   throw new CKRException("C.VerifyInit", rv);
}

// проверка ЭЦП
rv = C.Verify(session.value, data, signature);
if(rv != CKR.OK)
{
   throw new CKRE
}

Оглавление