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

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. Размер входных данных не ограничен.
  • Laser
    • CKM_RSA_PKCS (0x00000001) – механизм для генерации и проверки ЭП по алгоритму RSA. Может быть также использован для зашифрования/расшифрования данных.
    • CKM_SHA1_RSA_PKCS (0x00000006) – механизм для генерации и проверки ЭП (RSA) с предварительным хэшированием по алгоритму SHA-1.
    • CKM_SHA256_RSA_PKCS (0x00000040) – механизм для генерации и проверки ЭП (RSA) с предварительным хэшированием по алгоритму SHA-256.
    • CKM_DES3_MAC (0x00000134) – механизм для формирования и проверки имитовставки фиксированной длины на основе triple-DES. Ограничение длины выхода – 4 байт.
    • CKM_DES3_MAC_GENERAL (0x00000135) – механизм для формирования и проверки имитовставки произвольной длины на основе triple-DES.
    • CKM_MD5_HMAC (0x00000211) – механизм для формирования и проверки имитовставки на основе MD5.
    • CKM_SHA_1_HMAC (0x00000221) – механизм для формирования и проверки имитовставки на основе SHA-1.
    • CKM_SHA256_HMAC (0x00000251) – механизм для формирования и проверки имитовставки на основе SHA-256.
    • CKM_SHA384_HMAC (0x00000261) – механизм для формирования и проверки имитовставки на основе SHA-384.
    • CKM_SHA512_HMAC (0x00000271) – механизм для формирования и проверки имитовставки на основе SHA-512.
    • CKM_CMS_SIG (0x00000500) – механизм для генерации и проверки ЭП в формате CMS.
    • CKM_ECDSA (0x00001041) – механизм для генерации и проверки ЭП по алгоритму ECDSA.
    • CKM_ECDSA_SHA1 (0x00001042) – механизм для генерации и проверки ЭП (ECDSA) с предварительным хэшированием по алгоритму SHA1.
    • CKM_ECDSA_SHA256 (0x00001043) – механизм для генерации и проверки ЭП (ECDSA) с предварительным хэшированием по алгоритму SHA256.
    • CKM_AES_MAC (0x00001083) – механизм для формирования и проверки имитовставки фиксированной длины на основе AES. Ограничение длины выхода – 8 байт.
    • CKM_AES_MAC_GENERAL (0x00001084) – механизм для формирования и проверки имитовставки произвольной длины на основе AES.

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

Результат:
  • 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().

Примеры проверки ЭЦП на языке С:

Криптотокен

// дескриптор сессии
CK_SESSION_HANDLE session = 0;
// механизм для формирования ЭП по ГОСТ Р34.10-2001
CK_MECHANISM mech = { CKM_GOSTR3410, NULL_PTR, 0 };
// дескрипторы открытого ключа
CK_OBJECT_HANDLE handlePub;
// буфер с данными для подписания
CK_BYTE hash[32];
// буфер для результирующей подписи
CK_BYTE signature[64];
// длина буфера для подписи
CK_ULONG signatureLength = sizeof(signature);

// инициализируем проверку подписи
rv = C_VerifyInit(session, &mech, handlePub);
if(rv != CKR_OK)
{
  PrintError("C_VerifyInit", rv);
}

// проверяем подпись
rv = C_Verify(session, hash, sizeof(hash), signature, signatureLength);
if(rv != CKR_OK)
{
  PrintError("C_Verify", rv);
}

Laser

// дескриптор сессии
CK_SESSION_HANDLE session = 0;
// механизм для формирования ЭП
CK_MECHANISM signMech = { CKM_SHA1_RSA_PKCS, NULL_PTR, 0 };
// дескриптор закрытого ключа
CK_OBJECT_HANDLE privKeyHandle = 0;
// буфер для результирующей подписи
std::vector<CK_BYTE> signHolder(1, 0);
// буфер с данными для подписания
std::vector<CK_BYTE> dataToSign(100, 0);
// длина буфера для подписи
CK_ULONG signLen = sizeof(dataToSign);

// инициализируем проверку подписи
rv = C_VerifyInit(session, &signMech, pubKeyHandle);
if(rv != CKR_OK)
{
   PrintError("C_VerifyInit", rv);
}

// проверяем подпись
rv = C_Verify(session, &dataToSign.at(0), dataToSign.size(), &signHolder.at(0), signLen);
if(rv != CKR_OK)
{
   PrintError("C_Verify", rv);
}

Пример проверки ЭЦП на языке 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
}