КриптоПро CSP  

CPCVerifySignature

Функция CPCVerifySignature() осуществляет проверку цифровой подписи.

DWORD CPCAPI CPCVerifySignature(
  HCRYPTMODULE hCSP,
  HCRYPTPROV hProv,
  HCRYPTHASH hHash,
  CONST BYTE * pbSignature,
  DWORD dwSigLen,
  HCRYPTKEY hPubKey,
  LPCWSTR sDescription,
  DWORD dwFlags
);

Аргументы

hCSP
[in] Указатель на таблицу функций криптопровайдера. Получается при помощи функции CPCCreateProvider()
hProv
[in] Дескриптор криптопровайдера. Получается при помощи функции CPCAcquireContext().
hHash
[in] Дескриптор объекта функции хэширования, подпись которого проверяется.
Для хэш с алгоритмами CALG_MD5, CALG_SHA1, CALG_SHA_256, CALG_SHA_384, CALG_SHA_512 функция имеет неопределённое поведение.
pbSignature
[in] Указатель на буфер, содержащий значение проверяемой подписи.
dwSigLen
[in] Длина (в байтах) значения подписи.
hPubKey
[in] Дескриптор открытого ключа проверяемой подписи.
sDescription
[in] Описание подписанных данных идентичное описанию, использованному при создании подписи. Это должна быть точно та же самая последовательность, которая использовалась в функции CPCSignHash() при создании подписи. Если эта последовательность не соответствует использованной в функции CPCSignHash(), проверка подписи сообщит, что подпись не верна.
dwFlags
[in] Значения флагов. Параметр зарезервирован для будущего использования и должен быть нулевым.

Возвращаемые значения

При успешном завершении функция возвращает 0 (S_OK), в противном случае возвращается соответствующий код ошибки (см. таблицу).
Коды возвратаОписание
ERROR_INVALID_PARAMETERОдин из параметров содержит некорректное значение. Чаще всего это некорректный указатель.
NTE_BAD_ALGIDДескриптор hHash определяет алгоритм, который этот криптопровайдер не поддерживает.
NTE_BAD_FLAGSdwFlags параметр отличен от нуля.
NTE_BAD_KEYhPubKey параметр содержит дескриптор на недопустимый открытый ключ.
NTE_BAD_HASHДескриптор хэша ошибочен.
NTE_BAD_SIGNATUREПроверка подписи не прошла (могли измениться подписанные данные, или значение подписи, открытый ключ был определён ошибочно параметром hPubKey). Эта ошибка может быть возвращена также, если алгоритмы хэширования или подписи не соответствуют тем, с помощью которых вычислялась подпись.
NTE_NO_MEMORYКриптопровайдер во время операции исчерпал память.
NTE_FAILНарушение целостности ключей в ОЗУ.
RPE_CORRUPT_KEYPAIR_INFOНарушение целостности ключей.
SCARD_E_NO_KEY_CONTAINERПопытка выполнения операции в контексте смарт-карты или токена, а не контейнера.
SCARD_W_SECURITY_VIOLATIONФукции безопасности токена или смарт-карты работают некорректно.
ERROR_PASSWORD_EXPIREDПароль данного носителя истек, необходимо его сменить.
SCARD_E_READ_ONLY_CARDСмарт-карта недоступна для использования из-за ограничений безопасности.

Примечания

Функция CPCVerifySignature выполняет следующие внутренние шаги:

При использовании ключей алгоритма ГОСТ Р 34.10-2001 для проверки электронной подписи необходимо использовать алгоритм хэширования ГОСТ Р 34.11-94.

При использовании ключей алгоритма ГОСТ Р 34.10-2012 длины 256 бит для проверки электронной подписи необходимо использовать алгоритм хэширования ГОСТ Р 34.11-2012 (256 бит).

При использовании ключей алгоритма ГОСТ Р 34.10-2012 длины 512 бит для проверки электронной подписи необходимо использовать алгоритм хэширования ГОСТ Р 34.11-2012 (512 бит).

Использование алгоритмов CALG_MD5, CALG_SHA_256, CALG_SHA_384, CALG_SHA_512 не входит в функционал СКЗИ "КриптоПро CSP 5.0", относящийся к действию сертификата ФСБ.

При необходимости проверки нескольких подписей на одном ключе можно добиться увеличения производительности за счет многопоточной работы. Для этого необходимо выполнить импорт открытого ключа с указанием флага CP_PUBKEY_REUSABLE, после чего можно вызывать функцию CPCVerifySignature() многопоточно с флагом CP_CRYPT_NOKEYWLOCK.

	    
      ...
      // делаем импорт открытого ключа с флагом CP_PUBKEY_REUSABLE
      CPCImportKey(hProv, cdbKey.pbData, cdbKey.cbData, 0, CP_PUBKEY_REUSABLE, &hPubKey);
      // проверяем подпись многопоточно (блокирует ключ на чтение)
      CPCVerifySignature(hProv, hHash, cdbSign.pbData, cdbSign.cbData, hPubKey, NULL, CP_CRYPT_NOKEYWLOCK);
      ...
	
Кроме того организация многопоточной работы функции CPCVerifySignature() возможна в следующих случаях:

Требования:

Ядро AIX: 6/7.
Ядро FreeBSD: 11/12.
Ядро Linux: 2.6.x и выше.
Ядро Solaris: 10/11.
Ядро Windows: 7/8/8.1/10, Server 2008/2008R2/2012/2012R2/2016/2019.

См. также

CPCCreateHash() ,CPCHashData() ,CPCSignHash() ,CPVerifySignature в MS CSP World Wide Web link ,CryptVerifySignature в MS CryptoAPI 2.0 World Wide Web link