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

Функция CryptVerifyMessageSignature проверяет подпись подписанного сообщения.

Эту функцию не следует использовать для проверки подписи отсоединяемого сообщения. Для проверки подписи отсоединяемого сообщения следует использовать функцию CryptVerifyDetachedMessageSignature .

Синтаксис

BOOL CryptVerifyMessageSignature(
  [in]            PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  [in]            DWORD                      dwSignerIndex,
  [in]            const BYTE                 *pbSignedBlob,
  [in]            DWORD                      cbSignedBlob,
  [out]           BYTE                       *pbDecoded,
  [in, out]       DWORD                      *pcbDecoded,
  [out, optional] PCCERT_CONTEXT             *ppSignerCert
);

Параметры

[in] pVerifyPara

Указатель на структуру CRYPT_VERIFY_MESSAGE_PARA , содержащую параметры проверки.

[in] dwSignerIndex

Индекс нужной сигнатуры. Может быть несколько сигнатур. CryptVerifyMessageSignature можно вызывать многократно, при этом dwSignerIndex увеличивается каждый раз. Задайте для этого параметра нулевое значение для первого подписывающего или, если имеется только один подписыватель. Если функция возвращает false, а GetLastError возвращает CRYPT_E_NO_SIGNER, предыдущий вызов обработал последнего подписавшего сообщение.

[in] pbSignedBlob

Указатель на буфер, содержащий подписанное сообщение.

[in] cbSignedBlob

Размер буфера подписанных сообщений (в байтах).

[out] pbDecoded

Указатель на буфер для получения декодированного сообщения.

Этот параметр может иметь значение NULL , если декодированные сообщения не требуются для дополнительной обработки или для задания размера сообщения для целей выделения памяти. Дополнительные сведения см. в разделе Извлечение данных неизвестной длины.

[in, out] pcbDecoded

Указатель на значение DWORD , указывающее размер буфера pbDecoded (в байтах). Когда функция возвращает значение, это значение DWORD содержит размер декодированного сообщения (в байтах). Декодированные сообщения не будут возвращены, если этот параметр имеет значение NULL.

Примечание При обработке возвращаемых данных приложения должны использовать фактический размер возвращаемых данных. Фактический размер может быть немного меньше размера буфера, указанного во входных данных. (На входных данных размеры буфера обычно указываются достаточно большими, чтобы гарантировать, что максимально возможные выходные данные поместятся в буфер.) В выходных данных переменная, на которую указывает этот параметр, обновляется с учетом фактического размера данных, скопированных в буфер.
 

[out, optional] ppSignerCert

Адрес указателя структуры CERT_CONTEXT , который получает сертификат подписывателя. Завершив использование этой структуры, освободите ее, передав указатель на функцию CertFreeCertificateContext . Этот параметр может иметь значение NULL , если сертификат подписывающий не требуется.

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

Если функция выполнена успешно, функция возвращает ненулевое значение. Это не обязательно означает, что подпись была проверена. В случае отсоединяемого сообщения переменная, на которую указывает pcbDecoded , будет содержать ноль. В этом случае эта функция возвращает ненулевое значение, но подпись не проверяется. Чтобы проверить подпись отсоединяемого сообщения, используйте функцию CryptVerifyDetachedMessageSignature .

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

В следующей таблице показаны коды ошибок, наиболее часто возвращаемые функцией GetLastError .

Код возврата Описание
ERROR_MORE_DATA
Если буфер, заданный параметром pbDecoded , недостаточно велик для хранения возвращаемых данных, функция задает код ERROR_MORE_DATA и сохраняет требуемый размер буфера в байтах в переменной, на которую указывает pcbDecoded.
E_INVALIDARG
Недопустимые типы кодирования сообщений и сертификатов. В настоящее время поддерживаются только PKCS_7_ASN_ENCODING и X509_ASN_ENCODING_TYPE. Недопустимый cbSize в *pVerifyPara.
CRYPT_E_UNEXPECTED_MSG_TYPE
Не подписанное криптографическое сообщение.
CRYPT_E_NO_SIGNER
Сообщение не содержит подписывающего или подписывающего для указанного dwSignerIndex.
NTE_BAD_ALGID
Сообщение было хэшировано и подписано с помощью неизвестного или неподдерживаемого алгоритма.
NTE_BAD_SIGNATURE
Подпись сообщения не проверена.
 
Примечание В эту функцию можно распространить ошибки из вызываемых функций CryptCreateHash, CryptHashData, CryptVerifySignature и CryptImportKey .

В случае сбоя функции GetLastError может вернуть ошибку кодирования и декодирования абстрактного синтаксиса (ASN.1). Сведения об этих ошибках см. в разделе Кодирование и декодирование возвращаемых значений ASN.1.

 

Комментарии

Для проверенного подписывателя и сообщения ppSignerCert обновляется CERT_CONTEXT подписывателя. Его необходимо освободить, вызвав CertFreeCertificateContext. В противном случае параметру ppSignerCert присваивается значение NULL.

Для сообщения, содержащего только сертификаты и списки отзыва сертификатов, pcbDecoded имеет значение NULL.

Примеры

Пример использования этой функции см. в разделе Пример программы C. Подписывание сообщения и Проверка подписи сообщения.

Требования

   
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header wincrypt.h
Библиотека Crypt32.lib
DLL Crypt32.dll

См. также раздел

CryptSignMessage

CryptVerifyDetachedMessageSignature

Упрощенные функции сообщений