win32 console程序
#include "stdafx.h"
#include <malloc.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
/*
Ö¤ÊéÖ÷ÌâÃû
*/
#define SIGNER_NAME L"yangsheng"
#define CERT_STORE_NAME L"MY"
void HandleError(char* s);
int main(int argc, char* argv[])
{
HCERTSTORE hStoreHandle; file://ϵͳ¾ä±ú
file://ҪǩÃûµÄÏûÏ¢
BYTE* pbMessage = (BYTE*)"Need sign message";
//
DWORD cbMessage = strlen((char*)pbMessage)+1;
PCCERT_CONTEXT pSignerCert; file://Ö¸ÏòÇ©ÃûÖ¤ÊéµÄÖ¸Õë
CRYPT_SIGN_MESSAGE_PARA SigParams;
DWORD cbSignedMessageBlob;
BYTE* pbSignedMessageBlob;
const BYTE* MessageArray[] = {pbMessage};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;
file://start sign .....
printf("raw message....\n");
printf("%s\n",pbMessage);
//
if(!(hStoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER, CERT_STORE_NAME)))
{
printf("open cert store failed!");
}
file://Get sign cert pointer
if(pSignerCert = CertFindCertificateInStore(hStoreHandle,MY_TYPE,0,CERT_FIND_SUBJECT_STR,SIGNER_NAME,NULL))
{
printf("find a cert ok.....\n");
}
else
{
printf("cann't look a cert!\n");
}
file://sign struct initialize
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = MY_TYPE;
SigParams.pSigningCert = pSignerCert;
SigParams.HashAlgorithm.pszObjId = szOID_RSA_MD5;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &pSignerCert;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
//
if(CryptSignMessage(&SigParams,FALSE,1,MessageArray,MessageSizeArray,NULL,&cbSignedMessageBlob))
{
printf("sign after size %d\n",cbSignedMessageBlob);
}
//
if(!(pbSignedMessageBlob = (BYTE*)malloc(cbSignedMessageBlob)))
{
printf("alloc failed!\n");
}
//
if(CryptSignMessage(&SigParams,FALSE,1,MessageArray,MessageSizeArray,pbSignedMessageBlob,&cbSignedMessageBlob))
{
printf("sign successful!!\n");
}
/*
verify sign
*/
DWORD cbDecodeMessageBlob;
BYTE* pbDecodeMessageBlob;
CRYPT_VERIFY_MESSAGE_PARA verifyParams;
verifyParams.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
verifyParams.dwMsgAndCertEncodingType = MY_TYPE;
verifyParams.hCryptProv = 0;
verifyParams.pfnGetSignerCertificate = NULL;
verifyParams.pvGetArg = NULL;
if(CryptVerifyMessageSignature(&verifyParams,0,pbSignedMessageBlob,cbSignedMessageBlob,NULL,&cbDecodeMessageBlob,NULL))
{
printf("total buffer%d\n",cbDecodeMessageBlob);
}
if(!(pbDecodeMessageBlob = (BYTE*)malloc(cbDecodeMessageBlob)))
{
printf("alloc failed!\n");
}
if(CryptVerifyMessageSignature(&verifyParams,0,pbSignedMessageBlob,cbSignedMessageBlob,pbDecodeMessageBlob,&cbDecodeMessageBlob,NULL))
{
printf("verify message:\n%s\n",(char*)pbDecodeMessageBlob);
}
/*
some release operation........
*/
if(pbSignedMessageBlob)
free(pbSignedMessageBlob);
if(pbDecodeMessageBlob)
free(pbDecodeMessageBlob);
if(pSignerCert)
CertFreeCertificateContext(pSignerCert);
if(CertCloseStore(hStoreHandle,CERT_CLOSE_STORE_CHECK_FLAG))
{
printf("all release...\n");
}
else
{
printf(".......");
}
return 0;
}