Поделиться через


Функция CryptVerifySignatureA (wincrypt.h)

Важные этот API не рекомендуется. Новое и существующее программное обеспечение должно начинаться с API следующего поколения шифрования. Корпорация Майкрософт может удалить этот API в будущих выпусках.
 
Функция CryptVerifySignature проверяет подпись объекта хэша .

Перед вызовом этой функции необходимо вызвать CryptCreateHash, чтобы создать дескриптор хэш-объекта. CryptHashData или CryptHashSessionKey затем используется для добавления данных или ключей сеансов в хэш-объект.

После завершения CryptVerifySignature можно вызывать только CryptDeskHash с помощью дескриптора hHash.

Синтаксис

BOOL CryptVerifySignatureA(
  [in] HCRYPTHASH hHash,
  [in] const BYTE *pbSignature,
  [in] DWORD      dwSigLen,
  [in] HCRYPTKEY  hPubKey,
  [in] LPCSTR     szDescription,
  [in] DWORD      dwFlags
);

Параметры

[in] hHash

Дескриптор хэш-объекта для проверки.

[in] pbSignature

Адрес проверяемых данных подписи.

[in] dwSigLen

Количество байтов в pbSignature данных подписи.

[in] hPubKey

Дескриптор открытого ключа для проверки подлинности подписи. Этот открытый ключ должен принадлежать парой ключей , которая изначально использовалась для созданияцифровой подписи .

[in] szDescription

Этот параметр больше не должен использоваться и должен иметь значение NULL для предотвращения уязвимостей безопасности. Однако она по-прежнему поддерживается для обратной совместимости в поставщике шифрования Microsoft Base.

[in] dwFlags

Определены следующие значения флагов.

Ценность Значение
CRYPT_NOHASHOID
0x00000001
Этот флаг используется с поставщиками RSA. При проверке подписи хэш-идентификатор объекта (OID) не должен присутствовать или проверяться. Если этот флаг не задан, хэш-идентификатор OID в сигнатуре по умолчанию проверяется, как указано в определении DigestInfo в PKCS #7.
CRYPT_TYPE2_FORMAT
0x00000002
Этот флаг не используется.
CRYPT_X931_FORMAT
0x00000004
Используйте поддержку X.931 для версии RSA (rDSA) FIPS 186-2.

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

Если функция выполнена успешно, возвращаемое значение TRUE.

Если функция завершается ошибкой, возвращаемое значение FALSE. Для получения расширенных сведений об ошибке вызовите GetLastError.

Коды ошибок, предуставленные NTE, создаются определенным поставщиком служб CSP, который вы используете. Ниже приведены некоторые возможные коды ошибок.

Возвращаемый код Описание
ERROR_INVALID_HANDLE
Один из параметров задает недопустимый дескриптор.
ERROR_INVALID_PARAMETER
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель.
NTE_BAD_FLAGS
Параметр dwFlags ненулево.
NTE_BAD_HASH
Хэш-объект, указанный параметром hHash , недопустим.
NTE_BAD_KEY
Параметр hPubKey не содержит дескриптор допустимого открытого ключа.
NTE_BAD_SIGNATURE
Подпись недействительна. Это может быть связано с тем, что данные изменились, строка описания не совпадала или неправильный открытый ключ был указан hPubKey.

Эта ошибка также может быть возвращена, если алгоритмы хэширования или подписи не соответствуют тем, которые использовались для создания подписи.

NTE_BAD_UID
Контекст поставщика криптографических служб (CSP), указанный при создании хэш-объекта.
NTE_NO_MEMORY
CSP не хватает памяти во время операции.

Замечания

Функция CryptVerifySignature завершает хэш. После этого вызова никакие данные не могут быть добавлены в хэш. Сбой дополнительных вызовов CryptHashData или CryptHashSession Key. После завершения работы приложения с хэшем необходимо вызвать CryptDeskHash, чтобы уничтожить хэш-объект.

Если вы создаете подпись с помощью API .NET Framework и пытаетесь проверить ее с помощью функции CryptVerifySignature, функция завершится ошибкой и GetLastError вернет NTE_BAD_SIGNATURE. Это связано с различными порядками байтов между собственным API Win32 и API .NET Framework.

Api шифрования в собственном коде использует маленький порядок байтов, а API .NET Framework использует порядок байтов больших байтов. Если вы проверяете подпись, созданную с помощью API .NET Framework, перед вызовом функции CryptVerifySignature необходимо заменить порядок байтов подписи.

Примеры

Пример использования функции CryptVerifySignature см. в примере программы C: подписывание хэша и проверка хэш-подписи.

Заметка

Заголовок wincrypt.h определяет CryptVerifySignature как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
целевая платформа Виндоус
заголовка wincrypt.h
библиотеки Advapi32.lib
DLL Advapi32.dll

См. также

CryptCreateHash

CryptDeskHash

CryptHashData

CryptHashSessionKey

CryptSignHash

функции хэша и цифровой подписи