The CryptVerifyMessageSignature function verifies a signed message's 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);
Declare Function CryptVerifyMessageSignature Lib "crypt32.dll" (TODO) As TODO
None.
None.
Please add some!
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();
}
}
Do you know one? Please contribute it!