在windows中,可以直接使用微软提供的crypto库实现PKCS7签名与签名验证。签名接口函数为CryptSignMessage,其接口定义为:
- BOOL WINAPI CryptSignMessage(
- __in PCRYPT_SIGN_MESSAGE_PARA pSignPara,
- __in BOOL fDetachedSignature,
- __in DWORD cToBeSigned,
- __in const BYTE* rgpbToBeSigned[],
- __in DWORD rgcbToBeSigned[],
- __out BYTE* pbSignedBlob,
- __in_out DWORD* pcbSignedBlob
- );
其中,第一个参数为CRYPT_SIGN_MESSAGE_PARA类型,它包含签名过程中一些参数的配置,如签名者证书,证书撤销列表,以及一些授权属性与非授权属性。第二个参数fDetachedSignature用来标识是否发送明文,如果为真,则不发送明文,需在接收方配置明文信息;反之,则发送签名消息的同时发送明文,接收方可从中取出明文。第三、四、五个参数与待签名的明文相关,如果fDetachedSignature为真,则它们都为空;否则,不能为空,第三个参数标识待签名明文的个数,可以有多组明文,第四个参数标识明文串,它是一个指针数组,其中包含每组明文的地址,第五个参数标识每组明文的长度。第六和第七个参数为生成的编码签名串,它是由PKCS7格式转化得到。
验证签名的接口函数有两种,分别为CryptVerifyMessageSignature和CryptVerifyDetachedMessageSignature,前者用来验证包含明文的签名,后者用来验证不包含明文的签名。它们的接口定义分别为:
- BOOL WINAPI 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_opt PCCERT_CONTEXT* ppSignerCert
- );
其中,第一个参数为CRYPT_VERIFY_MESSAGE_PARA类型,它定义了一个获取签名者证书的回调函数,可以设置回调函数为空,默认从签名消息证书库中获取签名者证书。第二个参数dwSignerIndex用来标识签名者索引,因为签名消息可以由多个签名者签名构成,第三和第四个参数为接收到的签名串,第五和第六个参数为解码后得到的明文,第七个参数可以获取签名者证书上下文。
- BOOL WINAPI CryptVerifyDetachedMessageSignature(
- __in PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
- __in DWORD dwSignerIndex,
- __in const BYTE* pbDetachedSignBlob,
- __in DWORD cbDetachedSignBlob,
- __in DWORD cToBeSigned,
- __in const BYTE* rgpbToBeSigned[],
- __in DWORD rgcbToBeSigned[],
- __out_opt PCCERT_CONTEXT* ppSignerCert
- );
其中,第一和第二个参数与上面一致,第三和第四个参数为接收到的签名串,第五、六、七个参数用来标识明文信息,因为在签名串中不包含明文,第八个参数可以获取签名者证书上下文。