Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.12.2011(UTC) Сообщений: 45 Откуда: Москва
|
Здравствуйте. Помогите пожалуйста! Вроде бы простая задачка. Есть ЭЦП, содержащая соподписи. Создается и проверяется все хорошо. Но вдруг один из подписавшихся решит отозвать свою подпись... Возможно ли "выковырять" его подпись, так чтоб други там остались. Если возможно то как? Спасибо. Соподписи делаю следующим образом: Код:
bool CoSignMessage(PCCERT_CONTEXT *a_CertContext, // Сертификат
CRYPT_DATA_BLOB *pSignedMessageBlob, // уже подписаное сообщение
CRYPT_DATA_BLOB *pCosignedMessageBlob, // результат - соподписаное сообщение
LPSTR sMsg )
{
bool fReturn = false;
PCCERT_CONTEXT pCosignerCert = *a_CertContext;
HCRYPTPROV hCryptProv = NULL;
HCRYPTMSG hMsg = NULL;
DWORD cbCosignedMessageBlob;
BYTE *pbCosignedMessageBlob = NULL;
// Initialize the output pointer.
pCosignedMessageBlob->cbData = 0;
pCosignedMessageBlob->pbData = NULL;
DWORD dwKeySpec;
if(!(CryptAcquireCertificatePrivateKey(
pCosignerCert,
0,
NULL,
&hCryptProv,
&dwKeySpec,
NULL)))
{
MyHandleError(
TEXT("CryptAcquireCertificatePrivateKey failed."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
// Open a message for decoding.
if(!(hMsg = CryptMsgOpenToDecode(
m_Encoding_Type, //MY_ENCODING_TYPE,
0,//CMSG_DETACHED_FLAG,
0,
NULL,
NULL,
NULL)))
{
MyHandleError(TEXT("CryptMsgOpenToDecode failed."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
// Update the message with the encoded BLOB.
if(!(CryptMsgUpdate(
hMsg,
pSignedMessageBlob->pbData,
pSignedMessageBlob->cbData,
TRUE)))
{
MyHandleError(TEXT("CryptMsgUpdate failed."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
// Initialize the CMSG_SIGNER_ENCODE_INFO structure for the
// cosigner.
CMSG_SIGNER_ENCODE_INFO CosignerInfo;
memset(&CosignerInfo, 0, sizeof(CMSG_SIGNER_ENCODE_INFO));
CosignerInfo.cbSize = sizeof(CMSG_SIGNER_ENCODE_INFO);
CosignerInfo.pCertInfo = pCosignerCert->pCertInfo;//*a_pCertContext->pCertInfo;
CosignerInfo.hCryptProv = hCryptProv;
CosignerInfo.dwKeySpec = dwKeySpec;
CosignerInfo.HashAlgorithm.pszObjId = m_HashAlgorithm;//szOID_RSA_SHA1RSA;
// Add the cosigner to the message.
if(CryptMsgControl(
hMsg,
0,
CMSG_CTRL_ADD_SIGNER,
&CosignerInfo))
{
_tprintf(TEXT("CMSG_CTRL_ADD_SIGNER succeeded. \n"));
}
else
{
MyHandleError(TEXT("CMSG_CTRL_ADD_SIGNER failed."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
// Add the cosigner's certificate to the message.
CERT_BLOB CosignCertBlob;
CosignCertBlob.cbData = pCosignerCert->cbCertEncoded;
CosignCertBlob.pbData = pCosignerCert->pbCertEncoded;
if(CryptMsgControl(
hMsg,
0,
CMSG_CTRL_ADD_CERT,
&CosignCertBlob))
{
_tprintf(TEXT("CMSG_CTRL_ADD_CERT succeeded. \n"));
}
else
{
MyHandleError(TEXT("CMSG_CTRL_ADD_CERT failed."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
// Get the size of the cosigned BLOB.
if(CryptMsgGetParam(
hMsg,
CMSG_ENCODED_MESSAGE,
0,
NULL,
&cbCosignedMessageBlob))
{
_tprintf(TEXT("The size for the encoded BLOB is %d.\n"),
cbCosignedMessageBlob);
}
else
{
MyHandleError(TEXT("Sizing of cbSignerInfo failed."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
// Allocate memory for the cosigned BLOB.
if(!(pbCosignedMessageBlob =
(BYTE*)malloc(cbCosignedMessageBlob)))
{
MyHandleError(
TEXT("Memory allocation error while cosigning."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
// Get the cosigned message BLOB.
if(CryptMsgGetParam(
hMsg,
CMSG_ENCODED_MESSAGE,
0,
pbCosignedMessageBlob,
&cbCosignedMessageBlob))
{
_tprintf(TEXT("The message was cosigned successfully. \n"));
// pbSignedMessageBlob now contains the signed BLOB.
fReturn = true;
}
else
{
MyHandleError(TEXT("Sizing of cbSignerInfo failed."));
exit_CosignMessage(hMsg, pbCosignedMessageBlob);
}
if(pbCosignedMessageBlob)
{
pCosignedMessageBlob->cbData = cbCosignedMessageBlob;
pCosignedMessageBlob->pbData = pbCosignedMessageBlob;
}
return fReturn;
}
bool exit_CosignMessage(HCRYPTMSG hMsg, BYTE *pbCosignedMessageBlob = NULL, bool fReturn=false)
{
// Only free the signed message if a failure ocurred.
if(!fReturn)
{
if(hMsg)
{
CryptMsgClose(hMsg);
}
if(pbCosignedMessageBlob)
{
free(pbCosignedMessageBlob);
pbCosignedMessageBlob = NULL;
}
}
return fReturn;
}
|