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,將不會傳回解碼的訊息。

注意 處理傳回的資料時,應用程式必須使用所傳回資料的實際大小。 實際大小可能會稍微小於輸入中指定的緩衝區大小。 (輸入時,緩衝區大小通常會指定夠大,以確保最大可能的輸出資料會符合 buffer。) On 輸出中,此參數所指向的變數會更新,以反映複製到緩衝區的實際資料大小。
 

[out, optional] ppSignerCert

接收簽署者憑證 之CERT_CONTEXT 結構指標的位址。 當您完成使用此結構時,請將此指標傳遞至 CertFreeCertificateCoNtext 函式來釋放它。 如果不需要簽署者的憑證,這個參數可以是 Null

傳回值

如果函式成功,函式會傳回非零。 這不一定表示簽章已驗證。 在中斷連結的訊息案例中, 由其所指向的變數會 包含零。 在此情況下,此函式會傳回非零,但簽章未驗證。 若要驗證中斷連結訊息的簽章,請使用 CryptVerifyDetachedMessageSignature 函式。

如果函式失敗,則會傳回零。 如需擴充的錯誤資訊,請呼叫 GetLastError

下表顯示 GetLastError 函式最常傳回的錯誤碼。

傳回碼 描述
ERROR_MORE_DATA
如果 pbDecoded 參數指定的緩衝區不夠大,無法保存傳回的資料,函式會設定ERROR_MORE_DATA程式碼,並將所需的緩衝區大小以位元組為單位儲存在 由ERROR_MORE_DATA coded指向的變數中。
E_INVALIDARG
不正確訊息和憑證編碼類型。 目前僅支援PKCS_7_ASN_ENCODING和X509_ASN_ENCODING_TYPE。 *pVerifyPara中的cbSize無效。
CRYPT_E_UNEXPECTED_MSG_TYPE
不是已簽署的密碼編譯訊息。
CRYPT_E_NO_SIGNER
訊息沒有指定 dwSignerIndex的任何簽署者或簽署者。
NTE_BAD_ALGID
訊息已使用未知或不支援的演算法進行雜湊處理和簽署。
NTE_BAD_SIGNATURE
未驗證訊息的簽章。
 
注意 來自所呼叫函式 CryptCreateHashCryptHashDataCryptVerifySignatureCryptImportKey 的錯誤可以傳播至此函式。

如果函式失敗, GetLastError 可能會傳回 抽象語法標記法 1 (ASN.1) 編碼/解碼錯誤。 如需這些錯誤的相關資訊,請參閱 ASN.1 編碼/解碼傳回值

 

備註

針對已驗證的簽署者和訊息, ppSignerCert 會更新為簽署者的 CERT_CONTEXT 。 它必須透過呼叫 CertFreeCertificateCoNtext來釋出。 否則, ppSignerCert 會設定為 Null

若為只包含憑證和 CRL的訊息, 則會設定為Null

範例

如需使用此函式的範例,請參閱 範例 C 程式:簽署訊息和驗證訊息簽章

規格需求

   
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限桌面應用程式]
目標平台 Windows
標頭 wincrypt.h
程式庫 Crypt32.lib
Dll Crypt32.dll

另請參閱

CryptSignMessage

CryptVerifyDetachedMessageSignature

簡化的訊息函式