CryptVerifyMessageSignature (crypt32)
Last changed: -62.111.226.242

.

The CryptVerifyMessageSignature function verifies a signed message's signature.

C# Signature:

    [DllImport("crypt32.dll", SetLastError=true)]
    static extern bool CryptVerifyMessageSignature(
    ref CRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
    int iReciepmentIndex,
    byte[] pbToBeVerified,
    int cbToBeVerified,
    [ In, Out ] byte[] pbVerifiedBlob,
    ref int pcbVerifiedBlob,
    IntPtr ppx509CertificateContext);

VB Signature:

Declare Function CryptVerifyMessageSignature Lib "crypt32.dll" (TODO) As TODO

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

      public static void VerifyMessage(
     byte[] pbToBeVerified,
     int cbToBeVerified,
     byte[] pbVerifiedBlob,
     ref int pcbVerifiedBlob,
     out X509Certificate x509 )
      {
     CRYPT_VERIFY_MESSAGE_PARA cpMessageParams = new CRYPT_VERIFY_MESSAGE_PARA();
     cpMessageParams.cbSize = 20;
     cpMessageParams.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
     cpMessageParams.hCryptProv = 0;

     GCHandle pCertContext = GCHandle.Alloc( IntPtr.Zero, GCHandleType.Pinned );

     try
     {
        if( !Crypt32.CryptVerifyMessageSignature(
           ref cpMessageParams,
           0,
           pbToBeVerified,
           cbToBeVerified,
           pbVerifiedBlob,
           ref pcbVerifiedBlob,
           pCertContext.AddrOfPinnedObject() ) )
        {
           throw new Exception( "Error while encrypting data." );
        }

        try
        {
           x509 = new X509Certificate( ( IntPtr )pCertContext.Target );
        }
        finally
        {
           Crypt32.CertFreeCertificateContext( ( IntPtr )pCertContext.Target );
        }
     }
     finally
     {
        pCertContext.Free();
     }
      }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation